diff jsbackend.js @ 104:648659961e0e

Get editor working again
author Mike Pavone <pavone@retrodev.com>
date Thu, 11 Apr 2013 00:12:21 -0700
parents 926b65fe92b4
children d715fb3c39ab
line wrap: on
line diff
--- 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' +