Mercurial > repos > tabletprog
annotate compiler.js @ 162:157cc497a7f1
Add rand srand and time to os module
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 10 Aug 2013 18:58:40 -0700 |
parents | d6e79885bd3b |
children | 869399ff7faa |
rev | line source |
---|---|
54 | 1 var debugprint = function() {}; |
2 | |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
3 function indent(str) |
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 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
|
6 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
7 |
48
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
8 function modulefile(path, file) |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
9 { |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
10 this.path = path; |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
11 this.file = file; |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
12 } |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
13 |
95
926b65fe92b4
Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents:
84
diff
changeset
|
14 modulefile.prototype.populateSymbols = function (toplevel) { |
926b65fe92b4
Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents:
84
diff
changeset
|
15 if (!this.ast) { |
926b65fe92b4
Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents:
84
diff
changeset
|
16 this.ast = parseFile(this.path + '/' + this.file); |
926b65fe92b4
Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents:
84
diff
changeset
|
17 this.ast.populateSymbols(toplevel); |
926b65fe92b4
Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents:
84
diff
changeset
|
18 } |
926b65fe92b4
Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents:
84
diff
changeset
|
19 }; |
926b65fe92b4
Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents:
84
diff
changeset
|
20 |
104 | 21 modulefile.prototype.popuplateSymbolsAsync = function(toplevel, whenDone) { |
22 if (!this.ast) { | |
23 var self = this; | |
24 get(this.path + '/' + this.file, function(data) { | |
25 self.ast = parser.parse(data.responseText); | |
26 self.ast.populateSymbols(toplevel); | |
27 whenDone(); | |
28 }); | |
29 } else { | |
30 whenDone(); | |
31 } | |
32 }; | |
33 | |
34 function getfileshtml(path, data, names) | |
35 { | |
36 var fakeEl = newEl("div", { | |
37 innerHTML: data.response | |
38 }); | |
39 each(qall('a', fakeEl), function(idx, a) { | |
40 var tpidx = a.textContent.indexOf('.tp'); | |
41 var modname = a.textContent.substr(0, tpidx); | |
42 if (tpidx > -1) { | |
43 names[modname] = new modulefile(path, modname + '.tp'); | |
44 } | |
45 }); | |
46 } | |
47 | |
66
25b697c91629
Finish implementation of external module access
Mike Pavone <pavone@retrodev.com>
parents:
62
diff
changeset
|
48 var toplevel = new topsymbols([]); |
48
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
49 function topsymbols(moduledirs) |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
50 { |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
51 this.names = null; |
48
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
52 this.used = {}; |
68
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
53 this.nextmodulenum = 0; |
104 | 54 this.onready = null; |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
30
diff
changeset
|
55 var self = this; |
36
3b0503a67165
Add scripts for building programs via C using d8 rather than a browser
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
56 if (typeof window === "object") { |
104 | 57 get('/modules/', function(data) { |
58 var names = {} | |
59 getfileshtml('/modules', data, names); | |
60 get('/src/', function(data) { | |
61 getfileshtml('/src', data, names); | |
62 self.names = names; | |
63 if (self.onready) { | |
64 self.onready(); | |
36
3b0503a67165
Add scripts for building programs via C using d8 rather than a browser
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
65 } |
3b0503a67165
Add scripts for building programs via C using d8 rather than a browser
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
66 }); |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
30
diff
changeset
|
67 }); |
36
3b0503a67165
Add scripts for building programs via C using d8 rather than a browser
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
68 } else { |
3b0503a67165
Add scripts for building programs via C using d8 rather than a browser
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
69 this.names = {}; |
48
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
70 for (var dirnum in moduledirs) { |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
71 var results = os.system("ls", [moduledirs[dirnum]]).split('\n'); |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
72 for (var i in results) { |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
73 var tpidx = results[i].indexOf('.tp') |
68
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
74 if (tpidx > 0 && tpidx == results[i].length - 3) { |
48
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
75 this.names[results[i].substr(0, tpidx)] = new modulefile(moduledirs[dirnum], results[i]); |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
76 } |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
77 } |
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
78 } |
36
3b0503a67165
Add scripts for building programs via C using d8 rather than a browser
Mike Pavone <pavone@retrodev.com>
parents:
35
diff
changeset
|
79 } |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
80 } |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
81 topsymbols.prototype.find = function(name) { |
54 | 82 debugprint('//topsymbols.find', name, name in this.names); |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
83 if (!this.names) { |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
30
diff
changeset
|
84 throw new Error('data not ready'); |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
85 } |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
86 if (name in this.names) { |
48
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
87 this.used[name] = true; |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
88 return { |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
89 type: 'toplevel', |
48
18ab96287c3a
Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents:
42
diff
changeset
|
90 def: this.names[name] |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
91 }; |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
92 } |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
93 return null; |
104 | 94 }; |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
95 topsymbols.prototype.getEnvType = function() { |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
96 return 'void'; |
104 | 97 }; |
68
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
98 topsymbols.prototype.moduleVar = function(name) { |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
99 if (!(name in this.names)) { |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
100 throw new Error('symbol ' + name + ' not found at toplevel'); |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
101 } |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
102 if (name == 'true' || name == 'false') { |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
103 return 'module_' + name; |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
104 } |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
105 if (!this.names[name].modulevar) { |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
106 this.names[name].modulevar = 'module_' + this.nextmodulenum++ |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
107 } |
3a169ebb3224
Change strategy for handling true and false to avoid some initialization order problems and improve performance. Add support for negative integer literals. Update samples to reflect true/false change.
Mike Pavone <pavone@retrodev.com>
parents:
66
diff
changeset
|
108 return this.names[name].modulevar; |
104 | 109 }; |
110 topsymbols.prototype.onReady = function(fun) { | |
111 if (this.names) { | |
112 fun(); | |
113 return; | |
114 } | |
115 if (!this.onready) { | |
116 this.onready = fun; | |
117 } else { | |
118 var oldready = this.onready; | |
119 this.onready = function() { | |
120 oldready(); | |
121 fun(); | |
122 }; | |
123 } | |
124 }; | |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
125 |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
126 function osymbols(parent) |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
127 { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
128 this.parent = parent; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
129 this.names = {}; |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
130 this.llnames = {}; |
42
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
131 this.needsenv = false; |
57
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
132 this.typename = null; |
59 | 133 this.needsparent = false; |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
134 } |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
135 osymbols.prototype.find = function(name, nestedcall, allowll) { |
54 | 136 debugprint('//osymbols.find', name + ', exists?:', name in this.names, ', nested?:', nestedcall); |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
137 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
|
138 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
|
139 return { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
140 type: 'foreign', |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
141 def: this.names[name] |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
142 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
143 } |
54 | 144 var ret = { |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
145 type: 'self', |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
146 isll: false, |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
147 def: this.names[name], |
57
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
148 selftype: this.typename |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
149 }; |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
150 } else if(allowll && name in this.llnames) { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
151 return { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
152 type: 'self', |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
153 isll: true, |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
154 selftype: this.typename |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
155 }; |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
156 } else if(this.parent) { |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
157 var ret = this.parent.find(name, nestedcall, allowll); |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
158 if (ret) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
159 if(ret.type == 'self') { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
160 ret.type = 'parent'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
161 ret.depth = 1; |
59 | 162 this.needsparent = true; |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
163 } else if(ret.type == 'parent') { |
59 | 164 this.needsparent = true; |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
165 ret.depth++; |
42
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
166 } else if(ret.type == 'closedover' || ret.type == 'upvar') { |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
167 this.needsenv = true; |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
168 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
169 } |
54 | 170 } else { |
171 return null; | |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
172 } |
54 | 173 debugprint('\t//symbol type:', ret ? ret.type : 'null'); |
174 return ret; | |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
175 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
176 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
|
177 this.names[name] = def; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
178 } |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
179 osymbols.prototype.defineLLProperty = function(name) { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
180 this.llnames[name] = true; |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
181 } |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
182 osymbols.prototype.parentObject = function() { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
183 if (!this.parent) { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
184 return 'null'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
185 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
186 return 'this'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
187 } |
24
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
188 osymbols.prototype.allSymbols = function(curlist, cursyms) { |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
189 if (curlist === undefined) { |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
190 curlist = []; |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
191 cursyms = {}; |
23
068d63627b16
Populate in scope symbol buttons when clicking on a symbol in the source
Mike Pavone <pavone@retrodev.com>
parents:
20
diff
changeset
|
192 } |
24
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
193 var keys = Object.keys(this.names).sort(); |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
194 for (var i in keys) { |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
195 if (!(keys[i] in cursyms)) { |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
196 curlist.push(keys[i]); |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
197 cursyms[keys[i]] = true; |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
198 } |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
199 } |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
200 if (this.parent) { |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
201 return this.parent.allSymbols(curlist, cursyms); |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
202 } |
fe3533494ce9
Display symbols order first by depth. Eliminate extraneous setter symbols
Mike Pavone <pavone@retrodev.com>
parents:
23
diff
changeset
|
203 return curlist; |
23
068d63627b16
Populate in scope symbol buttons when clicking on a symbol in the source
Mike Pavone <pavone@retrodev.com>
parents:
20
diff
changeset
|
204 } |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
205 osymbols.prototype.getEnvType = function() { |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
206 return this.parent.getEnvType(); |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
207 } |
42
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
208 osymbols.prototype.envVar = function() { |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
209 return this.parent.envVar(); |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
210 } |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
211 |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
212 function lsymbols(parent) |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
213 { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
214 this.parent = parent; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
215 this.names = {}; |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
216 this.closedover = {}; |
38 | 217 this.declared = {}; |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
218 this.needsSelfVar = false; |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
219 this.passthruenv = false; |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
220 this.envtype = 'void'; |
57
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
221 this.needsParentEnv = false; |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
222 } |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
223 lsymbols.prototype.find = function(name, nestedcall, allowll) { |
54 | 224 debugprint('//lsymbols.find', name + ', exists?:', name in this.names, ', nested?:', nestedcall); |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
225 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
|
226 if (this.names[name] instanceof funcall && this.names[name].name == 'foreign:') { |
54 | 227 var ret = { |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
228 type: 'foreign', |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
229 def: this.names[name] |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
230 }; |
54 | 231 } else { |
232 if (nestedcall) { | |
156
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
233 if (!(name in this.closedover)) { |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
234 debugprint('//' + name + ' is now closed over'); |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
235 this.closedover[name] = true; |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
236 this.passthruenv = false; |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
237 } |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
238 } |
54 | 239 if (name in this.closedover) { |
240 var ret = { | |
241 type: 'closedover', | |
242 def: this.names[name] | |
243 }; | |
244 } else { | |
245 var ret = { | |
246 type: 'local', | |
247 def: this.names[name], | |
248 isdeclared: (name in this.declared) | |
249 }; | |
250 } | |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
251 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
252 } else if(this.parent) { |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
253 var ret = this.parent.find(name, true, allowll); |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
30
diff
changeset
|
254 if (ret) { |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
255 if (ret.type == 'closedover') { |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
30
diff
changeset
|
256 ret.type = 'upvar'; |
55
93ddb4ad6fcb
Fix some nested closure bugs
Mike Pavone <pavone@retrodev.com>
parents:
54
diff
changeset
|
257 ret.depth = 0; |
93ddb4ad6fcb
Fix some nested closure bugs
Mike Pavone <pavone@retrodev.com>
parents:
54
diff
changeset
|
258 } |
93ddb4ad6fcb
Fix some nested closure bugs
Mike Pavone <pavone@retrodev.com>
parents:
54
diff
changeset
|
259 if (ret.type == 'upvar') { |
93ddb4ad6fcb
Fix some nested closure bugs
Mike Pavone <pavone@retrodev.com>
parents:
54
diff
changeset
|
260 if (Object.keys(this.closedover).length) { |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
261 ret.depth++; |
57
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
262 ret.startdepth = 1; |
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
263 this.needsParentEnv = true; |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
264 } else { |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
265 this.passthruenv = true; |
57
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
266 ret.startdepth = 0; |
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
267 /*if (ret.depth == 0) { |
55
93ddb4ad6fcb
Fix some nested closure bugs
Mike Pavone <pavone@retrodev.com>
parents:
54
diff
changeset
|
268 ret.depth = 1; |
57
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
269 }*/ |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
270 } |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
30
diff
changeset
|
271 } |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
272 } |
54 | 273 } else { |
274 return null; | |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
275 } |
57
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
276 var type = ret ? ret.type : 'null'; |
08ae75d90dc2
Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents:
55
diff
changeset
|
277 debugprint('\t//symbol type:', type , type == 'upvar' ? 'depth: ' + ret.depth : ''); |
54 | 278 return ret; |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
279 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
280 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
|
281 this.names[name] = def; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
282 }; |
38 | 283 lsymbols.prototype.declareVar = function(name) { |
284 this.declared[name] = true; | |
285 } | |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
286 lsymbols.prototype.selfVar = function() { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
287 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
|
288 this.parent.needsSelf(); |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
289 return 'self'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
290 } else { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
291 return 'this'; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
292 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
293 }; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
294 lsymbols.prototype.needsSelf = function() { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
295 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
|
296 this.parent.needsSelf(); |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
297 } else { |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
298 this.needsSelfVar = true; |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
299 } |
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
300 }; |
23
068d63627b16
Populate in scope symbol buttons when clicking on a symbol in the source
Mike Pavone <pavone@retrodev.com>
parents:
20
diff
changeset
|
301 lsymbols.prototype.allSymbols = osymbols.prototype.allSymbols; |
34
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
302 lsymbols.prototype.parentEnvType = function() { |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
303 if (!this.parent) { |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
304 return 'void'; |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
305 } |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
306 return this.parent.getEnvType(); |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
307 }; |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
308 lsymbols.prototype.getEnvType = function() { |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
309 if (this.passthruenv) { |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
310 return this.parent.getEnvType(); |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
311 } else { |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
312 return this.envtype; |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
313 } |
a10f1b049193
Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
314 } |
42
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
315 lsymbols.prototype.envVar = function() { |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
316 if (Object.keys(this.closedover).length) { |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
317 return 'myenv'; |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
318 } else if(this.passthruenv) { |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
319 return 'env'; |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
320 } |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
321 return null; |
4e983fe32047
Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
322 } |
8
04ae32e91598
Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
323 |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
324 var mainModule; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
325 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
326 function toobj(val) |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
327 { |
110
d715fb3c39ab
Implemented clicking on symbols inside inscope box to replace function name in funcall.
Mike Pavone <pavone@retrodev.com>
parents:
104
diff
changeset
|
328 return (typeof val == "boolean") ? (val ? module_true : module_false) : val; |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
329 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
330 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
331 op.prototype.populateSymbols = function(symbols, isReceiver) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
332 this.left.populateSymbols(symbols); |
97
59a94f3ad56f
Added short-circuit && and || operators
Mike Pavone <pavone@retrodev.com>
parents:
96
diff
changeset
|
333 if (this.op == '&&' || this.op == '||') { |
59a94f3ad56f
Added short-circuit && and || operators
Mike Pavone <pavone@retrodev.com>
parents:
96
diff
changeset
|
334 //&& and || are syntactic sugar for if and ifnot with |
59a94f3ad56f
Added short-circuit && and || operators
Mike Pavone <pavone@retrodev.com>
parents:
96
diff
changeset
|
335 //the second argument transformed into a lambda to |
59a94f3ad56f
Added short-circuit && and || operators
Mike Pavone <pavone@retrodev.com>
parents:
96
diff
changeset
|
336 //achieve short-circuit evalutation |
59a94f3ad56f
Added short-circuit && and || operators
Mike Pavone <pavone@retrodev.com>
parents:
96
diff
changeset
|
337 this.right = new lambda([], [this.right]); |
59a94f3ad56f
Added short-circuit && and || operators
Mike Pavone <pavone@retrodev.com>
parents:
96
diff
changeset
|
338 } |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
339 this.right.populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
340 }; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
341 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
342 symbol.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
343 this.symbols = symbols; |
54 | 344 var ret = symbols.find(this.cleanName()); |
60
ef3b34c2c0a4
Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents:
59
diff
changeset
|
345 if (ret && (ret.type == 'self' || ret.type == 'parent')) { |
54 | 346 symbols.find('self'); |
347 } | |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
348 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
349 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
350 intlit.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
351 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
352 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
353 floatlit.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
354 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
355 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
356 strlit.prototype.populateSymbols = function(symbols) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
357 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
358 |
25
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
24
diff
changeset
|
359 listlit.prototype.populateSymbols = function(symbols) { |
38 | 360 for (var i = 0; i < this.val.length; i++) { |
361 this.val[i].populateSymbols(symbols); | |
362 } | |
363 } | |
364 | |
365 arraylit.prototype.populateSymbols = function(symbols) { | |
366 for (var i = 0; i < this.val.length; i++) { | |
367 this.val[i].populateSymbols(symbols); | |
368 } | |
25
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
24
diff
changeset
|
369 } |
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
24
diff
changeset
|
370 |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
371 funcall.prototype.populateSymbols = function(symbols) { |
96
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
372 var isll = false; |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
373 if (this.name == 'foreign:') { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
374 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
|
375 return; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
376 } else { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
377 throw new Error("Unexpected AST type for foreign:"); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
378 } |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
379 } else if (this.name == 'llProperty:withType:') { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
380 if (this.args[0] instanceof symbol) { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
381 if ((this.args[1] instanceof symbol) || (this.args[1] instanceof funcall)) { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
382 symbols.defineLLProperty(this.args[0].name); |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
383 return; |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
384 } else { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
385 throw new Error("Second argument to llProperty:withType: must be a symbol or funcall"); |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
386 } |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
387 } else { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
388 throw new Error("First argument to llProperty:withType: must be a symbol"); |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
389 } |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
390 } else if (this.name == 'llMessage:withVars:andCode:') { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
391 if (this.args[0] instanceof symbol) { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
392 if (this.args[1] instanceof lambda) { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
393 if (this.args[2] instanceof lambda) { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
394 symbols.defineMsg(this.args[0].name, this.args[2]); |
96
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
395 isll = true; |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
396 } else { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
397 throw new Error("Third argument to llMessage:withVars:andCode: must be a lambda"); |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
398 } |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
399 } else { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
400 throw new Error("Second argument to llMessage:withVars:andCode: must be a lambda"); |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
401 } |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
402 } else { |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
403 throw new Error("First argument to llMessage:withVars:andCode: must be a symbol"); |
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
404 } |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
405 } |
20
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
406 this.symbols = symbols; |
62
f57b2f4048d0
Fix funcall.populateSymbols to use the fixed up name when doing the initial symbol.find. This ensures the parent tree is properly produced
Mike Pavone <pavone@retrodev.com>
parents:
60
diff
changeset
|
407 var name = this.name[this.name.length-1] == ':' ? this.name.substr(0, this.name.length-1) : this.name; |
77
8a9b96888b7d
Fix another symbol table/closure bug
Mike Pavone <pavone@retrodev.com>
parents:
68
diff
changeset
|
408 var funinfo = symbols.find(name); |
8a9b96888b7d
Fix another symbol table/closure bug
Mike Pavone <pavone@retrodev.com>
parents:
68
diff
changeset
|
409 if (funinfo && (funinfo.type == 'self' || funinfo.type == 'parent')) { |
8a9b96888b7d
Fix another symbol table/closure bug
Mike Pavone <pavone@retrodev.com>
parents:
68
diff
changeset
|
410 symbols.find('self'); |
8a9b96888b7d
Fix another symbol table/closure bug
Mike Pavone <pavone@retrodev.com>
parents:
68
diff
changeset
|
411 } |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
412 for (var i in this.args) { |
96
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
413 this.args[i].populateSymbols(symbols, undefined, isll); |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
414 } |
20
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
415 if (this.receiver) { |
96
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
416 this.receiver.populateSymbols(symbols, undefined, isll); |
20
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
417 } |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
418 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
419 |
156
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
420 funcall.prototype.predefSymbolsObject = function(symbols) { |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
421 }; |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
422 |
25
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
24
diff
changeset
|
423 funcall.prototype.populateSymbolsObject = function(symbols) { |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
424 this.populateSymbols(symbols); |
156
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
425 }; |
25
4d87c38404d6
List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents:
24
diff
changeset
|
426 |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
427 object.prototype.populateSymbols = function(symbols) { |
84
9811040704ac
Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents:
77
diff
changeset
|
428 var symbols = new osymbols(symbols); |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
429 for (var i in this.messages) { |
156
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
430 this.messages[i].predefSymbolsObject(symbols); |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
431 } |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
432 for (var i in this.messages) { |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
433 this.messages[i].populateSymbolsObject(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
434 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
435 this.symbols = symbols; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
436 } |
96
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
437 var lambdanum = 0; |
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
438 lambda.prototype.populateSymbols = function(symbols, isobject, isll) { |
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
439 if (!isll) { |
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
440 this.name = 'lambda_' + lambdanum++; |
84b65ee8b78b
Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents:
95
diff
changeset
|
441 } |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
442 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
|
443 var exprs = this.expressions; |
54 | 444 var symbols = new lsymbols(symbols); |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
445 for (var i in args) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
446 symbols.defineVar(args[i].cleanName(), null); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
447 args[i].populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
448 } |
54 | 449 if (isobject && (!args.length || args[0].cleanName() != 'self')) { |
450 symbols.defineVar('self', null); | |
451 } | |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
452 for (var i in exprs) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
453 exprs[i].populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
454 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
455 this.symbols = symbols; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
456 }; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
457 |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
458 assignment.prototype.populateSymbols = function(symbols) { |
62
f57b2f4048d0
Fix funcall.populateSymbols to use the fixed up name when doing the initial symbol.find. This ensures the parent tree is properly produced
Mike Pavone <pavone@retrodev.com>
parents:
60
diff
changeset
|
459 debugprint('//assignment', this.symbol.name, 'populateSymbols'); |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
460 var existing = symbols.find(this.symbol.name); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
461 if (!existing) { |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
462 symbols.defineVar(this.symbol.name, this.expression); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
463 } |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
464 this.symbol.populateSymbols(symbols); |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
465 this.expression.populateSymbols(symbols); |
20
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
466 this.symbols = symbols; |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
467 }; |
156
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
468 assignment.prototype.predefSymbolsObject = function(symbols) { |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
469 debugprint('//messagedef', this.symbol.name, 'predefSymbolsObject'); |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
470 if (this.expression instanceof lambda || (this.expression instanceof funcall & this.expression.name == 'foreign:')) { |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
471 symbols.defineMsg(this.symbol.name, this.expression); |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
472 } else { |
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
473 symbols.defineMsg(this.symbol.name, new getter(null)); |
20
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
474 symbols.defineMsg(this.symbol.name + '!', new setter(null)); |
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
475 } |
156
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
476 }; |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
477 assignment.prototype.populateSymbolsObject = function(symbols) { |
d6e79885bd3b
Fix compiler bug involving referencing a self method in a method defined before the referenced method
Mike Pavone <pavone@retrodev.com>
parents:
110
diff
changeset
|
478 debugprint('//messagedef', this.symbol.name, 'populateSymbols'); |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
479 this.symbol.populateSymbols(symbols); |
54 | 480 this.expression.populateSymbols(symbols, true); |
20
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
481 this.symbols = symbols; |
16
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
482 }; |
59e83296e331
Add populateSymbols method to AST
Mike Pavone <pavone@retrodev.com>
parents:
8
diff
changeset
|
483 |
20
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
484 function setter(fun) |
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
485 { |
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
486 this.fun = fun; |
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
487 } |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
488 setter.prototype.args = [new symbol('self'), new symbol('newval')]; |
20
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
489 function getter(fun) |
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
490 { |
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
491 this.fun = fun; |
bf03c9f0dd55
Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents:
16
diff
changeset
|
492 } |
30
608eb70fe261
Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents:
25
diff
changeset
|
493 getter.prototype.args = [new symbol('self')]; |
99
b58b19c455ec
Initial work on type system
Mike Pavone <pavone@retrodev.com>
parents:
97
diff
changeset
|
494 |