# HG changeset patch # User Mike Pavone # Date 1332710733 25200 # Node ID 59e83296e33131390b764cabc5edb754f202961a # Parent a5ef5af3df0fb826c18dbbe82f5c7cc1300d3844 Add populateSymbols method to AST diff -r a5ef5af3df0f -r 59e83296e331 compiler.js --- a/compiler.js Fri Mar 23 18:06:53 2012 -0700 +++ b/compiler.js Sun Mar 25 14:25:33 2012 -0700 @@ -94,3 +94,102 @@ } }; +var mainModule; + +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"); +} + +function setP(o, p, val) +{ + o[p] = val; + return o; +} + +function getP(o, p) +{ + return o[p]; +} + +op.prototype.populateSymbols = function(symbols, isReceiver) { + this.left.populateSymbols(symbols); + this.right.populateSymbols(symbols); +}; + +symbol.prototype.populateSymbols = function(symbols) { + this.symbols = symbols; +} + +intlit.prototype.populateSymbols = function(symbols) { +} + +floatlit.prototype.populateSymbols = function(symbols) { +} + +strlit.prototype.populateSymbols = function(symbols) { +} + +funcall.prototype.populateSymbols = function(symbols) { + if (this.name == 'foreign:') { + if ((this.args[0] instanceof lambda) || (this.args[0] instanceof object) || (this.args[0] instanceof symbol)) { + return; + } else { + throw new Error("Unexpected AST type for foreign:"); + } + } + for (var i in this.args) { + this.args[i].populateSymbols(symbols); + } +} + +object.prototype.populateSymbols = function(symbols) { + symbols = new osymbols(symbols); + for (var i in this.messages) { + this.messages[i].populateSymbolsObject(symbols); + } + this.symbols = symbols; +} + +lambda.prototype.populateSymbols = function(symbols) { + var args = this.args ? this.args.slice(0, this.args.length) : []; + if (args.length && args[0].cleanName() == 'self') { + args.splice(0, 1); + } + var exprs = this.expressions; + symbols = new lsymbols(symbols); + for (var i in args) { + symbols.defineVar(args[i].cleanName(), null); + args[i].populateSymbols(symbols); + } + for (var i in exprs) { + exprs[i].populateSymbols(symbols); + } + this.symbols = symbols; +}; + +assignment.prototype.populateSymbols = function(symbols) { + var existing = symbols.find(this.symbol.name); + if (!existing) { + symbols.defineVar(this.symbol.name, this.expression); + } + this.symbol.populateSymbols(symbols); + this.expression.populateSymbols(symbols); +}; +assignment.prototype.populateSymbolsObject = function(symbols) { + symbols.defineMsg(this.symbol.name, this.expression); + this.symbol.populateSymbols(symbols); + this.expression.populateSymbols(symbols); +}; +