annotate jsbackend.js @ 104:648659961e0e

Get editor working again
author Mike Pavone <pavone@retrodev.com>
date Thu, 11 Apr 2013 00:12:21 -0700
parents 926b65fe92b4
children d715fb3c39ab
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 var mainModule;
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents: 30
diff changeset
2 var modules = {};
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4 function toobj(val)
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 {
104
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
6 return (typeof val == "boolean") ? (val ? module_true : module_false) : val;
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
9 function importSym(obj, src, key)
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
10 {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
11 if(!(key in src)) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
12 throw new Error(key +' not found in source object for import');
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
13 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
14 if(key in obj) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
15 throw new Error(key +' already exists in target object for import')
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
16 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
17 obj[key] = src[key];
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
18 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
19
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
20 function doImport(obj, src, symlist)
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
21 {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
22 if (symlist === undefined) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
23 each(src, function(key,val) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
24 if (key != 'parent') {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
25 importSym(obj, src, key);
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
26 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
27 });
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
28 } else {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
29 for (var i = 0; i < symlist.length; ++i) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
30 importSym(obj, src, symlist[i]);
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
31 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
32 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
33 return obj;
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
34 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
35
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
36 op.prototype.toJS = function(isReceiver) {
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
37 var opmap = {'=': '==', '.': '+'};
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
38 var ret = '(' + this.left.toJS() +' '+ (this.op in opmap ? opmap[this.op] : this.op) +' '+ this.right.toJS() + ')';
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 return ret;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
40 };
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
41
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
42 function escapeJSName(name)
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
43 {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 name = name.replace("_", "UN_").replace(":", "CN_").replace("!", "EX_").replace('?', 'QS_').replace('@', 'AT_');
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 var reserved = {'true': true, 'false': true, 'this': true, 'if': true, 'else': true, 'NaN': true};
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 if (name in reserved) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47 name = 's' + name;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 return name;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
52 symbol.prototype.toJS = function() {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
53 var name = this.cleanName();
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
54 if (name == 'self') {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
55 return this.symbols.selfVar();
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
56 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
57 var info = this.symbols.find(name);
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
58 if (!info) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
59 throw new Error('symbol ' + name + ' not found');
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
60 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
61 var pre = '';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
62 if (info.type == 'self') {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
63 pre = this.symbols.selfVar() + '.';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
64 } else if(info.type == 'parent') {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
65 pre = 'this';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
66 for (var i = 0; i < funinfo.depth; ++i) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
67 pre += '.parent';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
68 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents: 30
diff changeset
69 } else if (info.type == 'toplevel') {
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
70 return toplevel.moduleVar(name);
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
71 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
72 return pre + escapeJSName(name);
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
73 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
74
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
75 intlit.prototype.toJS = function() {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
76 return this.val.toString();
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
77 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
79 floatlit.prototype.toJS = function() {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
80 return this.val.toString();
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
81 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
82
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
83 strlit.prototype.toJS = function() {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
84 return '"' + this.val.replace('\\', '\\\\').replace('"', '\\"').replace('\n', '\\n').replace('\r', '\\r') + '"';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
85 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
86
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
87 listlit.prototype.toJS = function() {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
88 var ret = '[';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
89 each(this.val, function(idx, el) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
90 ret += (idx ? ', ' : '') + el.toJS();
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
91 });
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
92 return ret + ']';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
93 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
94
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
95 funcall.prototype.toJS = function() {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
96 var name = this.name[this.name.length-1] == ':' ? this.name.substr(0, this.name.length-1) : this.name;
12
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
97 if (name == 'foreign') {
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
98 if ((this.args[0] instanceof lambda) || (this.args[0] instanceof object)) {
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
99 return null;
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
100 } else if(this.args[0] instanceof symbol) {
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
101 return this.args[0].name;
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
102 } else {
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
103 throw new Error("Unexpected AST type for foreign:");
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
104 }
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
105 }
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
106 var args = this.args.slice(0, this.args.length);
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
107 if (this.receiver) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
108 args.splice(0, 0, this.receiver);
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
109 }
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
110 var funinfo = this.symbols.find(name);
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
111 if (!funinfo || funinfo.def instanceof setter || funinfo.type == 'toplevel') {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
112 var receiver = args[0];
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
113 args.splice(0, 1);
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
114 for (var i in args) {
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
115 args[i] = args[i].toJS();
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
116 }
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
117 var rJS = (funinfo ? '' : 'toobj(') + receiver.toJS(true) + (funinfo ? '' : ')') ;
20
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
118 if ((name[name.length-1] == '!' && args.length == 1) || (funinfo && funinfo.def instanceof setter)) {
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
119 return '(' + rJS + '.' + escapeJSName(name.substr(0, name.length-1)) + ' = ' + args[0] + ', ' + rJS + ')';
20
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
120 } else {
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
121 var callee = rJS + '.' + escapeJSName(name);
21
6c8ae6b47ab5 Small improvements to property support and elimination of setP and getP functions as they are no longer needed
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
122 if (args.length == 0) {
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
123 return callee;
21
6c8ae6b47ab5 Small improvements to property support and elimination of setP and getP functions as they are no longer needed
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
124 } else {
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
125 return callee + '(' + args.join(', ') + ')';
21
6c8ae6b47ab5 Small improvements to property support and elimination of setP and getP functions as they are no longer needed
Mike Pavone <pavone@retrodev.com>
parents: 20
diff changeset
126 }
20
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
127 }
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
128 }
20
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
129 var ret = '';
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
130 switch(funinfo.type)
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
131 {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
132 case 'self':
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
133 if (args.length < funinfo.def.args.length || funinfo.def.args[0].name != 'self') {
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
134 var receiver = new symbol('self', this.symbols);
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
135 } else {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
136 var receiver = args[0];
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
137 args.splice(0, 1);
30
608eb70fe261 Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents: 25
diff changeset
138 if (args.length == 0) {
608eb70fe261 Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents: 25
diff changeset
139 var rJS = receiver.toJS(true);
608eb70fe261 Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents: 25
diff changeset
140 var callee = rJS + '.' + escapeJSName(name);
608eb70fe261 Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents: 25
diff changeset
141
608eb70fe261 Fix some compiler bugs and do initial work on module import
Mike Pavone <pavone@retrodev.com>
parents: 25
diff changeset
142 return '(' + callee + ' instanceof Function ? ' + callee + '() : ' + callee + ')';
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 }
20
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
145 ret = receiver.toJS(true) + '.';
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
146 break;
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
147 case 'parent':
20
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
148 ret = 'this';
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
149 for (var i = 0; i < funinfo.depth; ++i) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
150 ret += '.parent';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
151 }
20
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
152 break;
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
153 }
20
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
154 for (var i in args) {
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
155 args[i] = args[i].toJS();
bf03c9f0dd55 Initial work on proper property support
Mike Pavone <pavone@retrodev.com>
parents: 19
diff changeset
156 }
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
157 return ret + escapeJSName(name) + '(' + args.join(', ') + ')';
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
158 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
159
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
160 object.prototype.toJS = function() {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
161 var messages = this.messages;
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
162 var compiled = [];
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
163 var imports = []
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
164 for (var i in messages) {
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
165 if (messages[i] instanceof funcall) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
166 if (messages[i].name == 'import:' && messages[i].args.length == 1) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
167 imports.push({symbols: false, src: messages[i].args[0]});
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
168 } else if(messages[i].name == 'import:from:' && messages[i].args.length == 2) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
169 var importsyms = [];
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
170 each(messages[i].args[0].val, function(i, el) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
171 if (!(el instanceof symbol)) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
172 throw new Error('Names in import:from statement must be symbols');
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
173 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
174 importsyms.push(new strlit(el.name));
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
175 });
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
176 imports.push({symbols: new listlit(importsyms), src: messages[i].args[1]});
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
177 } else {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
178 throw new Error('Only import and import:from calls allowed in object context');
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
179 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
180 } else {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
181 var js = messages[i].toJSObject();
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
182 if (js) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
183 compiled.push(indent(js));
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
184 }
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
185 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
186 }
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
187 var pre = '';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
188 var post = '';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
189 for (var i = imports.length-1; i >= 0; i--) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
190 pre += 'doImport(';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
191 post += ', ' + imports[i].src.toJS();
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
192 if (imports[i].symbols) {
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
193 post += ', ' + imports[i].symbols.toJS();
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
194 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
195 post += ')';
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
196 }
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
197 return pre+'{\n\tparent: ' + this.symbols.parentObject() + ',\n\t' + compiled.join(',\n\t') + '\n}'+post;
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
198 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
199
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
200 object.prototype.toJSModule = function() {
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents: 30
diff changeset
201 this.populateSymbols(toplevel);
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
202 return '(function () {\n\tvar module = ' + indent(this.toJS()) + ';\n\treturn module;\n})();'
8
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
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
205 lambda.prototype.toJS = function() {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
206 var args = this.args ? this.args.slice(0, this.args.length) : [];
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
207 if (args.length && args[0].cleanName() == 'self') {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
208 args.splice(0, 1);
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
209 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
210 var exprs = this.expressions;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
211 for (var i in args) {
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
212 args[i] = args[i].toJS();
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
213 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
214 var compiled = []
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
215 for (var i in exprs) {
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
216 var js = exprs[i].toJS();
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
217 if (js) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
218 compiled.push(indent(js));
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
219 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
220 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
221 exprs = compiled;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
222 if (exprs.length) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
223 exprs[exprs.length-1] = 'return ' + exprs[exprs.length-1] + ';';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
224 }
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
225 return 'function (' + args.join(', ') + ') {\n\t' + (this.symbols.needsSelfVar ? 'var self = this;\n\t' : '') + exprs.join(';\n\t') + '\n}'
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
226 };
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
227 lambda.prototype.nonSelfArgs = function() {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
228 var args = this.args ? this.args.slice(0, this.args.length) : [];
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
229 if (args.length && args[0].cleanName() == 'self') {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
230 args.splice(0, 1);
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
231 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
232 return args;
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
233 };
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
234 lambda.prototype.toJSModule = function() {
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents: 30
diff changeset
235 this.populateSymbols(toplevel);
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
236 return this.toJS() + '();';
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
237 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
238
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
239 modulefile.prototype.toJSModule = function(){
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
240 return this.ast.toJSModule();
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
241 };
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
242
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
243 function processUsedToplevelJS(toplevel)
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
244 {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
245 var alwaysused = ['true', 'false'];
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
246 var ret = '';
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
247 var modulenum = 0;
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
248 var visited = {};
104
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
249 for (var i = 0; i < alwaysused.length; i++) {
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
250 toplevel.used[alwaysused[i]] = true;
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
251 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
252 var newused = Object.keys(toplevel.used);
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
253 var allused = newused;
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
254 while (newused.length) {
104
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
255 for (var i = 0; i < newused.length; i++) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
256 console.log(i, newused[i]);
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
257 toplevel.names[newused[i]].populateSymbols(toplevel);
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
258 visited[newused[i]] = true;
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
259 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
260 newused = [];
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
261 for (var symbol in toplevel.used) {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
262 if (!(symbol in visited)) {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
263 newused.push(symbol);
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
264 allused.push(symbol);
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
265 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
266 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
267 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
268
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
269 for (var i = allused.length-1; i >= 0; i--) {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
270 var symbol = allused[i];
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
271 ret += 'var ' + toplevel.moduleVar(symbol) + ' = ' + toplevel.names[symbol].toJSModule() + '\n';
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
272 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
273 return ret;
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
274 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
275
104
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
276 function asyncProcessTopLevelJS(toplevel, whenDone)
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
277 {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
278 var alwaysused = ['true', 'false'];
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
279 var ret = '';
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
280 var modulenum = 0;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
281 var visited = {};
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
282 for (var i = 0; i < alwaysused.length; i++) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
283 toplevel.used[alwaysused[i]] = true;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
284 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
285 var newused = Object.keys(toplevel.used);
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
286 var allused = newused;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
287 var i = -1;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
288 var handler = function() {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
289 i++;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
290 while(newused.length)
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
291 {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
292 if (i < newused.length) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
293 visited[newused[i]] = true;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
294 toplevel.names[newused[i]].popuplateSymbolsAsync(toplevel, handler);
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
295 return;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
296 } else {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
297 newused = [];
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
298 for (var symbol in toplevel.used) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
299 if (!(symbol in visited)) {
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
300 newused.push(symbol);
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
301 allused.push(symbol);
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
302 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
303 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
304 i = 0;
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
305 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
306 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
307 whenDone();
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
308 };
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
309 handler();
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
310 }
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
311
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
312 function makeJSProg(mainmodule)
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
313 {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
314 return processUsedToplevelJS(toplevel) + 'main_module = ' + mainmodule.toJSModule() + '\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
315 'Number.prototype.__defineGetter__("string", function() { return "" + this; });\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
316 'String.prototype.__defineGetter__("string", function() { return this; });\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
317 'String.prototype.__defineGetter__("print", function() { write(this); });\n' +
104
648659961e0e Get editor working again
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
318 'Array.prototype = function(action) { var ret = module_false; for (var i = 0; i < this.length; i++) { ret = action(i, this[i]) }; return ret; };\n' +
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
319 'Function.prototype.whileCN_do = function(action) { var ret = module_false; while(toobj(this()) == module_true) { ret = action(); } return ret; };\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
320 'function toobj(val) {\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
321 ' return (typeof val == "boolean") ? (val ? module_true : module_false) : val;\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
322 '}\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
323 'var m = main_module.main;\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
324 'if (m instanceof Function) {\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
325 ' m(arguments);\n' +
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
326 '}\n';
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
327 }
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
328
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
329 assignment.prototype.toJS = function() {
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
330 var existing = this.symbols.find(this.symbol.name);
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
331 var prefix = '';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
332 if (!existing) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
333 prefix = 'var ';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
334 } else {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
335 switch (existing.type)
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
336 {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
337 case 'self':
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
338 prefix = 'this.';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
339 break;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
340 case 'parent':
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
341 prefix = 'this.';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
342 for (var i = 0; i < existing.depth; ++i) {
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
343 prefix += 'parent.';
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
344 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
345 break;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
346 }
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
347 }
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
348 var val = this.expression.toJS();
12
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
349 if (val === null) {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
350 return null;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
351 }
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
352 return prefix + this.symbol.toJS() + ' = ' + val;
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
353 };
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
354 function removeInitialFunction(str)
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
355 {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
356 var f = 'function';
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
357 str = str.trim();
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
358 if (str.substr(0, f.length) == f) {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
359 return str.substr(f.length);
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
360 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
361 return str;
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
362 }
19
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
363 assignment.prototype.toJSObject = function() {
132c7756860e Use populateSymbols to generate symbol tables during compilation rather than populating them as we go. This change allows us to refer to symbols defined later in the input stream and also gives the symbol table logic a single home that can be used both by the compiler and editor.
Mike Pavone <pavone@retrodev.com>
parents: 12
diff changeset
364 var val = this.expression.toJS();
12
6e4851a204a5 Add ability to load code into editor
Mike Pavone <pavone@retrodev.com>
parents: 10
diff changeset
365 if (val === null) {
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
366 return null;
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
367 }
95
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
368 if (this.expression instanceof lambda) {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
369 var args = this.expression.nonSelfArgs();
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
370 if (args.length == 0) {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
371 return 'get ' + escapeJSName(this.symbol.name) + removeInitialFunction(val);
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
372 } else if(args.length == 1 && this.symbol.name[this.symbol.name.length-1] == '!') {
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
373 return 'set ' + escapeJSName(this.symbol.name.substr(0, this.symbol.name.length-1)) + removeInitialFunction(val);
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
374 }
926b65fe92b4 Do some cleanup on JS backend
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
375 }
25
4d87c38404d6 List literals, fixes to implicit self property lookup, import statement and editor improvements
Mike Pavone <pavone@retrodev.com>
parents: 23
diff changeset
376 return escapeJSName(this.symbol.name) + ': ' + val;
8
04ae32e91598 Move compiler and test page related code out of parser.js
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
377 };