# HG changeset patch # User Mike Pavone # Date 1332719531 25200 # Node ID bf03c9f0dd55247548753705037febad4d8a9438 # Parent 132c7756860e33b8e9ec729cf7cf86c249922b60 Initial work on proper property support diff -r 132c7756860e -r bf03c9f0dd55 compiler.js --- 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; +} + diff -r 132c7756860e -r bf03c9f0dd55 jsbackend.js --- 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() {