changeset 16:59e83296e331

Add populateSymbols method to AST
author Mike Pavone <pavone@retrodev.com>
date Sun, 25 Mar 2012 14:25:33 -0700
parents a5ef5af3df0f
children 7400bb42e0c9
files compiler.js
diffstat 1 files changed, 99 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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);
+};
+