# HG changeset patch # User Mike Pavone # Date 1365664341 25200 # Node ID 648659961e0e8a4c6ec65cb5814cd960dd894b12 # Parent 182c311a9fed49e9354fbf1be37d650f5ed50ec4 Get editor working again diff -r 182c311a9fed -r 648659961e0e compiler.js --- a/compiler.js Thu Aug 09 19:26:21 2012 -0700 +++ b/compiler.js Thu Apr 11 00:12:21 2013 -0700 @@ -18,23 +18,50 @@ } }; +modulefile.prototype.popuplateSymbolsAsync = function(toplevel, whenDone) { + if (!this.ast) { + var self = this; + get(this.path + '/' + this.file, function(data) { + self.ast = parser.parse(data.responseText); + self.ast.populateSymbols(toplevel); + whenDone(); + }); + } else { + whenDone(); + } +}; + +function getfileshtml(path, data, names) +{ + var fakeEl = newEl("div", { + innerHTML: data.response + }); + each(qall('a', fakeEl), function(idx, a) { + var tpidx = a.textContent.indexOf('.tp'); + var modname = a.textContent.substr(0, tpidx); + if (tpidx > -1) { + names[modname] = new modulefile(path, modname + '.tp'); + } + }); +} + var toplevel = new topsymbols([]); function topsymbols(moduledirs) { this.names = null; this.used = {}; this.nextmodulenum = 0; + this.onready = null; var self = this; if (typeof window === "object") { - get('/src/', function(data) { - self.names = {}; - var fakeEl = newEl("div", { - innerHTML: data.response - }); - each(qall('a', fakeEl), function(idx, a) { - var tpidx = a.textContent.indexOf('.tp'); - if (tpidx > -1) { - self.names[a.textContent.substr(0, tpidx)] = true; + get('/modules/', function(data) { + var names = {} + getfileshtml('/modules', data, names); + get('/src/', function(data) { + getfileshtml('/src', data, names); + self.names = names; + if (self.onready) { + self.onready(); } }); }); @@ -64,10 +91,10 @@ }; } return null; -} +}; topsymbols.prototype.getEnvType = function() { return 'void'; -} +}; topsymbols.prototype.moduleVar = function(name) { if (!(name in this.names)) { throw new Error('symbol ' + name + ' not found at toplevel'); @@ -79,7 +106,22 @@ this.names[name].modulevar = 'module_' + this.nextmodulenum++ } return this.names[name].modulevar; -} +}; +topsymbols.prototype.onReady = function(fun) { + if (this.names) { + fun(); + return; + } + if (!this.onready) { + this.onready = fun; + } else { + var oldready = this.onready; + this.onready = function() { + oldready(); + fun(); + }; + } +}; function osymbols(parent) { diff -r 182c311a9fed -r 648659961e0e editor.js --- a/editor.js Thu Aug 09 19:26:21 2012 -0700 +++ b/editor.js Thu Apr 11 00:12:21 2013 -0700 @@ -15,7 +15,7 @@ var el = newEl('div', { className: 'lambda', onclick: function(event) { - mainModule.lambdaClick(this, astNode, event); + main_module.lambdaClick(this, astNode, event); } }); var args = newEl('div', { diff -r 182c311a9fed -r 648659961e0e jsbackend.js --- a/jsbackend.js Thu Aug 09 19:26:21 2012 -0700 +++ b/jsbackend.js Thu Apr 11 00:12:21 2013 -0700 @@ -3,18 +3,7 @@ function toobj(val) { - switch(typeof val) - { - case 'boolean': - if(val) { - return mainModule.strue; - } else { - return mainModule.sfalse; - } - case 'number': - return mainModule.snumber(val); - } - throw new Error("can't make val into object"); + return (typeof val == "boolean") ? (val ? module_true : module_false) : val; } function importSym(obj, src, key) @@ -257,13 +246,14 @@ var ret = ''; var modulenum = 0; var visited = {}; - for (var i in alwaysused) { + for (var i = 0; i < alwaysused.length; i++) { toplevel.used[alwaysused[i]] = true; } var newused = Object.keys(toplevel.used); var allused = newused; while (newused.length) { - for (var i in newused) { + for (var i = 0; i < newused.length; i++) { + console.log(i, newused[i]); toplevel.names[newused[i]].populateSymbols(toplevel); visited[newused[i]] = true; } @@ -283,13 +273,49 @@ return ret; } +function asyncProcessTopLevelJS(toplevel, whenDone) +{ + var alwaysused = ['true', 'false']; + var ret = ''; + var modulenum = 0; + var visited = {}; + for (var i = 0; i < alwaysused.length; i++) { + toplevel.used[alwaysused[i]] = true; + } + var newused = Object.keys(toplevel.used); + var allused = newused; + var i = -1; + var handler = function() { + i++; + while(newused.length) + { + if (i < newused.length) { + visited[newused[i]] = true; + toplevel.names[newused[i]].popuplateSymbolsAsync(toplevel, handler); + return; + } else { + newused = []; + for (var symbol in toplevel.used) { + if (!(symbol in visited)) { + newused.push(symbol); + allused.push(symbol); + } + } + i = 0; + } + } + whenDone(); + }; + handler(); +} + function makeJSProg(mainmodule) { return processUsedToplevelJS(toplevel) + 'main_module = ' + mainmodule.toJSModule() + '\n' + 'Number.prototype.__defineGetter__("string", function() { return "" + this; });\n' + 'String.prototype.__defineGetter__("string", function() { return this; });\n' + 'String.prototype.__defineGetter__("print", function() { write(this); });\n' + - 'Array.prototype.foreach = function(action) { var ret = module_false; for (var i = 0; i < this.length; i++) { ret = action(i, this[i]) }; return ret; };\n' + + 'Array.prototype = function(action) { var ret = module_false; for (var i = 0; i < this.length; i++) { ret = action(i, this[i]) }; return ret; };\n' + 'Function.prototype.whileCN_do = function(action) { var ret = module_false; while(toobj(this()) == module_true) { ret = action(); } return ret; };\n' + 'function toobj(val) {\n' + ' return (typeof val == "boolean") ? (val ? module_true : module_false) : val;\n' + diff -r 182c311a9fed -r 648659961e0e parser.js --- a/parser.js Thu Aug 09 19:26:21 2012 -0700 +++ b/parser.js Thu Apr 11 00:12:21 2013 -0700 @@ -80,7 +80,7 @@ 'addsub = left:muldiv pieces:(hws ("+"/"-"/"xor"/".") hws muldiv)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+ 'muldiv = left:primlitsym pieces:(hws ("*"/"/"/"%") hws primlitsym)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+ 'primlitsym = hws val:(float / hex / binary / int / string / symbol / object / array / list / lambda / "(" ws expr:expr hws ")" { return expr; }) { return val; };' + -'symbol = chars:[a-zA-Z_!?@]+ trailing:(":"? [a-zA-Z_!?@0-9])* ! ":" { for (var i in trailing) { trailing[i] = trailing[i].join(""); } return new symbol(chars.join("") + trailing.join("")); };' + +'symbol = chars:[a-zA-Z_!?@]+ trailing:(":"? [a-zA-Z_!?@0-9])* ! ":" { for (var i = 0; i < trailing.length; i++) { trailing[i] = trailing[i].join(""); } return new symbol(chars.join("") + trailing.join("")); };' + 'float = digits:[0-9]+ "." decimals:[0-9]+ { return new floatlit(parseFloat(digits.join("") + "." + decimals.join(""))); };' + 'binary = "0b" digits:[01]+ { return new intlit(parseInt(digits.join(""), 2)); };' + 'hex = "0x" digits:[0-9a-fA-F]+ { return new intlit(parseInt(digits.join(""), 16)); };' + @@ -95,7 +95,7 @@ 'lambda = args:((& ":") argname+ )? "{" ws exprs:(assignment / expr)* "}" { return new lambda(args[1], exprs); };' + 'argname = init:":"? chars:[a-zA-Z_!?@]+ trailing:[a-zA-Z_!?@0-9]* hws { return new symbol(init + chars.join("") + trailing.join("")); };' + 'funexpr = f: funcall ws { return f; };' + -'funcall = hws parts: funcallpart+ { var fun = ""; var args = []; for (var i in parts) { fun += parts[i].name; args = args.concat(parts[i].args); } return new funcall(fun, args); };' + +'funcall = hws parts: funcallpart+ { var fun = ""; var args = []; for (var i = 0; i < parts.length; i++) { fun += parts[i].name; args = args.concat(parts[i].args); } return new funcall(fun, args); };' + 'funcallpart = fun:funpart args:opexpr* hws { return { name: fun, args: args}; };' + 'funpart = chars:[a-zA-Z_!?@]+ middle:[a-zA-Z_!?@0-9]* ":" & [ \\t\\n\\r] { return chars.join("") + middle.join("") + ":"; };' + 'methcall = receiver:opexpr hws info:methcallrest { info.receiver = receiver; return info; };' + diff -r 182c311a9fed -r 648659961e0e scripttags.js --- a/scripttags.js Thu Aug 09 19:26:21 2012 -0700 +++ b/scripttags.js Thu Apr 11 00:12:21 2013 -0700 @@ -2,8 +2,12 @@ function compileAndRun(src) { var ast = parser.parse(src); - var js = ast.toJSModule(); - mainModule = eval(js)(); + asyncProcessTopLevelJS(toplevel, function() { + var js = makeJSProg(ast); + eval(js); + }); + /*.toJSModule(); + mainModule = eval(js); if (mainModule.strue) { each(mainModule.strue, function(key, val) { if(val instanceof Function) { @@ -13,18 +17,21 @@ } }); } - mainModule.main(); + mainModule.main();*/ } onReady(function() { - var tags = qall('script[type="text/tabletprog"]'); - for (var i = 0; i < tags.length; ++i) { - if (tags[i].src) { - get(tags[i].src, function(req) { - compileAndRun(req.responseText); - }); - } else { - compileAndRun(tags[i].innerHTML); + toplevel.onReady( function() { + var tags = qall('script[type="text/tabletprog"]'); + + for (var i = 0; i < tags.length; ++i) { + if (tags[i].src) { + get(tags[i].src, function(req) { + compileAndRun(req.responseText); + }); + } else { + compileAndRun(tags[i].innerHTML); + } } - } + }); }); diff -r 182c311a9fed -r 648659961e0e src/editor.tp --- a/src/editor.tp Thu Aug 09 19:26:21 2012 -0700 +++ b/src/editor.tp Thu Apr 11 00:12:21 2013 -0700 @@ -24,7 +24,7 @@ } //kernel definitions -import: kernel +//import: kernel //editor code editFile <- :path {