annotate compiler.js @ 341:6871e72b6db2

Added int64 message to string type
author Michael Pavone <pavone@retrodev.com>
date Sun, 05 Apr 2015 22:48:59 -0700
parents eef8a5cea812
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
1 var debugprint = function() {};
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
25 modulefile.prototype.popuplateSymbolsAsync = function(toplevel, whenDone) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
26 if (!this.ast) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
27 var self = this;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
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
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
31 self.ast = parser.parse(data.responseText);
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
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
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
34 whenDone();
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
35 });
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
36 } else {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
37 whenDone();
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
38 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
39 };
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
40
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
41 function getfileshtml(path, data, names)
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
42 {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
43 var fakeEl = newEl("div", {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
44 innerHTML: data.response
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
45 });
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
46 each(qall('a', fakeEl), function(idx, a) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
47 var tpidx = a.textContent.indexOf('.tp');
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
48 var modname = a.textContent.substr(0, tpidx);
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
49 if (tpidx > -1) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
50 names[modname] = new modulefile(path, modname + '.tp');
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
51 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
52 });
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
53 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
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
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
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
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
69 get('/modules/', function(data) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
70 var names = {}
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
71 getfileshtml('/modules', data, names);
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
72 get('/src/', function(data) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
73 getfileshtml('/src', data, names);
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
74 self.names = names;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
75 if (self.onready) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
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
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
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
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
127 };
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
128 topsymbols.prototype.onReady = function(fun) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
129 if (this.names) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
130 fun();
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
131 return;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
132 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
133 if (!this.onready) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
134 this.onready = fun;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
135 } else {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
136 var oldready = this.onready;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
137 this.onready = function() {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
138 oldready();
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
139 fun();
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
140 };
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
141 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 99
diff changeset
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
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 57
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 57
diff changeset
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
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 57
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
188 } else {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
191 debugprint('\t//symbol type:', ret ? ret.type : 'null');
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
255 if (name in this.closedover) {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
256 var ret = {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
257 type: 'closedover',
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
258 def: this.names[name]
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
259 };
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
260 } else {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
261 var ret = {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
262 type: 'local',
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
263 def: this.names[name],
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
264 isdeclared: (name in this.declared)
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
265 };
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
289 } else {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
299 lsymbols.prototype.declareVar = function(name) {
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
300 this.declared[name] = true;
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
362 symbols.find('self');
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
376 for (var i = 0; i < this.val.length; i++) {
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
377 this.val[i].populateSymbols(symbols);
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
378 }
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
379 }
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
380
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
381 arraylit.prototype.populateSymbols = function(symbols) {
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
382 for (var i = 0; i < this.val.length; i++) {
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
383 this.val[i].populateSymbols(symbols);
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 36
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
473 if (isobject && (!args.length || args[0].cleanName() != 'self')) {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
474 symbols.defineVar('self', null);
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
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