Mercurial > repos > tabletprog
annotate compiler.js @ 18:4dd99fde5f63
Tiny bit of cleanup
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 25 Mar 2012 15:57:26 -0700 |
parents | 59e83296e331 |
children | bf03c9f0dd55 |
rev | line source |
---|---|
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
1 function indent(str) |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
2 { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 return str.split('\n').join('\n\t'); |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
4 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
5 |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
6 function osymbols(parent) |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
8 this.parent = parent; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
9 this.names = {}; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
10 this.lastname = null; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
11 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
12 osymbols.prototype.find = function(name) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
13 if (name in this.names) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
14 if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
15 return { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
16 type: 'foreign', |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
17 def: this.names[name] |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
18 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
19 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 return { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
21 type: 'self', |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
22 def: this.names[name], |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
23 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
24 } else if(this.parent) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
25 var ret = this.parent.find(name); |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
26 if (ret) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
27 if(ret.type == 'self') { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
28 ret.type = 'parent'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
29 ret.depth = 1; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
30 } else if(ret.type == 'parent') { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 ret.depth++; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
33 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 return ret; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
36 return null; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 osymbols.prototype.defineMsg = function(name, def) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 this.lastname = name; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 this.names[name] = def; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
41 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
42 osymbols.prototype.parentObject = function() { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
43 if (!this.parent) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
44 return 'null'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
45 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
46 return 'this'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
47 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
48 |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
49 function lsymbols(parent) |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
50 { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
51 this.parent = parent; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
52 this.names = {}; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
53 this.lastname = null; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
54 this.needsSelfVar = false; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
55 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
56 lsymbols.prototype.find = function(name) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
57 if (name in this.names) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
58 if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
59 return { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
60 type: 'foreign', |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
61 def: this.names[name] |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
62 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
63 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
64 return { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
65 type: 'local', |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
66 def: this.names[name] |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
67 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
68 } else if(this.parent) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
69 var ret = this.parent.find(name); |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
70 if (ret && ret.type == 'local') { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
71 ret.type = 'upvar'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
72 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
73 return ret; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
74 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
75 return null; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
76 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
77 lsymbols.prototype.defineVar = function(name, def) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
78 this.lastname = name; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
79 this.names[name] = def; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
80 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
81 lsymbols.prototype.selfVar = function() { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
82 if (this.parent && this.parent instanceof lsymbols) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
83 this.parent.needsSelf(); |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
84 return 'self'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
85 } else { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
86 return 'this'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
87 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
88 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
89 lsymbols.prototype.needsSelf = function() { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
90 if (this.parent && this.parent instanceof lsymbols) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
91 this.parent.needsSelf(); |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
92 } else { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
93 this.needsSelfVar = true; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
94 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
95 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
96 |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
97 var mainModule; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
98 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
99 function toobj(val) |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
100 { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
101 switch(typeof val) |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
102 { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
103 case 'boolean': |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
104 if(val) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
105 return mainModule.strue; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
106 } else { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
107 return mainModule.sfalse; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
108 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
109 case 'number': |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
110 return mainModule.snumber(val); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
111 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
112 throw new Error("can't make val into object"); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
113 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
114 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
115 function setP(o, p, val) |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
116 { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
117 o[p] = val; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
118 return o; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
119 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
120 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
121 function getP(o, p) |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
122 { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
123 return o[p]; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
124 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
125 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
126 op.prototype.populateSymbols = function(symbols, isReceiver) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
127 this.left.populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
128 this.right.populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
129 }; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
130 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
131 symbol.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
132 this.symbols = symbols; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
133 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
134 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
135 intlit.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
136 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
137 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
138 floatlit.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
139 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
140 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
141 strlit.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
142 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
143 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
144 funcall.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
145 if (this.name == 'foreign:') { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
146 if ((this.args[0] instanceof lambda) || (this.args[0] instanceof object) || (this.args[0] instanceof symbol)) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
147 return; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
148 } else { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
149 throw new Error("Unexpected AST type for foreign:"); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
150 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
151 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
152 for (var i in this.args) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
153 this.args[i].populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
154 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
155 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
156 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
157 object.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
158 symbols = new osymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
159 for (var i in this.messages) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
160 this.messages[i].populateSymbolsObject(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
161 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
162 this.symbols = symbols; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
163 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
164 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
165 lambda.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
166 var args = this.args ? this.args.slice(0, this.args.length) : []; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
167 if (args.length && args[0].cleanName() == 'self') { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
168 args.splice(0, 1); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
169 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
170 var exprs = this.expressions; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
171 symbols = new lsymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
172 for (var i in args) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
173 symbols.defineVar(args[i].cleanName(), null); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
174 args[i].populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
175 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
176 for (var i in exprs) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
177 exprs[i].populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
178 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
179 this.symbols = symbols; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
180 }; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
181 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
182 assignment.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
183 var existing = symbols.find(this.symbol.name); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
184 if (!existing) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
185 symbols.defineVar(this.symbol.name, this.expression); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
186 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
187 this.symbol.populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
188 this.expression.populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
189 }; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
190 assignment.prototype.populateSymbolsObject = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
191 symbols.defineMsg(this.symbol.name, this.expression); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
192 this.symbol.populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
193 this.expression.populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
194 }; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
195 |