changeset 115:a83989115028

Fix some variable scope issues in the JS backend.
author Mike Pavone <pavone@retrodev.com>
date Mon, 15 Apr 2013 21:13:09 -0700
parents f2b435509301
children 9cf3e0b18ecc
files jsbackend.js
diffstat 1 files changed, 13 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/jsbackend.js	Mon Apr 15 09:34:32 2013 -0700
+++ b/jsbackend.js	Mon Apr 15 21:13:09 2013 -0700
@@ -136,7 +136,7 @@
 	switch(funinfo.type)
 	{
 	case 'self':
-		if (args.length < funinfo.def.args.length || funinfo.def.args[0].name != 'self') {
+		if (args.length < funinfo.def.args.length || funinfo.def.args.length == 0 || funinfo.def.args[0].name != 'self') {
 			var receiver = new symbol('self', this.symbols);
 		} else {
 			var receiver = args[0];
@@ -151,7 +151,8 @@
 		ret = receiver.toJS(true) + '.';
 		break;
 	case 'parent':
-		ret = 'this';
+		var receiver = new symbol('self', this.symbols);
+		ret = receiver.toJS(true);
 		for (var i = 0; i < funinfo.depth; ++i) {
 			ret += '.parent';
 		}
@@ -337,26 +338,32 @@
 assignment.prototype.toJS = function() {
 	var existing = this.symbols.find(this.symbol.name);
 	var prefix = '';
-	if (!existing) {
+	/*if (!existing) {
 		prefix =  'var ';
 	} else {
 		switch (existing.type)
 		{
 		case 'self':
-			prefix = 'this.';
+			var self = new symbol('self', this.symbols);
+			prefix = self.toJS() + '.';
 			break;
 		case 'parent':
-			prefix = 'this.';
+			var self = new symbol('self', this.symbols);
+			prefix = self.toJS() + '.';
 			for (var i = 0; i < existing.depth; ++i) {
 				prefix += 'parent.';
 			}
 			break;
 		}
-	}
+	}*/
 	var val = this.expression.toJS();
 	if (val === null) {
 		return null;
 	}
+	if ((existing.type == 'local' || existing.type == 'closedover') && !existing.isdeclared) {
+		prefix = 'var ';
+		this.symbols.declareVar(this.symbol.name);
+	}
 	return prefix + this.symbol.toJS() + ' = ' + val;
 };
 function removeInitialFunction(str)