changeset 20:bf03c9f0dd55

Initial work on proper property support
author Mike Pavone <pavone@retrodev.com>
date Sun, 25 Mar 2012 16:52:11 -0700
parents 132c7756860e
children 6c8ae6b47ab5
files compiler.js jsbackend.js
diffstat 2 files changed, 40 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/compiler.js	Sun Mar 25 16:11:19 2012 -0700
+++ b/compiler.js	Sun Mar 25 16:52:11 2012 -0700
@@ -142,6 +142,7 @@
 }
 
 funcall.prototype.populateSymbols = function(symbols) {
+	if(this.name == 'q:') { console.log('populateSymbols', this); }
 	if (this.name == 'foreign:') {
 		if ((this.args[0] instanceof lambda) || (this.args[0] instanceof object) || (this.args[0] instanceof symbol)) {
 			return;
@@ -149,9 +150,13 @@
 			throw new Error("Unexpected AST type for foreign:");
 		}
 	}
+	this.symbols = symbols;
 	for (var i in this.args) {
 		this.args[i].populateSymbols(symbols);
 	}
+	if (this.receiver) {
+		this.receiver.populateSymbols(symbols);
+	}
 }
 
 object.prototype.populateSymbols = function(symbols) {
@@ -186,10 +191,26 @@
 	}
 	this.symbol.populateSymbols(symbols);
 	this.expression.populateSymbols(symbols);
+	this.symbols = symbols;
 };
 assignment.prototype.populateSymbolsObject = function(symbols) {
+	console.log('populateSymbolsObject for assignment to ' + this.symbol.name)
 	symbols.defineMsg(this.symbol.name, this.expression);
+	if (!(this.expression instanceof lambda)) {
+		symbols.defineMsg(this.symbol.name + '!', new setter(null));
+	}
 	this.symbol.populateSymbols(symbols);
 	this.expression.populateSymbols(symbols);
+	this.symbols = symbols;
 };
 
+function setter(fun)
+{
+	this.fun = fun;
+}
+
+function getter(fun)
+{
+	this.fun = fun;
+}
+
--- a/jsbackend.js	Sun Mar 25 16:11:19 2012 -0700
+++ b/jsbackend.js	Sun Mar 25 16:52:11 2012 -0700
@@ -75,15 +75,24 @@
 	if (this.receiver) {
 		args.splice(0, 0, this.receiver);
 	}
+	console.log(this);
+	console.log('Checking symbol table for ' + name);
 	var funinfo = this.symbols.find(name);
-	if (!funinfo) {
+	if (!funinfo || funinfo.def instanceof setter) {
 		var receiver = args[0];
 		args.splice(0, 1);
 		for (var i in args) {
 			args[i] = args[i].toJS();
 		}
-		return receiver.toJS(true) + '.' + (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')';
+		var rJS = receiver.toJS(true);
+		var jsName = (new symbol(name, this.symbols)).toJS();
+		if ((name[name.length-1] == '!' && args.length == 1) || (funinfo && funinfo.def instanceof setter)) {
+			return  '(' + rJS + '.' + jsName + ' = ' + args[0] + ', ' + rJS + ')'
+		} else {
+			return rJS + '.' + jsName + '(' + args.join(', ') + ')';
+		}
 	}
+	var ret = '';
 	switch(funinfo.type)
 	{
 	case 'self':
@@ -93,28 +102,19 @@
 			var receiver = args[0];
 			args.splice(0, 1);
 		}
-		for (var i in args) {
-			args[i] = args[i].toJS();
-		}
-		return receiver.toJS(true) + '.' + (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')';
+		ret = receiver.toJS(true) + '.';
+		break;
 	case 'parent':
-		var ret = 'this';
+		ret = 'this';
 		for (var i = 0; i < funinfo.depth; ++i) {
 			ret += '.parent';
 		}
-		for (var i in args) {
-			args[i] = args[i].toJS();
-		}
-		ret += (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')';
-		return ret;
-	case 'local':
-	case 'upvar':
-	case 'foreign':
-		for (var i in args) {
-			args[i] = args[i].toJS();
-		}
-		return (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')';
+		break;
 	}
+	for (var i in args) {
+		args[i] = args[i].toJS();
+	}
+	return ret + (new symbol(name, this.symbols)).toJS() + '(' + args.join(', ') + ')';
 }
 
 object.prototype.toJS = function() {