Plugin Directory

Changeset 2210817


Ignore:
Timestamp:
12/12/2019 01:44:34 PM (6 years ago)
Author:
gtanyware
Message:

Version 2.5.5 Fix problem with exit() and memory leak

Location:
easycoder/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • easycoder/trunk/easycoder-min.js

    r2209140 r2210817  
    2828keyword:"append",lino:b,value:c,select:d.name}),!0}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.select);try{var d=a.getValue(b.value),e=["{","["].includes(d[0])?JSON.parse(d):d,f=c.value[c.index],g=f.content;g=g?JSON.parse(g):[];g.push(e);f.content=JSON.stringify(g);return b.pc+1}catch(k){return a.runtimeError(b.lino,"JSON: Unable to parse value"),!1}}},Begin:{compile:function(a){a.next();a.compileFromHere(["end"]);return!0},run:function(a){return a[a.pc].pc+1}},Callback:{compile:function(a){a.compileVariable("core",
    2929"callback");return!0},run:function(a){return a[a.pc].pc+1}},Clear:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolRecord();if(c.isValueHolder)return c=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"clear",lino:b,symbol:c}),!0;a.warning("'Variable '"+c.name+"' does not hold a value")}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.symbol);c.isValueHolder?(a.domain[c.domain].value.put(c,{type:"boolean",content:!1}),b.numeric=!1):a.variableDoesNotHoldAValueError(b.lino,
    30 c.name);return b.pc+1}},Close:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if("module"===c.keyword)return a.next(),a.addCommand({domain:"core",keyword:"close",lino:b,module:c.name}),!0}return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.module).program;a.run(a.onClose);return b.pc+1}},Debug:{compile:function(a){var b=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var c=a.getNextValue();a.addCommand({domain:"core",
    31 keyword:"debug",lino:b,item:c});return!0}a.addCommand({domain:"core",keyword:"debug",lino:b,item:"program"});return!0}return a.tokenIs("symbols")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"symbols"}),!0):a.tokenIs("symbol")?(c=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"symbol",name:c}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"step"}),!0):!1},run:function(a){var b=a[a.pc],c=b.item;switch(c){case "symbols":console.log("Symbols: "+
    32 JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(b.name);c=a.exporter.script;delete a.exporter;console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter.script=c;break;case "step":a.debugStep=!0;break;case "program":console.log("Debug program: "+JSON.stringify(a,null,2));break;default:0<=c.content&&console.log("Debug item "+c.content+": "+JSON.stringify(a[c.content],null,2))}return b.pc+1}},Decode:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getToken();
    33 a.next();a.addCommand({domain:"core",keyword:"decode",lino:b,symbol:c});return!0}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.symbol);if(c.isValueHolder){var d=a.getValue(c.value[c.index]);c.value[c.index]={type:"constant",numeric:!1,content:a.decode(d)};b.numeric=!1}else a.variableDoesNotHoldAValueError(b.lino,c.name);return b.pc+1}},Divide:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbol();var d=a.getCommandAt(c.pc).name}c=a.getValue();a.tokenIs("by")&&
    34 a.next();var e=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return d=a.getSymbol(),d=a.getCommandAt(d.pc).name,a.next(),a.addCommand({domain:"core",keyword:"divide",lino:b,value1:c,value2:e,target:d}),!0;a.warning("core 'divide'': Expected value holder")}else return"undefined"===typeof d&&a.warning("core 'divide': No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:b,value2:e,target:d}),!0;return!1},run:function(a){var b=a[a.pc],c=b.value1,d=b.value2,e=a.getSymbolRecord(b.target);
    35 if(e.isValueHolder){var f=e.value[e.index];c?(a=a.getValue(c)/a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:Math.trunc(a)}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(b,lino),a=parseInt(f.content)/parseInt(a.getValue(d)),e.value[e.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(b.lino,e.name);return b.pc+1}},Dummy:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"core",keyword:"dummy",lino:b});return!0},
    36 run:function(a){return a[a.pc].pc+1}},Encode:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:b,symbol:c});return!0}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.symbol);if(c.isValueHolder){var d=a.getValue(c.value[c.index]);c.value[c.index]={type:"constant",numeric:!1,content:a.encode(d)};b.numeric=!1}else a.variableDoesNotHoldAValueError(b.lino,c.name);return b.pc+1}},End:{compile:function(a){a.next();
    37 return!0},run:function(){return 0}},Exit:{compile:function(a){a.next();a.addCommand({domain:"core",keyword:"exit"});return!0},run:function(a){if(a.parent){var b=EasyCoder.scripts[a.parent];b.run(b.nextPc);b.nextPc=0}a.exit();return 0}},Filter:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if(a.nextTokenIs("with")){var d=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"filter",lino:b,array:c.name,func:d});return!0}}return!1},run:function(a){var b=a[a.pc],
    38 c=a.getSymbolRecord(b.array),d=c.value[c.index].content,e=a.getSymbolRecord(b.func).pc;try{var f=JSON.parse(d).filter(function(b){c.a=b;a.run(e);return c.v});c.value[c.index].content=JSON.stringify(f)}catch(g){a.runtimeError(b.lino,"Can't parse this array")}return b.pc+1}},Fork:{compile:function(a){var b=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:b,label:c});return!0},run:function(a){var b=a[a.pc];try{a.run(a.symbols[b.label].pc)}catch(c){console.log(c.message),
     30c.name);return b.pc+1}},Close:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if("module"===c.keyword)return a.next(),a.addCommand({domain:"core",keyword:"close",lino:b,module:c.name}),!0}return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.module);a=EasyCoder.scripts[a.program];a.run(a.onClose);return b.pc+1}},Debug:{compile:function(a){var b=a.getLino();if(a.nextTokenIs("program")){a.next();if(["item","pc"].includes(a.getToken())){var c=a.getNextValue();
     31a.addCommand({domain:"core",keyword:"debug",lino:b,item:c});return!0}a.addCommand({domain:"core",keyword:"debug",lino:b,item:"program"});return!0}return a.tokenIs("symbols")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"symbols"}),!0):a.tokenIs("symbol")?(c=a.nextToken(),a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"symbol",name:c}),!0):a.tokenIs("step")?(a.next(),a.addCommand({domain:"core",keyword:"debug",lino:b,item:"step"}),!0):!1},run:function(a){var b=
     32a[a.pc],c=b.item;switch(c){case "symbols":console.log("Symbols: "+JSON.stringify(a.symbols,null,2));break;case "symbol":a=a.getSymbolRecord(b.name);c=a.exporter.script;delete a.exporter;console.log("Symbol: "+JSON.stringify(a,null,2));a.exporter.script=c;break;case "step":a.debugStep=!0;break;case "program":console.log("Debug program: "+JSON.stringify(a,null,2));break;default:0<=c.content&&console.log("Debug item "+c.content+": "+JSON.stringify(a[c.content],null,2))}return b.pc+1}},Decode:{compile:function(a){var b=
     33a.getLino();if(a.nextIsSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"decode",lino:b,symbol:c});return!0}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.symbol);if(c.isValueHolder){var d=a.getValue(c.value[c.index]);c.value[c.index]={type:"constant",numeric:!1,content:a.decode(d)};b.numeric=!1}else a.variableDoesNotHoldAValueError(b.lino,c.name);return b.pc+1}},Divide:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbol();var d=a.getCommandAt(c.pc).name}c=
     34a.getValue();a.tokenIs("by")&&a.next();var e=a.getValue();if(a.tokenIs("giving")){a.next();if(a.isSymbol())return d=a.getSymbol(),d=a.getCommandAt(d.pc).name,a.next(),a.addCommand({domain:"core",keyword:"divide",lino:b,value1:c,value2:e,target:d}),!0;a.warning("core 'divide'': Expected value holder")}else return"undefined"===typeof d&&a.warning("core 'divide': No target variable given"),a.addCommand({domain:"core",keyword:"divide",lino:b,value2:e,target:d}),!0;return!1},run:function(a){var b=a[a.pc],
     35c=b.value1,d=b.value2,e=a.getSymbolRecord(b.target);if(e.isValueHolder){var f=e.value[e.index];c?(a=a.getValue(c)/a.getValue(d),e.value[e.index]={type:"constant",numeric:!0,content:Math.trunc(a)}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(b,lino),a=parseInt(f.content)/parseInt(a.getValue(d)),e.value[e.index]={type:"constant",numeric:!0,content:Math.trunc(a)})}else a.variableDoesNotHoldAValueError(b.lino,e.name);return b.pc+1}},Dummy:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"core",
     36keyword:"dummy",lino:b});return!0},run:function(a){return a[a.pc].pc+1}},Encode:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"encode",lino:b,symbol:c});return!0}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.symbol);if(c.isValueHolder){var d=a.getValue(c.value[c.index]);c.value[c.index]={type:"constant",numeric:!1,content:a.encode(d)};b.numeric=!1}else a.variableDoesNotHoldAValueError(b.lino,c.name);
     37return b.pc+1}},End:{compile:function(a){a.next();return!0},run:function(){return 0}},Exit:{compile:function(a){a.next();a.addCommand({domain:"core",keyword:"exit"});return!0},run:function(a){a.exit();return 0}},Filter:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if(a.nextTokenIs("with")){var d=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"filter",lino:b,array:c.name,func:d});return!0}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.array),
     38d=c.value[c.index].content,e=a.getSymbolRecord(b.func).pc;try{var f=JSON.parse(d).filter(function(b){c.a=b;a.run(e);return c.v});c.value[c.index].content=JSON.stringify(f)}catch(g){a.runtimeError(b.lino,"Can't parse this array")}return b.pc+1}},Fork:{compile:function(a){var b=a.getLino();a.next();a.nextTokenIs("to")&&a.next();var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"fork",lino:b,label:c});return!0},run:function(a){var b=a[a.pc];try{a.run(a.symbols[b.label].pc)}catch(c){console.log(c.message),
    3939alert(c.message)}return b.pc+1}},Go:{compile:function(a){var b=a.getLino();a.nextTokenIs("to")&&a.next();var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"go",lino:b,label:c});return!0},run:function(a){var b=a[a.pc];if(b.label){if(a.verifySymbol(b.label)){var c=a.symbols[b.label];if(c)return c.pc}a.runtimeError(b.lino,"Unknown symbol '"+b.label+"'");return 0}return b.goto}},Gosub:{compile:function(a){var b=a.getLino();a.nextTokenIs("to")&&a.next();var c=a.getToken();a.next();a.addCommand({domain:"core",
    4040keyword:"gosub",lino:b,label:c});return!0},run:function(a){var b=a[a.pc];if(a.verifySymbol(b.label))return a.stack.push(a.pc+1),a.symbols[b.label].pc;a.runtimeError(b.lino,"Unknown symbol '"+b.label+"'");return 0}},If:{compile:function(a){var b=a.getLino();a.next();var c=a.condition.compile(a),d=a.getPc();a.addCommand({domain:"core",keyword:"if",lino:b,condition:c});a.compileOne();if(!a.getToken())return a.getCommandAt(d).else=a.getPc(),!0;a.tokenIs("else")?(c=a.getPc(),a.addCommand({domain:"core",
    4141keyword:"goto",lino:b,goto:0}),a.getCommandAt(d).else=a.getPc(),a.next(),a.compileOne(!0),a.getCommandAt(c).goto=a.getPc()):a.getCommandAt(d).else=a.getPc();return!0},run:function(a){var b=a[a.pc];return a.condition.test(a,b.condition)?b.pc+1:b.else}},Import:{compile:function(a){var b=a.imports,c=EasyCoder.scripts[b.caller],d=a.getProgram();if(b.length){b=$jscomp.makeIterator(b);for(var e=b.next();!e.done;e=b.next()){e=c.getSymbolRecord(e.value);var f=a.nextToken(),g=e.keyword;if(f===g){if(f=a.compileVariable(e.domain,
    42 g,!0),f=d[a.getSymbols()[f.name].pc],f.element=e.element,f.exporter=e.exporter?e.exporter:c.script,f.exportedName=e.name,f.extra=e.extra,f.isValueHolder=e.isValueHolder,e.program&&(f.program=e.program),f.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+e.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");}else a.next();return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol(!0)){var c=
     42g,!0),f=d[a.getSymbols()[f.name].pc],f.element=e.element,f.exporter=e.exporter?e.exporter:c.script,f.exportedName=e.name,f.extra=e.extra,f.isValueHolder=e.isValueHolder,e.program&&(f.program=e.program.script),f.imported=!0,!a.tokenIs("and"))break}else throw Error("Mismatched import variable type for '"+e.name+"'");}if(a.tokenIs("and"))throw Error("Imports do not match exports");}else a.next();return!0},run:function(a){return a[a.pc].pc+1}},Index:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol(!0)){var c=
    4343a.getToken();if(a.nextTokenIs("to")){var d=a.getNextValue();a.addCommand({domain:"core",keyword:"index",lino:b,symbol:c,value:d});return!0}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.symbol),d=a.getValue(b.value);d>=c.elements&&a.runtimeError(b.lino,"Array index "+d+" is out of range for '"+c.name+"'");c.index=d;c.imported&&(EasyCoder.symbols[c.exporter].getSymbolRecord(c.exportedName).index=d);return b.pc+1}},Load:{compile:function(a){var b=a.getLino();switch(a.nextToken()){case "plugin":var c=
    4444a.getNextValue();a.addCommand({domain:"core",keyword:"load",lino:b,name:c});return!0}return!1},run:function(a){var b=a[a.pc],c=a.getValue(b.name);switch(b.keyword){case "load":if(a.checkPlugin(c))return b.pc+1;EasyCoder_Plugins.getLocalPlugin(a.getPluginsPath,c,a.getPlugin,a.addLocalPlugin,function(){a.run(b.pc+1)});return 0}}},Module:{compile:function(a){a.compileVariable("core","module");return!0},run:function(a){return a[a.pc].pc+1}},Multiply:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=
     
    5050"'")}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.target);c.isValueHolder||a.variableDoesNotHoldAValueError(b.lino,c.name);a=a.evaluate(b.value);c.value[c.index]={type:a.type,numeric:a.numeric,content:a.content};c.imported&&(c=EasyCoder.scripts[c.exporter].getSymbolRecord(c.exportedName),c.value[c.index]=a);return b.pc+1}},Replace:{compile:function(a){var b=a.getLino(),c=a.getNextValue();if(a.tokenIs("with")){var d=a.getNextValue();if(a.tokenIs("in")&&a.nextIsSymbol()){var e=a.getSymbolRecord();
    5151if(e.isValueHolder)return a.next(),a.addCommand({domain:"core",keyword:"replace",lino:b,original:c,replacement:d,target:e.name}),!0;throw Error("'"+e.name+"' does not hold a value");}}return!1},run:function(a){var b=a[a.pc],c=a.getValue(b.original),d=a.getValue(b.replacement),e=a.getSymbolRecord(b.target);a=a.getValue(e.value[e.index]).split(c).join(d);e.value[e.index]={type:"constant",numeric:!1,content:a};return b.pc+1}},Require:{compile:function(a){var b=a.getLino(),c=a.nextToken();if(["css","js"].includes(c)){var d=
    52 a.getNextValue();a.addCommand({domain:"core",keyword:"require",lino:b,type:c,url:d});return!0}throw Error("File type must be 'css' or 'js'");},run:function(a){var b=a[a.pc];a.require(b.type,a.getValue(b.url),function(){a.run(b.pc+1)});return 0}},Return:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return",lino:b});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var b=a.getLino(),c=a.getNextValue(),d=a.getProgram(),e=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var f=
    53 a.getSymbolRecord();e.push(f.name);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){var g=a.getSymbolRecord();g.program=d;a.next();if("module"!==g.keyword)throw Error("'"+g.name+"' is not a module");g=g.name}f=!1;a.tokenIs("nowait")&&(a.next(),f=!0);d=a.getPc();a.addCommand({domain:"core",keyword:"run",lino:b,script:c,imports:e,module:g,nowait:f,then:0});a.tokenIs("then")&&(b=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(d).then=a.getPc(),
    54 a.next(),a.compileOne(!0),a.addCommand({domain:"core",keyword:"stop"}),a.getCommandAt(b).goto=a.getPc());return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize",lino:b,name:c});return!0}return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return b.pc+1}},Script:{compile:function(a){var b=
     52a.getNextValue();a.addCommand({domain:"core",keyword:"require",lino:b,type:c,url:d});return!0}throw Error("File type must be 'css' or 'js'");},run:function(a){var b=a[a.pc];a.require(b.type,a.getValue(b.url),function(){a.run(b.pc+1)});return 0}},Return:{compile:function(a){var b=a.getLino();a.next();a.addCommand({domain:"core",keyword:"return",lino:b});return!0},run:function(a){return a.stack.pop()}},Run:{compile:function(a){var b=a.getLino(),c=a.getNextValue(),d=[];if(a.tokenIs("with"))for(;;)if(a.nextIsSymbol(!0)){var e=
     53a.getSymbolRecord();d.push(e.name);a.next();if(!a.tokenIs("and"))break}if(a.tokenIs("as")&&a.nextIsSymbol(!0)){var f=a.getSymbolRecord();a.next();if("module"!==f.keyword)throw Error("'"+f.name+"' is not a module");f=f.name}var g=!1;a.tokenIs("nowait")&&(a.next(),g=!0);e=a.getPc();a.addCommand({domain:"core",keyword:"run",lino:b,script:c,imports:d,module:f,nowait:g,then:0});a.tokenIs("then")&&(b=a.getPc(),a.addCommand({domain:"core",keyword:"goto",goto:0}),a.getCommandAt(e).then=a.getPc(),a.next(),
     54a.compileOne(!0),a.addCommand({domain:"core",keyword:"stop"}),a.getCommandAt(b).goto=a.getPc());return!0},run:function(a){a.nextPc=a.pc+1;a.runScript(a);return 0}},Sanitize:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getToken();a.next();a.addCommand({domain:"core",keyword:"sanitize",lino:b,name:c});return!0}return!1},run:function(a){var b=a[a.pc];a=a.getSymbolRecord(b.name);a=a.value[a.index];a.content=JSON.stringify(JSON.parse(a.content));return b.pc+1}},Script:{compile:function(a){var b=
    5555a.getProgram();b.script=a.nextToken();if(EasyCoder.scripts[b.script])throw Error("Script '"+b.script+"' is already running.");EasyCoder.scripts[b.script]=b;a.next();return!0},run:function(a){return a[a.pc].pc+1}},Send:{compile:function(a){var b=a.getLino(),c="";a.nextTokenIs("to")||(c=a.getValue());if(a.tokenIs("to")){if(a.nextTokenIs("parent"))var d="parent";else if(a.isSymbol){d=a.getSymbolRecord();if("module"!==d.keyword)throw Error("'"+d.name+"' is not a module");d=d.name}a.next();a.addCommand({domain:"core",
    56 keyword:"send",lino:b,message:c,recipient:d})}return!0},run:function(a){var b=a[a.pc],c=a.getValue(b.message);"parent"===b.recipient?a.parent&&(a=EasyCoder.scripts[a.parent],a.onMessage&&(a.message=c,a.run(a.onMessage))):(a=a.getSymbolRecord(b.recipient),a.program&&(a.program.message=c,a.program.run(a.program.onMessage)));return b.pc+1}},Set:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if(!c.isValueHolder)return!1;if(a.nextTokenIs("to")){a.next();for(var d=
     56keyword:"send",lino:b,message:c,recipient:d})}return!0},run:function(a){var b=a[a.pc],c=a.getValue(b.message);"parent"===b.recipient?a.parent&&(a=EasyCoder.scripts[a.parent],a.onMessage&&(a.message=c,a.run(a.onMessage))):(a=a.getSymbolRecord(b.recipient),a.program&&(a=EasyCoder.scripts[a.program],a.message=c,a.run(a.onMessage)));return b.pc+1}},Set:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if(!c.isValueHolder)return!1;if(a.nextTokenIs("to")){a.next();for(var d=
    5757[];;){a.mark();try{d.push(a.getValue())}catch(f){a.rewind();break}}a.addCommand({domain:"core",keyword:"set",lino:b,request:"setArray",target:c.name,value:d});return!0}a.addCommand({domain:"core",keyword:"set",lino:b,request:"setBoolean",target:c.name});return!0}switch(a.getToken()){case "ready":return a.next(),a.addCommand({domain:"core",keyword:"set",lino:b,request:"setReady"}),!0;case "element":c=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword&&
    5858a.nextTokenIs("to"))){var e=a.getNextValue();a.addCommand({domain:"core",keyword:"set",lino:b,request:"setElement",target:d.name,index:c,value:e});return!0}break;case "property":c=a.getNextValue();if(a.tokenIs("of")&&a.nextIsSymbol()&&(d=a.getSymbolRecord(),"variable"===d.keyword&&a.nextTokenIs("to")))return e=a.getNextValue(),a.addCommand({domain:"core",keyword:"set",lino:b,request:"setProperty",target:d.name,name:c,value:e}),!0;break;case "arg":if(c=a.getNextValue(),a.tokenIs("of")&&a.nextIsSymbol()&&
     
    64641}},Sort:{compile:function(a){var b=a.getLino();if(a.nextIsSymbol()){var c=a.getSymbolRecord();if(a.nextTokenIs("with")){var d=a.nextToken();a.next();a.addCommand({domain:"core",keyword:"sort",lino:b,array:c.name,func:d});return!0}}return!1},run:function(a){var b=a[a.pc],c=a.getSymbolRecord(b.array),d=c.value[c.index].content,e=a.getSymbolRecord(b.func).pc;try{var f=JSON.parse(d);f.sort(function(b,d){c.a=b;c.b=d;a.run(e);return c.v});c.value[c.index].content=JSON.stringify(f)}catch(g){a.runtimeError(b.lino,
    6565"Can't parse this array")}return b.pc+1}},Split:{compile:function(a){var b=a.getLino();item=a.getNextValue();var c="\n";a.tokenIs("on")&&(c=a.getNextValue());if(["giving","into"].includes(a.getToken())&&a.nextIsSymbol()){var d=a.getSymbolRecord();if("variable"===d.keyword)return a.next(),a.addCommand({domain:"core",keyword:"split",lino:b,item:item,on:c,target:d.name}),!0}return!1},run:function(a){var b=a[a.pc],c=a.getValue(b.item),d=a.getValue(b.on);c=c.split(d);d=c.length;targetRecord=a.getSymbolRecord(b.target);
    66 targetRecord.elements=d;for(a=0;a<d;a++)targetRecord.value[a]={type:"constant",numeric:!1,content:c[a]};targetRecord.index=0;return b.pc+1}},Stop:{compile:function(a){var b=a.getLino();a.next();if(a.more()&&a.isSymbol()&&!a.getToken().endsWith(":")){var c=a.getSymbolRecord();return"module"===c.keyword?(a.next(),a.addCommand({domain:"core",keyword:"stop",lino:b,name:c.name}),!0):!1}a.addCommand({domain:"core",keyword:"stop",lino:b,next:0});return!0},run:function(a){var b=a[a.pc];if(b.name)a.getSymbolRecord(b.name).program.exit();
    67 else return 0;return b.pc+1}},Take:{compile:function(a){var b=a.getLino();a.next();var c=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:b,value1:c,value2:d,target:e})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:b,value1:c,target:d});return!0}a.warning("core 'take'': Expected value holder")}else{d=
     66targetRecord.elements=d;for(a=0;a<d;a++)targetRecord.value[a]={type:"constant",numeric:!1,content:c[a]};targetRecord.index=0;return b.pc+1}},Stop:{compile:function(a){var b=a.getLino();a.next();if(a.more()&&a.isSymbol()&&!a.getToken().endsWith(":")){var c=a.getSymbolRecord();return"module"===c.keyword?(a.next(),a.addCommand({domain:"core",keyword:"stop",lino:b,name:c.name}),!0):!1}a.addCommand({domain:"core",keyword:"stop",lino:b,next:0});return!0},run:function(a){var b=a[a.pc];if(b.name)a=a.getSymbolRecord(b.name),
     67EasyCoder.scripts[a.program].exit();else return 0;return b.pc+1}},Take:{compile:function(a){var b=a.getLino();a.next();var c=a.getValue();if(a.tokenIs("from"))if(a.next(),a.isSymbol()){var d=a.getSymbol();if(a.getCommandAt(d.pc).isValueHolder){if("giving"===a.peek()){d=a.getValue();a.next();var e=a.getToken();a.next();a.addCommand({domain:"core",keyword:"take",lino:b,value1:c,value2:d,target:e})}else d=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:b,value1:c,target:d});return!0}a.warning("core 'take'': Expected value holder")}else{d=
    6868a.getValue();if(a.tokenIs("giving"))return a.next(),e=a.getToken(),a.next(),a.addCommand({domain:"core",keyword:"take",lino:b,value1:c,value2:d,target:e}),!0;a.warning("core 'take'': Expected \"giving\"")}return!1},run:function(a){var b=a[a.pc],c=b.value1,d=b.value2,e=a.getSymbolRecord(b.target);if(e.isValueHolder){var f=e.value[e.index];d?(a=a.getValue(d)-a.getValue(c),e.value[e.index]={type:"constant",numeric:!0,content:a}):(!f.numeric&&isNaN(f.content)&&a.nonNumericValueError(b.lino),a=parseInt(a.getValue(f))-
    6969parseInt(a.getValue(c)),e.value[e.index]={type:"constant",numeric:!0,content:a})}else a.variableDoesNotHoldAValueError(b.lino,e.name);return b.pc+1}},Toggle:{compile:function(a){var b=a.getLino();a.next();if(a.isSymbol()){var c=a.getSymbolPc();a.next();a.addCommand({domain:"core",keyword:"toggle",lino:b,symbol:c});return!0}return!1},run:function(a){var b=a[a.pc],c=a[b.symbol];if(c.isValueHolder){var d=a.domain[c.domain];a=d.value.get(a,c.value[c.index]).content;d.value.put(c,{type:"boolean",content:!a})}else a.variableDoesNotHoldAValueError(b.lino,
    7070c.name);return b.pc+1}},Variable:{compile:function(a){a.compileVariable("core","variable",!0);return!0},run:function(a){return a[a.pc].pc+1}},Wait:{compile:function(a){var b=a.getLino();a.next();var c=a.getValue(a),d=1E3;switch(a.getToken()){case "milli":case "millis":a.next();d=1;break;case "tick":case "ticks":a.next();d=10;break;case "second":case "seconds":a.next();d=1E3;break;case "minute":case "minutes":a.next(),d=6E4}a.addCommand({domain:"core",keyword:"wait",lino:b,value:c,multiplier:d});return!0},
    71 run:function(a){var b=a[a.pc],c=a.getValue(b.value);setTimeout(function(){a.run(b.pc+1)},c*b.multiplier);return 0}},While:{compile:function(a){var b=a.getLino();a.next();var c=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:b,condition:c});b=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(b).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?
     71run:function(a){var b=a[a.pc],c=a.getValue(b.value);setTimeout(function(){a.run&&a.run(b.pc+1)},c*b.multiplier);return 0}},While:{compile:function(a){var b=a.getLino();a.next();var c=a.getCondition(),d=a.getPc();a.addCommand({domain:"core",keyword:"while",lino:b,condition:c});b=a.getPc();a.addCommand({domain:"core",keyword:"goto",goto:0});a.compileOne();a.addCommand({domain:"core",keyword:"goto",goto:d});a.getCommandAt(b).goto=a.getPc();return!0},run:function(a){return a.condition.test(a,a[a.pc].condition)?
    7272a.pc+2:a.pc+1}},getHandler:function(a){switch(a){case "add":return EasyCoder_Core.Add;case "alias":return EasyCoder_Core.Alias;case "append":return EasyCoder_Core.Append;case "begin":return EasyCoder_Core.Begin;case "callback":return EasyCoder_Core.Callback;case "clear":return EasyCoder_Core.Clear;case "close":return EasyCoder_Core.Close;case "debug":return EasyCoder_Core.Debug;case "decode":return EasyCoder_Core.Decode;case "divide":return EasyCoder_Core.Divide;case "dummy":return EasyCoder_Core.Dummy;
    7373case "encode":return EasyCoder_Core.Encode;case "end":return EasyCoder_Core.End;case "exit":return EasyCoder_Core.Exit;case "filter":return EasyCoder_Core.Filter;case "fork":return EasyCoder_Core.Fork;case "go":case "goto":return EasyCoder_Core.Go;case "gosub":return EasyCoder_Core.Gosub;case "if":return EasyCoder_Core.If;case "import":return EasyCoder_Core.Import;case "index":return EasyCoder_Core.Index;case "load":return EasyCoder_Core.Load;case "module":return EasyCoder_Core.Module;case "multiply":return EasyCoder_Core.Multiply;
     
    102102f.domain=this.domain;f.imports=b;b=EasyCoder_Compiler.compile(e);this.compiling=!1;b.EasyCoder=this;b.value=EasyCoder_Value;b.condition=EasyCoder_Condition;b.compare=EasyCoder_Compare;b.source=a;b.run=this.run;b.exit=this.exit;b.runScript=this.runScript;b.evaluate=this.evaluate;b.getValue=this.getValue;b.getFormattedValue=this.getFormattedValue;b.getSimpleValue=this.getSimpleValue;b.encode=this.encode;b.decode=this.decode;b.domain=this.domain;b.require=this.require;b.isUndefined=this.isUndefined;
    103103b.checkPlugin=this.checkPlugin;b.getPlugin=this.getPlugin;b.addLocalPlugin=this.addLocalPlugin;b.getPluginsPath=this.getPluginsPath;b.getSymbolRecord=this.getSymbolRecord;b.verifySymbol=this.verifySymbol;b.runtimeError=this.runtimeError;b.nonNumericValueError=this.nonNumericValueError;b.variableDoesNotHoldAValueError=this.variableDoesNotHoldAValueError;b.reportError=this.reportError;b.register=this.register;b.symbols=f.getSymbols();b.encoding="ec";b.popups=[];b.stack=[];b.queue=[0];b.module=c;b.parent=
    104 d;c&&(c.program=b);return b},tokeniseFile:function(a){var b=[],c=[],d=0;a.forEach(function(a,f){b.push({lino:f+1,line:a});for(var e=a.length,k="",h=!0,l=0;l<e;l++){var n=a[l];if(0==n.trim().length)h||(c.push({index:d,lino:f+1,token:k}),d++,k="",h=!0);else if(h=!1,"`"===n){for(m=l;++l<a.length&&"`"!==a[l];);k=a.substr(m,l-m+1)}else if("!"==n)break;else k+=n}0<k.length&&c.push({index:d,lino:f+1,token:k})});return{scriptLines:b,tokens:c}},tokeniseAndCompile:function(a,b,c,d,e){var f=null,g=Date.now();
    105 a=this.tokeniseFile(a);try{f=this.compileScript(a,b,c,d);this.scriptIndex++;f.script||(f.script=this.scriptIndex);var k=Date.now();console.log(k-this.timestamp+" ms: Compiled "+(f.script+": "+a.scriptLines.length+" lines ("+a.tokens.length+" tokens) in ")+(k-g+" ms"))}catch(h){"stop"!==h.message&&(this.reportError(h,d,a),d&&d.onError&&d.run(d.onError))}f&&(f.onExit=e,f.running=!0,EasyCoder_Run.run(f,0))},tokenise:function(a){var b=a.split("\n");if(!this.tokenising){try{this.tokeniseAndCompile(b)}catch(c){this.reportError(c,
    106 null,a)}this.tokenising=!0}},setPluginCount:function(a){EasyCoder.plugins=[];EasyCoder.pluginCount=a},checkPlugin:function(a){return EasyCoder.domain[a]},getPlugin:function(a,b,c){EasyCoder.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b+"?ver="+EasyCoder.version,a.onload=function(){console.log(Date.now()-EasyCoder.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},addGlobalPlugin:function(a,b){EasyCoder.plugins.push({name:a,handler:b});EasyCoder.plugins.length===
    107 EasyCoder.pluginCount&&(EasyCoder.plugins.forEach(function(a){EasyCoder.domain[a.name]=a.handler}),EasyCoder.tokenise(EasyCoder.source))},addLocalPlugin:function(a,b,c){EasyCoder.domain[a]=b;c()},getPluginsPath:function(){return EasyCoder.pluginsPath},loadPluginJs:function(a){var b=this;console.log(Date.now()-this.timestamp+" ms: Load "+a+"/easycoder/plugins.js");var c=document.createElement("script");c.src=""+window.location.origin+a+"/easycoder/plugins.js?ver="+this.version;c.type="text/javascript";
    108 c.onload=function(){EasyCoder_Plugins.getGlobalPlugins(b.timestamp,a,b.setPluginCount,b.getPlugin,b.addGlobalPlugin)};c.onerror=function(){a?b.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):b.reportError({message:"Can't load plugins.js"},b.program,b.source)};document.head.appendChild(c);this.pluginsPath=a},start:function(a){this.source=a;this.scriptIndex=0;a=window.location.pathname;a=a.endsWith("/")?a.slice(0,-1):"";"undefined"===typeof EasyCoder_Plugins?this.loadPluginJs(a):(this.pluginsPath=a,EasyCoder_Plugins.getGlobalPlugins(this.timestamp,
    109 a,this.setPluginCount,this.getPlugin,this.addGlobalPlugin))}},EasyCoder_Run={name:"EasyCoder_Run",run:function(a,b){var c=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(b);else for(a.register(a),c.push(b);0<c.length;)for(a.pc=c.shift(),a.watchdog=0,b={};a.running;){if(1E6<a.watchdog){a.lino=a[a.pc].lino;a.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",
    110 a),a);break}a.watchdog++;var e=a[a.pc].domain;a.debugStep&&console.log(a.script+": Line "+a[a.pc].lino+": PC: "+a.pc+" "+e+":"+a[a.pc].keyword);var f=a.domain[e];if(!f){a.runtimeError(a[a.pc].lino,"Unknown domain '"+e+"'");break}a.pc=f.run(a);if(!a.pc)break;if(a.stop){a.tracing=!1;break}if(a.tracing){e=a[a.pc];f=a.source.scriptLines;var g=d(f),k=document.getElementById("easycoder-tracer");if(!k){a.runtimeError(e.lino,"Element 'easycoder-tracer' was not found");return}k.style.display="block";k.style.visibility=
    111 "visible";var h="";if(a.tracer){if(k=document.getElementById("easycoder-tracer-content")){a.tracer.variables.forEach(function(b,c,d){var e=a.getSymbolRecord(b);if(1<e.elements)for(h+=b+": "+e.index+"/"+e.elements+": ",b=0;b<e.elements;b++){var f=e.value[b];h=f?h+(f.content+" "):h+"undefined "}else h=(e=e.value[e.index])?h+(b+": "+e.content):h+(b+": undefined");switch(a.tracer.alignment){case "horizontal":c<d.length-1&&(h+=", ");break;case "vertical":h+="<br>"}});h+="<hr>";for(var l="",n=5;0<n;n--){if(e.lino){var q=
    112 f[e.lino-n].line.substr(g);l+='<input type="text" name="'+n+'"value="'+(e.lino-n+1+": "+q.split("\\s").join(" ")+'"style="width:100%;border:none;enabled:false">')}l+="<br>"}k.innerHTML=h+" "+l;k.style.display="block";b.$jscomp$loop$prop$run$66=document.getElementById("easycoder-run-button");b.$jscomp$loop$prop$step$67=document.getElementById("easycoder-step-button");b.$jscomp$loop$prop$run$66.onclick=function(b){return function(){b.$jscomp$loop$prop$run$66.blur();a.tracing=!1;document.getElementById("easycoder-tracer-content").style.display=
    113 "none";try{EasyCoder_Run.run(a,a.resume)}catch(p){var c="Error in run handler: "+p.message;console.log(c);alert(c)}}}(b);b.$jscomp$loop$prop$step$67.onclick=function(b){return function(){console.log("step");b.$jscomp$loop$prop$step$67.blur();a.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{a.run(a.resume)}catch(p){var c="Error in step handler: "+p.message;console.log(c);alert(c)}}}(b)}a.resume=a.pc;a.pc=0}break}b={$jscomp$loop$prop$run$66:b.$jscomp$loop$prop$run$66,
    114 $jscomp$loop$prop$step$67:b.$jscomp$loop$prop$step$67}}},exit:function(a){a.onExit&&(a.un(a.onExit),delete EasyCoder.scripts[a.script],a.module.program=null,a.running=!1)}},EasyCoder_Value={name:"EasyCoder_Value",getItem:function(a){var b=a.getToken();if(!b)return null;if("true"===b)return a.next(),{type:"boolean",content:!0};if("false"===b)return a.next(),{type:"boolean",content:!1};if("`"===b.charAt(0))return a.next(),{type:"constant",numeric:!1,content:b.substring(1,b.length-1)};if(b.charAt(0).match(/[0-9-]/)){var c=
    115 eval(b);if(Number.isInteger(c))return a.next(),{type:"constant",numeric:!0,content:c};throw Error("'"+b+"' is not an integer");}b=a.getIndex();c=$jscomp.makeIterator(Object.keys(a.domain));for(var d=c.next();!d.done;d=c.next())if(d=d.value,a.rewindTo(b),d=a.domain[d].value.compile(a))return d;return null},compile:function(a){var b=a.getToken(),c=EasyCoder_Value.getItem(a);if(!c)throw Error("Undefined value: '"+b+"'");if("cat"===a.getToken()){for(b={type:"cat",numeric:!1,parts:[c]};a.tokenIs("cat");)a.next(),
    116 b.parts.push(a.value.getItem(a));return b}return c},doValue:function(a,b){if("undefined"===typeof b.type)return a.runtimeError(a[a.pc].lino,"Undefined value (variable not initialized?)"),null;switch(b.type){case "cat":return{type:"constant",numeric:!1,content:b.parts.reduce(function(b,c){return b+EasyCoder_Value.doValue(a,c).content},"")};case "boolean":case "constant":return b;case "symbol":var c=a.getSymbolRecord(b.name);if(c.isValueHolder){if(b=c.value[c.index]){c=b.content;if(null===c||"undefined"===
    117 typeof c)b.content=b.numeric?0:"";return b}return null}return a.domain[c.domain].value.get(a,b)}return a.domain[b.domain].value.get(a,b)},constant:function(a,b){return{type:"constant",numeric:b,content:a}},evaluate:function(a,b){if(!b)return{type:"constant",numeric:!1,content:""};var c=EasyCoder_Value.doValue(a,b);if(c)return c;a.runtimeError(a[a.pc].lino,"Can't decode value: "+b)},getValue:function(a,b){return EasyCoder_Value.evaluate(a,b).content},encode:function(a,b){if(a)switch(b){case "ec":return a.replace(/'/g,
    118 "~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(a.replace(/\s/g,"+"));case "sanitize":return a.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return a},decode:function(a,b){if(a)switch(b){case "ec":return a.replace(/~dq~/g,'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(a).replace(/\+/g," ")}return a}};EasyCoder.version="2.5.4";EasyCoder.timestamp=Date.now();console.log("EasyCoder loaded; waiting for page");
     104d;c&&(c.program=b.script);return b},tokeniseFile:function(a){var b=[],c=[],d=0;a.forEach(function(a,f){b.push({lino:f+1,line:a});for(var e=a.length,k="",h=!0,l=0;l<e;l++){var n=a[l];if(0==n.trim().length)h||(c.push({index:d,lino:f+1,token:k}),d++,k="",h=!0);else if(h=!1,"`"===n){for(m=l;++l<a.length&&"`"!==a[l];);k=a.substr(m,l-m+1)}else if("!"==n)break;else k+=n}0<k.length&&c.push({index:d,lino:f+1,token:k})});return{scriptLines:b,tokens:c}},tokeniseAndCompile:function(a,b,c,d,e){var f=null,g=Date.now();
     105a=this.tokeniseFile(a);try{f=this.compileScript(a,b,c,d);this.scriptIndex++;f.script||(f.script=this.scriptIndex);var k=Date.now();console.log(k-this.timestamp+" ms: Compiled "+(f.script+": "+a.scriptLines.length+" lines ("+a.tokens.length+" tokens) in ")+(k-g+" ms"))}catch(h){"stop"!==h.message&&(this.reportError(h,d,a),d&&d.onError&&d.run(d.onError))}f&&(EasyCoder.scripts[f.script]=f,c&&(c.program=f.script),f.afterExit=e,f.running=!0,EasyCoder_Run.run(f,0))},tokenise:function(a){var b=a.split("\n");
     106if(!this.tokenising){try{this.tokeniseAndCompile(b)}catch(c){this.reportError(c,null,a)}this.tokenising=!0}},setPluginCount:function(a){EasyCoder.plugins=[];EasyCoder.pluginCount=a},checkPlugin:function(a){return EasyCoder.domain[a]},getPlugin:function(a,b,c){EasyCoder.domain[a]?c():(a=document.createElement("script"),a.type="text/javascript",a.src=b+"?ver="+EasyCoder.version,a.onload=function(){console.log(Date.now()-EasyCoder.timestamp+" ms: Plugin "+b+" loaded");c()},document.head.appendChild(a))},
     107addGlobalPlugin:function(a,b){EasyCoder.plugins.push({name:a,handler:b});EasyCoder.plugins.length===EasyCoder.pluginCount&&(EasyCoder.plugins.forEach(function(a){EasyCoder.domain[a.name]=a.handler}),EasyCoder.tokenise(EasyCoder.source))},addLocalPlugin:function(a,b,c){EasyCoder.domain[a]=b;c()},getPluginsPath:function(){return EasyCoder.pluginsPath},loadPluginJs:function(a){var b=this;console.log(Date.now()-this.timestamp+" ms: Load "+a+"/easycoder/plugins.js");var c=document.createElement("script");
     108c.src=""+window.location.origin+a+"/easycoder/plugins.js?ver="+this.version;c.type="text/javascript";c.onload=function(){EasyCoder_Plugins.getGlobalPlugins(b.timestamp,a,b.setPluginCount,b.getPlugin,b.addGlobalPlugin)};c.onerror=function(){a?b.loadPluginJs(a.slice(0,a.lastIndexOf("/"))):b.reportError({message:"Can't load plugins.js"},b.program,b.source)};document.head.appendChild(c);this.pluginsPath=a},start:function(a){this.source=a;this.scriptIndex=0;a=window.location.pathname;a=a.endsWith("/")?
     109a.slice(0,-1):"";"undefined"===typeof EasyCoder_Plugins?this.loadPluginJs(a):(this.pluginsPath=a,EasyCoder_Plugins.getGlobalPlugins(this.timestamp,a,this.setPluginCount,this.getPlugin,this.addGlobalPlugin))}},EasyCoder_Run={name:"EasyCoder_Run",run:function(a,b){var c=[],d=function(a){var b=9999;a.forEach(function(a){a=a.line;for(var c=0;c<a.length&&" "===a[c];)c++;0<c&&c<b&&(b=c)});return 0};if(c.length)c.push(b);else for(a.register(a),c.push(b);0<c.length;)for(a.pc=c.shift(),a.watchdog=0,b={};a.running;){if(1E6<
     110a.watchdog){a.lino=a[a.pc].lino;a.reportError(Error("Program runaway intercepted.\nHave you forgotten to increment a loop counter?",a),a);break}a.watchdog++;var e=a[a.pc].domain;a.debugStep&&console.log(a.script+": Line "+a[a.pc].lino+": PC: "+a.pc+" "+e+":"+a[a.pc].keyword);var f=a.domain[e];if(!f){a.runtimeError(a[a.pc].lino,"Unknown domain '"+e+"'");break}a.pc=f.run(a);if(!a.pc)break;if(a.stop){a.tracing=!1;break}if(a.tracing){e=a[a.pc];f=a.source.scriptLines;var g=d(f),k=document.getElementById("easycoder-tracer");
     111if(!k){a.runtimeError(e.lino,"Element 'easycoder-tracer' was not found");return}k.style.display="block";k.style.visibility="visible";var h="";if(a.tracer){if(k=document.getElementById("easycoder-tracer-content")){a.tracer.variables.forEach(function(b,c,d){var e=a.getSymbolRecord(b);if(1<e.elements)for(h+=b+": "+e.index+"/"+e.elements+": ",b=0;b<e.elements;b++){var f=e.value[b];h=f?h+(f.content+" "):h+"undefined "}else h=(e=e.value[e.index])?h+(b+": "+e.content):h+(b+": undefined");switch(a.tracer.alignment){case "horizontal":c<
     112d.length-1&&(h+=", ");break;case "vertical":h+="<br>"}});h+="<hr>";for(var l="",n=5;0<n;n--){if(e.lino){var q=f[e.lino-n].line.substr(g);l+='<input type="text" name="'+n+'"value="'+(e.lino-n+1+": "+q.split("\\s").join(" ")+'"style="width:100%;border:none;enabled:false">')}l+="<br>"}k.innerHTML=h+" "+l;k.style.display="block";b.$jscomp$loop$prop$run$66=document.getElementById("easycoder-run-button");b.$jscomp$loop$prop$step$67=document.getElementById("easycoder-step-button");b.$jscomp$loop$prop$run$66.onclick=
     113function(b){return function(){b.$jscomp$loop$prop$run$66.blur();a.tracing=!1;document.getElementById("easycoder-tracer-content").style.display="none";try{EasyCoder_Run.run(a,a.resume)}catch(p){var c="Error in run handler: "+p.message;console.log(c);alert(c)}}}(b);b.$jscomp$loop$prop$step$67.onclick=function(b){return function(){console.log("step");b.$jscomp$loop$prop$step$67.blur();a.tracing=!0;document.getElementById("easycoder-tracer-content").style.display="block";try{a.run(a.resume)}catch(p){var c=
     114"Error in step handler: "+p.message;console.log(c);alert(c)}}}(b)}a.resume=a.pc;a.pc=0}break}b={$jscomp$loop$prop$run$66:b.$jscomp$loop$prop$run$66,$jscomp$loop$prop$step$67:b.$jscomp$loop$prop$step$67}}},exit:function(a){a.onExit&&a.run(a.onExit);var b=a.parent,c=a.afterExit;delete EasyCoder.scripts[a.script];a.module&&delete a.module.program;Object.keys(a).forEach(function(b){delete a[b]});b&&c&&EasyCoder.scripts[b].run(c)}},EasyCoder_Value={name:"EasyCoder_Value",getItem:function(a){var b=a.getToken();
     115if(!b)return null;if("true"===b)return a.next(),{type:"boolean",content:!0};if("false"===b)return a.next(),{type:"boolean",content:!1};if("`"===b.charAt(0))return a.next(),{type:"constant",numeric:!1,content:b.substring(1,b.length-1)};if(b.charAt(0).match(/[0-9-]/)){var c=eval(b);if(Number.isInteger(c))return a.next(),{type:"constant",numeric:!0,content:c};throw Error("'"+b+"' is not an integer");}b=a.getIndex();c=$jscomp.makeIterator(Object.keys(a.domain));for(var d=c.next();!d.done;d=c.next())if(d=
     116d.value,a.rewindTo(b),d=a.domain[d].value.compile(a))return d;return null},compile:function(a){var b=a.getToken(),c=EasyCoder_Value.getItem(a);if(!c)throw Error("Undefined value: '"+b+"'");if("cat"===a.getToken()){for(b={type:"cat",numeric:!1,parts:[c]};a.tokenIs("cat");)a.next(),b.parts.push(a.value.getItem(a));return b}return c},doValue:function(a,b){if("undefined"===typeof b.type)return a.runtimeError(a[a.pc].lino,"Undefined value (variable not initialized?)"),null;switch(b.type){case "cat":return{type:"constant",
     117numeric:!1,content:b.parts.reduce(function(b,c){return b+EasyCoder_Value.doValue(a,c).content},"")};case "boolean":case "constant":return b;case "symbol":var c=a.getSymbolRecord(b.name);if(c.isValueHolder){if(b=c.value[c.index]){c=b.content;if(null===c||"undefined"===typeof c)b.content=b.numeric?0:"";return b}return null}return a.domain[c.domain].value.get(a,b)}return a.domain[b.domain].value.get(a,b)},constant:function(a,b){return{type:"constant",numeric:b,content:a}},evaluate:function(a,b){if(!b)return{type:"constant",
     118numeric:!1,content:""};var c=EasyCoder_Value.doValue(a,b);if(c)return c;a.runtimeError(a[a.pc].lino,"Can't decode value: "+b)},getValue:function(a,b){return EasyCoder_Value.evaluate(a,b).content},encode:function(a,b){if(a)switch(b){case "ec":return a.replace(/'/g,"~sq~").replace(/"/g,"~dq~").replace(/\n/g,"%0a").replace(/\r/g,"%0d");case "url":return encodeURIComponent(a.replace(/\s/g,"+"));case "sanitize":return a.normalize("NFD").replace(/[\u0300-\u036f]/g,"")}return a},decode:function(a,b){if(a)switch(b){case "ec":return a.replace(/~dq~/g,
     119'"').replace(/~sq~/g,"'").replace(/%0a/g,"\n").replace(/%0d/g,"\r");case "url":return decodeURIComponent(a).replace(/\+/g," ")}return a}};EasyCoder.version="2.5.5";EasyCoder.timestamp=Date.now();console.log("EasyCoder loaded; waiting for page");
    119120function EasyCoder_Startup(){console.log(Date.now()-EasyCoder.timestamp+" ms: Page loaded; reset timer & start EasyCoder");EasyCoder.timestamp=Date.now();EasyCoder.scripts={};window.EasyCoder=EasyCoder;var a=document.getElementById("easycoder-script");if(a){a.style.display="none";try{EasyCoder.start(a.innerText)}catch(b){EasyCoder.reportError(b)}}}window.onload=EasyCoder_Startup;
  • easycoder/trunk/easycoder.js

    r2209140 r2210817  
    668668            const command = program[program.pc];
    669669            const moduleRecord = program.getSymbolRecord(command.module);
    670             const p = moduleRecord.program;
     670            const p = EasyCoder.scripts[moduleRecord.program];
    671671            p.run(p.onClose);
    672672            return command.pc + 1;
     
    960960
    961961        run: program => {
    962             if (program.parent) {
    963                 let parent = EasyCoder.scripts[program.parent];
    964                 parent.run(parent.nextPc);
    965                 parent.nextPc = 0;
    966             }
    967962            program.exit();
    968963            return 0;
     
    11801175                        newRecord.isValueHolder = symbolRecord.isValueHolder;
    11811176                        if (symbolRecord.program) {
    1182                             newRecord.program = symbolRecord.program;
     1177                            newRecord.program = symbolRecord.program.script;
    11831178                        }
    11841179                        newRecord.imported = true;
     
    12931288
    12941289        run: program => {
    1295             const command = program[program.pc];
    1296             return command.pc + 1;
     1290            return program[program.pc].pc + 1;
    12971291        }
    12981292    },
     
    16541648            const lino = compiler.getLino();
    16551649            const script = compiler.getNextValue();
    1656             let program = compiler.getProgram();
    16571650            const imports = [];
    16581651            if (compiler.tokenIs(`with`)) {
     
    16601653                    if (compiler.nextIsSymbol(true)) {
    16611654                        const symbolRecord = compiler.getSymbolRecord();
    1662                         // symbolRecord.exporter = program.script;
    16631655                        imports.push(symbolRecord.name);
    16641656                        compiler.next();
     
    16731665                if (compiler.nextIsSymbol(true)) {
    16741666                    const moduleRecord = compiler.getSymbolRecord();
    1675                     moduleRecord.program = program;
     1667                    // moduleRecord.program = program.script;
    16761668                    compiler.next();
    16771669                    if (moduleRecord.keyword !== `module`) {
     
    18211813                const recipient = program.getSymbolRecord(command.recipient);
    18221814                if (recipient.program) {
    1823                     recipient.program.message = message;
    1824                     recipient.program.run(recipient.program.onMessage);
     1815                    let rprog = EasyCoder.scripts[recipient.program];
     1816                    rprog.message = message;
     1817                    rprog.run(rprog.onMessage);
    18251818                }
    18261819            }
     
    22422235            if (command.name) {
    22432236                const symbolRecord = program.getSymbolRecord(command.name);
    2244                 symbolRecord.program.exit();
     2237                EasyCoder.scripts[symbolRecord.program].exit();
    22452238            } else {
    22462239                return 0;
     
    24422435            const value = program.getValue(command.value);
    24432436            setTimeout(function () {
    2444                 program.run(command.pc + 1);
     2437                if (program.run) {
     2438                    program.run(command.pc + 1);
     2439                }
    24452440            }, value * command.multiplier);
    24462441            return 0;
     
    36733668        program.parent = parent;
    36743669        if (module) {
    3675             module.program = program;
     3670            module.program = program.script;
    36763671        }
    36773672        return program;
     
    37563751        }
    37573752        if (program) {
    3758             program.onExit = then;
     3753            EasyCoder.scripts[program.script] = program;
     3754            if (module) {
     3755                module.program = program.script;
     3756            }
     3757            program.afterExit = then;
    37593758            program.running = true;
    37603759            EasyCoder_Run.run(program, 0);
     
    40354034    exit: (program) => {
    40364035        if (program.onExit) {
    4037             program.un(program.onExit);
    4038             // let parent = EasyCoder.scripts[program.parent];
    4039             // if (parent) {
    4040             //  parent.run(parent.onExit);
    4041             // }
    4042             delete EasyCoder.scripts[program.script];
    4043             program.module.program = null;
    4044             program.running = false;
    4045             program = null;
     4036            program.run(program.onExit);
     4037        }
     4038        let parent = program.parent;
     4039        let afterExit = program.afterExit;
     4040        delete EasyCoder.scripts[program.script];
     4041        if (program.module) {
     4042            delete program.module.program;
     4043        }
     4044        Object.keys(program).forEach(function(key) {
     4045            delete program[key];
     4046        });
     4047        if (parent && afterExit) {
     4048            EasyCoder.scripts[parent].run(afterExit);
    40464049        }
    40474050    }
     
    42464249    }
    42474250};
    4248 EasyCoder.version = `2.5.4`;
     4251EasyCoder.version = `2.5.5`;
    42494252EasyCoder.timestamp = Date.now();
    42504253console.log(`EasyCoder loaded; waiting for page`);
  • easycoder/trunk/easycoder.php

    r2209140 r2210817  
    44  * Plugin URI: https://easycoder.software
    55  * Description: Control the appearance and behavior of your posts and pages by embedding simple English-like scripts, without the need to learn JavaScript.
    6   * Version: 2.5.4
     6  * Version: 2.5.5
    77  * Author: EasyCoder Software
    88  * Author URI: https://easycoder.software
     
    1717  function easycoder_enqueue_script() {   
    1818    wp_enqueue_script('easycoder_script', plugin_dir_url( __FILE__ )
    19             . 'easycoder-min.js', array(), '2.5.4');
     19            . 'easycoder-min.js', array(), '2.5.5');
    2020  }
    2121 
  • easycoder/trunk/readme.txt

    r2209140 r2210817  
    5454
    5555== Changelog ==
     56
     57= 2.5.5 12-dec-2019 =
     58* Fix problems with exit(); replace program with name in objects
    5659
    5760= 2.5.4 10-dec-2019 =
Note: See TracChangeset for help on using the changeset viewer.