changeset 104:648659961e0e

Get editor working again
author Mike Pavone <pavone@retrodev.com>
date Thu, 11 Apr 2013 00:12:21 -0700
parents 182c311a9fed
children 35006a6e1c47
files compiler.js editor.js jsbackend.js parser.js scripttags.js src/editor.tp
diffstat 6 files changed, 118 insertions(+), 43 deletions(-) [+]
line wrap: on
line diff
--- 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)
 {
--- 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', {
--- 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' + 
--- 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; };' +
--- 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);
+			}
 		}
-	}
+	});
 });
--- 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 {