comparison compiler.js @ 16:59e83296e331

Add populateSymbols method to AST
author Mike Pavone <pavone@retrodev.com>
date Sun, 25 Mar 2012 14:25:33 -0700
parents 04ae32e91598
children bf03c9f0dd55
comparison
equal deleted inserted replaced
15:a5ef5af3df0f 16:59e83296e331
92 } else { 92 } else {
93 this.needsSelfVar = true; 93 this.needsSelfVar = true;
94 } 94 }
95 }; 95 };
96 96
97 var mainModule;
98
99 function toobj(val)
100 {
101 switch(typeof val)
102 {
103 case 'boolean':
104 if(val) {
105 return mainModule.strue;
106 } else {
107 return mainModule.sfalse;
108 }
109 case 'number':
110 return mainModule.snumber(val);
111 }
112 throw new Error("can't make val into object");
113 }
114
115 function setP(o, p, val)
116 {
117 o[p] = val;
118 return o;
119 }
120
121 function getP(o, p)
122 {
123 return o[p];
124 }
125
126 op.prototype.populateSymbols = function(symbols, isReceiver) {
127 this.left.populateSymbols(symbols);
128 this.right.populateSymbols(symbols);
129 };
130
131 symbol.prototype.populateSymbols = function(symbols) {
132 this.symbols = symbols;
133 }
134
135 intlit.prototype.populateSymbols = function(symbols) {
136 }
137
138 floatlit.prototype.populateSymbols = function(symbols) {
139 }
140
141 strlit.prototype.populateSymbols = function(symbols) {
142 }
143
144 funcall.prototype.populateSymbols = function(symbols) {
145 if (this.name == 'foreign:') {
146 if ((this.args[0] instanceof lambda) || (this.args[0] instanceof object) || (this.args[0] instanceof symbol)) {
147 return;
148 } else {
149 throw new Error("Unexpected AST type for foreign:");
150 }
151 }
152 for (var i in this.args) {
153 this.args[i].populateSymbols(symbols);
154 }
155 }
156
157 object.prototype.populateSymbols = function(symbols) {
158 symbols = new osymbols(symbols);
159 for (var i in this.messages) {
160 this.messages[i].populateSymbolsObject(symbols);
161 }
162 this.symbols = symbols;
163 }
164
165 lambda.prototype.populateSymbols = function(symbols) {
166 var args = this.args ? this.args.slice(0, this.args.length) : [];
167 if (args.length && args[0].cleanName() == 'self') {
168 args.splice(0, 1);
169 }
170 var exprs = this.expressions;
171 symbols = new lsymbols(symbols);
172 for (var i in args) {
173 symbols.defineVar(args[i].cleanName(), null);
174 args[i].populateSymbols(symbols);
175 }
176 for (var i in exprs) {
177 exprs[i].populateSymbols(symbols);
178 }
179 this.symbols = symbols;
180 };
181
182 assignment.prototype.populateSymbols = function(symbols) {
183 var existing = symbols.find(this.symbol.name);
184 if (!existing) {
185 symbols.defineVar(this.symbol.name, this.expression);
186 }
187 this.symbol.populateSymbols(symbols);
188 this.expression.populateSymbols(symbols);
189 };
190 assignment.prototype.populateSymbolsObject = function(symbols) {
191 symbols.defineMsg(this.symbol.name, this.expression);
192 this.symbol.populateSymbols(symbols);
193 this.expression.populateSymbols(symbols);
194 };
195