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