annotate cbackend.js @ 146:d8f92ebf1ff6

Fix string literal escaping to allow more than one of each type of escaped character
author Mike Pavone <pavone@retrodev.com>
date Fri, 09 Aug 2013 04:29:37 -0700
parents 282b8056b702
children 9de2572a34a7 18598163e3ef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1 var mainModule;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
2 var modules = {};
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
3
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
4 var nextmethodId = 0;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
5 var methodIds = {};
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
6 function getMethodId(methodName)
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
7 {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
8 if (!(methodName in methodIds)) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
9 methodIds[methodName] = nextmethodId++;
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
10
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
11 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
12 return methodIds[methodName];
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
13 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
14
122
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
15 function getOpMethodName(opname)
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
16 {
97
59a94f3ad56f Added short-circuit && and || operators
Mike Pavone <pavone@retrodev.com>
parents: 96
diff changeset
17 var optoMeth = {'+': 'ADD_', '-': 'SUB_', '*': 'MUL_', '/': 'DIV_', '%': 'MOD_', '=': 'EQ_', '!=': 'NEQ_', '<': 'LT_', '>': 'GT_', '>=': 'GEQ_', '<=': 'LEQ_', '.': 'CAT_', '&&':'if', '||':'ifnot'};
122
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
18 if (opname in optoMeth) {
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
19 return optoMeth[opname];
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
20 } else {
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
21 return opname;
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
22 }
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
23 }
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
24
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
25 op.prototype.toC = function(isReceiver) {
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
26 var method = getOpMethodName(this.op);
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
27 return 'mcall(' + getMethodId(method) + '/* operator ' + method + ' */, 2, (object *)' + this.left.toC() + ', ' + this.right.toC() + ')\n';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
28 };
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: 79
diff changeset
29 op.prototype.toCLLExpr = function(vars) {
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
30 var opmap = {'=': '==', 'xor': '^'};
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
31 return this.left.toCLLExpr(vars) + (this.op in opmap ? opmap[this.op] : this.op) + this.right.toCLLExpr(vars);
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: 79
diff changeset
32 };
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: 79
diff changeset
33 op.prototype.toCLines = function(vars, needsreturn) {
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: 79
diff changeset
34 return [ (needsreturn ? 'return (object *)' : '' ) + this.toCLLExpr(vars) + ';'];
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: 79
diff changeset
35 };
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: 79
diff changeset
36
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
38 function escapeCName(name)
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
39 {
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
40 if (name == 'self') {
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
41 return name;
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
42 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
43 name = name.replace("_", "UN_").replace(":", "CN_").replace("!", "EX_").replace('?', 'QS_').replace('@', 'AT_');
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
44 name = 'tp_' + name;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
45 return name;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
46 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
47
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
48 function getSymbolPrefix(info, symbols)
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
49 {
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
50 var pre = '';
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
51 switch(info.type) {
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
52 case 'self':
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
53
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
54 pre = (new symbol('self', symbols)).toC() + '->';
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
55 break;
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
56 case 'parent':
57
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
57 pre = (new symbol('self', symbols)).toC() + '->header.';
32
64f1d516fbfd Tiny bit of work on closures
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
58 for (var i = 0; i < info.depth; ++i) {
57
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
59 pre += (i ? '->' : '') + 'parent';
32
64f1d516fbfd Tiny bit of work on closures
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
60 }
57
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
61 pre = '((' + info.selftype + ' *)' + pre + ')->';
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
62 break;
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
63 case 'upvar':
32
64f1d516fbfd Tiny bit of work on closures
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
64 pre = 'env->';
57
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
65 for (var i = info.startdepth; i < info.depth; ++i) {
32
64f1d516fbfd Tiny bit of work on closures
Mike Pavone <pavone@retrodev.com>
parents: 31
diff changeset
66 pre += 'parent->';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
67 }
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
68 break;
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
69 case 'recupvar':
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
70 if (info.subtype == 'object') {
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
71 pre = 'self->env->';
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
72 } else {
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
73 //TODO: fill this case in if necessary
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
74 }
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
75 pre += getSymbolPrefix(info.parent);
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
76 case 'closedover':
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
77 pre = 'myenv->';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
78 }
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
79 return pre;
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
80 }
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
81
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
82 symbol.prototype.toC = function() {
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
83 var name = this.cleanName();
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
84 var info = this.symbols.find(name);
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
85 if (!info) {
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
86 throw new Error('symbol ' + name + ' not found');
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
87 }
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
88 if (info.type == 'toplevel') {
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: 67
diff changeset
89 return toplevel.moduleVar(name);
69
ba032565c7a5 Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
Mike Pavone <pavone@retrodev.com>
parents: 68
diff changeset
90 } else if (info.type == 'self' && info.def instanceof lambda) {
ba032565c7a5 Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
Mike Pavone <pavone@retrodev.com>
parents: 68
diff changeset
91 return 'mcall(' + getMethodId(name) + '/* ' + name + ' */, 1, ' + (new symbol('self', this.symbols)).toC() + ')';
ba032565c7a5 Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
Mike Pavone <pavone@retrodev.com>
parents: 68
diff changeset
92 } else if (info.type == 'parent' && info.def instanceof lambda) {
ba032565c7a5 Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
Mike Pavone <pavone@retrodev.com>
parents: 68
diff changeset
93 var obj = (new symbol('self', this.symbols)).toC() + '->header.';
ba032565c7a5 Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
Mike Pavone <pavone@retrodev.com>
parents: 68
diff changeset
94 for (var i = 0; i < info.depth; ++i) {
ba032565c7a5 Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
Mike Pavone <pavone@retrodev.com>
parents: 68
diff changeset
95 obj += (i ? '->' : '') + 'parent';
ba032565c7a5 Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
Mike Pavone <pavone@retrodev.com>
parents: 68
diff changeset
96 }
ba032565c7a5 Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
Mike Pavone <pavone@retrodev.com>
parents: 68
diff changeset
97 return 'mcall(' + getMethodId(name) + '/* ' + name + ' */, 1, ' + obj + ')';
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
98 }
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
99 return getSymbolPrefix(info, this.symbols) + escapeCName(name);
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
100 }
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: 79
diff changeset
101 symbol.prototype.toCTypeName = function() {
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: 79
diff changeset
102 return this.cleanName();
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: 79
diff changeset
103 };
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: 79
diff changeset
104 symbol.prototype.toCLLExpr = function(vars) {
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: 79
diff changeset
105 var name = this.cleanName();
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: 79
diff changeset
106 if (name in vars) {
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: 79
diff changeset
107 return 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: 79
diff changeset
108 }
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: 79
diff changeset
109 if (name == '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: 79
diff changeset
110 return '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: 79
diff changeset
111 }
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: 79
diff changeset
112 var info = this.symbols.find(name, false, 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: 79
diff changeset
113 var symbols = this.symbols;
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: 79
diff changeset
114 while (info && info.type == 'local') {
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: 79
diff changeset
115 symbols = symbols.parent;
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: 79
diff changeset
116 info = symbols.find(name, false, 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: 79
diff changeset
117 }
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: 79
diff changeset
118 if (!info) {
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: 79
diff changeset
119 return 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: 79
diff changeset
120 }
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: 79
diff changeset
121 if (info.type == 'toplevel') {
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: 79
diff changeset
122 return toplevel.moduleVar(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: 79
diff changeset
123 } else if (info.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: 79
diff changeset
124 if (info.isll || !(info.def 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: 79
diff changeset
125 return 'self->' + 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: 79
diff changeset
126 } else {
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
127 return 'mcall(' + getMethodId(name) + '/* ' + name + ' */, 1, 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: 79
diff changeset
128 }
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: 79
diff changeset
129 }
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: 79
diff changeset
130 throw new Error('Unsupported reference type ' + info.type + ' for variable ' + 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: 79
diff changeset
131 };
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: 79
diff changeset
132 symbol.prototype.toCLines = function(vars, needsreturn) {
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: 79
diff changeset
133 return [ (needsreturn ? 'return (object *)' : '' ) + this.toCLLExpr(vars) + ';' ];
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: 79
diff changeset
134 };
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
135
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
136 var declaredInts = {};
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
137
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
138 intlit.prototype.toC = function() {
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
139 var intType = 'int' + this.bits;
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
140 var str = intType + '_' + (this.val < 0 ? 'neg_' + (0-this.val).toString() : this.val.toString());
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
141 if (!(str in declaredInts)) {
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
142 toplevelcode += 'obj_' + intType + ' ' + str + ' = {{&obj_' + intType + '_meta, NULL}, ' + this.val.toString() + '};\n';
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
143 declaredInts[str] = true;
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
144 }
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
145 return '((object *)&' + str + ')';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
146 }
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: 79
diff changeset
147 intlit.prototype.toCLLExpr = function(vars) {
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: 79
diff changeset
148 return this.val.toString();
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: 79
diff changeset
149 };
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: 79
diff changeset
150 intlit.prototype.toCLines = function(vars, needsreturn) {
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: 79
diff changeset
151 return [ (needsreturn ? 'return (object *)' : '' ) + this.toCLLExpr(vars) + ';' ];
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: 79
diff changeset
152 };
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
153
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
154 floatlit.prototype.toC = function() {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
155 return 'make_float(' + this.val.toString() + ')';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
156 }
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: 79
diff changeset
157 floatlit.prototype.toCLLExpr = function(vars) {
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: 79
diff changeset
158 return this.val.toString();
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: 79
diff changeset
159 };
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: 79
diff changeset
160 floatlit.prototype.toCLines = function(vars, needsreturn) {
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: 79
diff changeset
161 return [ (needsreturn ? 'return (object *)' : '' ) + this.toCLLExpr(vars) + ';' ];
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: 79
diff changeset
162 };
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
163
41
0558dad9d061 Add basic string support
Mike Pavone <pavone@retrodev.com>
parents: 40
diff changeset
164 var declaredStrings = {};
0558dad9d061 Add basic string support
Mike Pavone <pavone@retrodev.com>
parents: 40
diff changeset
165 var nextStringId = 0;
0558dad9d061 Add basic string support
Mike Pavone <pavone@retrodev.com>
parents: 40
diff changeset
166
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
167 strlit.prototype.toC = function() {
41
0558dad9d061 Add basic string support
Mike Pavone <pavone@retrodev.com>
parents: 40
diff changeset
168 if (!(this.val in declaredStrings)) {
0558dad9d061 Add basic string support
Mike Pavone <pavone@retrodev.com>
parents: 40
diff changeset
169 //TODO: get the proper byte length
146
d8f92ebf1ff6 Fix string literal escaping to allow more than one of each type of escaped character
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
170 toplevelcode += 'string str_' + nextStringId + ' = {{&string_meta, NULL}, ' + this.val.length + ', ' + this.val.length + ', "' + this.val.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r') + '"};\n';
41
0558dad9d061 Add basic string support
Mike Pavone <pavone@retrodev.com>
parents: 40
diff changeset
171 declaredStrings[this.val] = nextStringId++;
0558dad9d061 Add basic string support
Mike Pavone <pavone@retrodev.com>
parents: 40
diff changeset
172 }
0558dad9d061 Add basic string support
Mike Pavone <pavone@retrodev.com>
parents: 40
diff changeset
173 return '((object *)&str_' + declaredStrings[this.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: 79
diff changeset
174 };
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: 79
diff changeset
175 strlit.prototype.toCLLExpr = function(vars) {
146
d8f92ebf1ff6 Fix string literal escaping to allow more than one of each type of escaped character
Mike Pavone <pavone@retrodev.com>
parents: 143
diff changeset
176 return '"' + this.val.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r') + '"';
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: 79
diff changeset
177 };
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: 79
diff changeset
178 strlit.prototype.toCLines = function(vars, needsreturn) {
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: 79
diff changeset
179 return [ (needsreturn ? 'return (object *)' : '' ) + this.toCLLExpr(vars) +';' ];
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: 79
diff changeset
180 };
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
181
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
182 listlit.prototype.toC = function() {
40
927fd7911a01 Add append message to array
Mike Pavone <pavone@retrodev.com>
parents: 39
diff changeset
183 var ret = 'make_list(' + this.val.length;
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
184 for (var i = 0; i < this.val.length; i++) {
40
927fd7911a01 Add append message to array
Mike Pavone <pavone@retrodev.com>
parents: 39
diff changeset
185 ret += ', ' + this.val[i].toC();
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
186 }
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
187 return ret + ')';
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
188 }
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
189
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
190 arraylit.prototype.toC = function() {
40
927fd7911a01 Add append message to array
Mike Pavone <pavone@retrodev.com>
parents: 39
diff changeset
191 var ret = 'make_array(' + this.val.length;
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
192 for (var i = 0; i < this.val.length; i++) {
40
927fd7911a01 Add append message to array
Mike Pavone <pavone@retrodev.com>
parents: 39
diff changeset
193 ret += ', ' + this.val[i].toC();
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
194 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
195 return ret + ')';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
196 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
197
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
198 funcall.prototype.toC = function() {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
199 var name = this.name[this.name.length-1] == ':' ? this.name.substr(0, this.name.length-1) : this.name;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
200 if (name == 'foreign') {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
201 if ((this.args[0] instanceof lambda) || (this.args[0] instanceof object)) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
202 return null;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
203 } else if(this.args[0] instanceof symbol) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
204 return this.args[0].name;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
205 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
206 throw new Error("Unexpected AST type for foreign:");
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
207 }
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: 79
diff changeset
208 } else if(name == 'llProperty:withType' || name == 'llProperty:withVars:andCode') {
9811040704ac Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents: 79
diff changeset
209 return null;
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
210 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
211 var args = this.args.slice(0, this.args.length);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
212 if (this.receiver) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
213 args.splice(0, 0, this.receiver);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
214 }
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
215 var method = false;
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
216 var funinfo = this.symbols.find(name);
72
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
217 var start = 0;
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
218 if (!funinfo || funinfo.def instanceof setter || funinfo.type == 'toplevel') {
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
219 method = true;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
220 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
221 switch(funinfo.type)
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
222 {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
223 case 'self':
72
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
224 case 'parent':
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
225 var defargs = funinfo.def.args.length;
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
226 if (!defargs || funinfo.def.args[0].name != 'self') {
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
227 defargs ++
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
228 }
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
229 if (args.length < defargs) {
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
230 if (funinfo.type == 'self') {
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
231 args.splice(0, 0, new symbol('self', this.symbols));
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
232 } else {
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
233 var obj = (new symbol('self', this.symbols)).toC() + '->header.';
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
234 for (var i = 0; i < funinfo.depth; ++i) {
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
235 obj += (i ? '->' : '') + 'parent';
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
236 }
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
237 args.splice(0, 0, ', ' + obj);
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
238 start = 1;
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
239 }
137
101fa04ee9e1 Fix calling methods on objects that are not self when self implements the method being called
Mike Pavone <pavone@retrodev.com>
parents: 135
diff changeset
240 } else if(!(args[0] instanceof symbol) || args[0].name != 'self') {
101fa04ee9e1 Fix calling methods on objects that are not self when self implements the method being called
Mike Pavone <pavone@retrodev.com>
parents: 135
diff changeset
241 funinfo = null;
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
242 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
243 method = true;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
244 break;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
245 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
246 }
72
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
247 for (var i = start; i < args.length; i++) {
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
248 args[i] = ', ' + (!i && method ? '(object *)(' : '') + args[i].toC() + (!i && method ? ')' : '');
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
249 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
250 var callpart;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
251 if (method) {
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
252 if (funinfo && funinfo.type == 'self' && funinfo.def.name) {
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
253 callpart = funinfo.def.name + '(' + (funinfo.def.symbols.parent.needsenv ? (new symbol('self', this.symbols)).toC() + '->env' : 'NULL' );
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
254 } else {
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
255 callpart = 'mcall(' + getMethodId(name) + '/* ' + name + ' */';
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
256 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
257 } else {
55
93ddb4ad6fcb Fix some nested closure bugs
Mike Pavone <pavone@retrodev.com>
parents: 54
diff changeset
258 callpart = 'ccall(' + (new symbol(name, this.symbols)).toC();
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
259 }
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
260 return callpart + ', ' + args.length + args.join('') + ')';
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: 79
diff changeset
261 };
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: 79
diff changeset
262 funcall.prototype.toCTypeName = function() {
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: 79
diff changeset
263 switch(this.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: 79
diff changeset
264 {
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: 79
diff changeset
265 case 'ptr:':
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: 79
diff changeset
266 case 'ptr':
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: 79
diff changeset
267 var receiver = this.receiver ? this.receiver : this.args[0];
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: 79
diff changeset
268 return receiver.toCTypeName() + ' *';
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: 79
diff changeset
269 break;
143
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
270 case 'struct:':
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
271 case 'struct':
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
272 var receiver = this.receiver ? this.receiver : this.args[0];
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
273 return 'struct ' + receiver.toCTypeName();
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
274 break;
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: 79
diff changeset
275 default:
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: 79
diff changeset
276 throw new Error('invalid use of funcall expression where a C type name is expected');
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: 79
diff changeset
277 }
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: 79
diff changeset
278 };
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: 79
diff changeset
279 funcall.prototype.toCLines = function(vars, needsreturn) {
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: 79
diff changeset
280 var lines = [];
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: 79
diff changeset
281 var name = this.name[this.name.length-1] == ':' ? this.name.substr(0, this.name.length-1) : this.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: 79
diff changeset
282 var args = this.args.slice(0, this.args.length);
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: 79
diff changeset
283 if (this.receiver) {
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: 79
diff changeset
284 args.splice(0, 0, [this.receiver]);
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: 79
diff changeset
285 }
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: 79
diff changeset
286 switch(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: 79
diff changeset
287 {
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: 79
diff changeset
288 case 'if':
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: 79
diff changeset
289 lines.push('if (' + this.args[0].toCLLExpr(vars) + ') {');
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: 79
diff changeset
290 var blines = this.args[1].toCLines(vars, needsreturn);
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: 79
diff changeset
291 for (var i in blines) {
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: 79
diff changeset
292 lines.push('\t' + blines[i]);
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: 79
diff changeset
293 }
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: 79
diff changeset
294 if (needsreturn) {
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: 79
diff changeset
295 lines.push('} 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: 79
diff changeset
296 lines.push('\t return module_false;');
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: 79
diff changeset
297 lines.push('}');
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: 79
diff changeset
298 } 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: 79
diff changeset
299 lines.push('}');
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: 79
diff changeset
300 }
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: 79
diff changeset
301 break;
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: 79
diff changeset
302 case 'if: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: 79
diff changeset
303 lines.push('if (' + this.args[0].toCLLExpr(vars) + ') {');
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: 79
diff changeset
304 var blines = this.args[1].toCLines(vars, needsreturn);
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: 79
diff changeset
305 for (var i in blines) {
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: 79
diff changeset
306 lines.push('\t' + blines[i]);
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: 79
diff changeset
307 }
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: 79
diff changeset
308 lines.push('} 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: 79
diff changeset
309 blines = this.args[2].toCLines(vars, needsreturn);
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: 79
diff changeset
310 for (var i in blines) {
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: 79
diff changeset
311 lines.push('\t' + blines[i]);
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: 79
diff changeset
312 }
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: 79
diff changeset
313 lines.push('}');
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: 79
diff changeset
314 break;
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: 79
diff changeset
315 case 'while:do':
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: 79
diff changeset
316 if (needsreturn) {
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: 79
diff changeset
317 throw new Error("while:do can't be last statement in llMessage code block");
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: 79
diff changeset
318 }
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: 79
diff changeset
319 lines.push('while (' + this.args[0].toCLLExpr(vars) + ') {');
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: 79
diff changeset
320 var blines = this.args[1].toCLines(vars);
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: 79
diff changeset
321 for (var i in blines) {
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: 79
diff changeset
322 lines.push('\t' + blines[i]);
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: 79
diff changeset
323 }
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: 79
diff changeset
324 lines.push('}');
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: 79
diff changeset
325 break;
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: 79
diff changeset
326 default:
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: 79
diff changeset
327 lines.push( (needsreturn ? 'return (object *)' : '') + this.toCLLExpr(vars) + ';');
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: 79
diff changeset
328 }
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: 79
diff changeset
329 return lines;
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: 79
diff changeset
330 };
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: 79
diff changeset
331
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: 79
diff changeset
332 funcall.prototype.toCLLExpr = function(vars) {
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: 79
diff changeset
333 var name = this.name[this.name.length-1] == ':' ? this.name.substr(0, this.name.length-1) : this.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: 79
diff changeset
334 var args = this.args.slice(0, this.args.length);
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: 79
diff changeset
335 if (this.receiver) {
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: 79
diff changeset
336 if(this.args.length == 0) {
143
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
337 if (this.receiver instanceof symbol && this.receiver.name in vars && vars[this.receiver.name].substr(-1) != "*") {
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
338 return this.receiver.toCLLExpr(vars) + '.' + this.name;
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
339 } else {
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
340 return this.receiver.toCLLExpr(vars) + '->' + this.name;
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
341 }
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: 79
diff changeset
342 } else if (this.args.length == 1 && name[name.length-1] == '!') {
143
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
343 if (this.receiver instanceof symbol && this.receiver.name in vars && vars[this.receiver.name].substr(-1) != "*") {
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
344 return this.receiver.toCLLExpr(vars) + '.' + this.name.substr(0, name.length-1) + ' = ' + args[0].toCLLExpr(vars);
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
345 } else {
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
346 return this.receiver.toCLLExpr(vars) + '->' + this.name.substr(0, name.length-1) + ' = ' + args[0].toCLLExpr(vars);
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
347 }
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: 79
diff changeset
348 } 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: 79
diff changeset
349 args.splice(0, 0, this.receiver);
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: 79
diff changeset
350 }
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: 79
diff changeset
351 }
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: 79
diff changeset
352 switch(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: 79
diff changeset
353 {
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: 79
diff changeset
354 case 'if':
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
355 return '((' + args[0].toCLLExpr(vars) + ') ? (' + args[1].toCLLExpr(vars) + ') : 0)';
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: 79
diff changeset
356 case 'if:else':
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
357 return '((' + args[0].toCLLExpr(vars) + ') ? (' + args[1].toCLLExpr(vars) + ') : (' + args[2].toCLLExpr(vars) + '))';
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: 79
diff changeset
358 case 'while:do':
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
359 throw new Error('while:do not allowed in expression context in llMessage block');
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: 79
diff changeset
360 case 'addr_of':
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: 79
diff changeset
361 return '&(' + args[0].toCLLExpr(vars) + ')';
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: 79
diff changeset
362 case 'sizeof':
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: 79
diff changeset
363 return 'sizeof(' + args[0].toCTypeName() + ')';
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: 79
diff changeset
364 case 'get':
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: 79
diff changeset
365 return args[0].toCLLExpr(vars) + '[' + args[1].toCLLExpr(vars) + ']';
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: 79
diff changeset
366 case 'set':
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: 79
diff changeset
367 return args[0].toCLLExpr(vars) + '[' + args[1].toCLLExpr(vars) + '] = ' + args[2].toCLLExpr(vars);
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: 79
diff changeset
368 case 'not':
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: 79
diff changeset
369 return '!(' + args[0].toCLLExpr(vars) + ')';
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
370 case 'mcall':
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
371 if (args[0] instanceof symbol) {
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
372 args[0] = new intlit(getMethodId(args[0].name));
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
373 }
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: 79
diff changeset
374 default:
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: 79
diff changeset
375 for (var i in args) {
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: 79
diff changeset
376 args[i] = args[i].toCLLExpr(vars);
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: 79
diff changeset
377 }
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: 79
diff changeset
378 return name + '(' + args.join(', ') + ')';
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: 79
diff changeset
379 }
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: 79
diff changeset
380 };
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
381
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
382 function cObject(name) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
383 this.name = name;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
384 this.slots = {};
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
385 this.properties = [];
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
386 this.values = [];
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
387 this.slotvars = {};
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
388 this.includes = {};
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
389 this.parent = 'NULL';
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
390 this.init = [];
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
391 this.initmsgadded = false;
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
392 }
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
393
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
394 cObject.prototype.addInclude = function(includefile) {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
395 this.includes[includefile] = true;
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
396 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
397
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
398 cObject.prototype.addMessage = function(msgname, implementation) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
399 var methodid = getMethodId(msgname);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
400 var trunc = methodid & 0xF;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
401 if (!(trunc in this.slots)) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
402 this.slots[trunc] = [];
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
403 }
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
404 this.slots[trunc].push([methodid, '\t\t' + implementation.lines.join('\n\t\t') + '\n', msgname]);
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
405 if (!(trunc in this.slotvars)) {
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
406 this.slotvars[trunc] = {};
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
407 }
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
408 for (var varname in implementation.vars) {
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
409 this.slotvars[trunc][varname] = implementation.vars[varname];
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
410 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
411 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
412
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
413 cObject.prototype.addProperty = function(propname, value, type) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
414 if (type != undefined) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
415 this.properties.push([propname, type]);
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
416 if (value !== null) {
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
417 this.values.push(value);
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
418 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
419 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
420 var escaped = escapeCName(propname);
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
421 this.addMessage(propname, {
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
422 vars: {},
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
423 lines: [
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
424 'return self->' + escaped + ';'
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
425 ]});
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
426 this.addMessage(propname + '!', {
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
427 vars: {},
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
428 lines: [
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
429 'self->' + escaped + ' = va_arg(args, object *);',
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
430 'return (object *)self;'
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
431 ]});
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
432 this.properties.push(escaped);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
433 this.values.push(value);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
434 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
435 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
436
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
437 cObject.prototype.addInit = function(statement) {
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
438 this.init.push(statement);
140
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
439 };
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
440
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
441 cObject.prototype.addImport = function(symbols, source) {
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
442 this.imported.push(source);
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
443 var importNum = imported.length - 1;
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
444 if (symbols) {
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
445 each(symbols, function(i, sym) {
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
446 this.addMessage(sym.name, {
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
447 vars: {},
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
448 lines: [
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
449 'return self->import_' + importNum + '->meta->meth_lookup[method_id & 0xF](method_id, num_args, self->import_' + importNum + ', args);'
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
450 ]
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
451 });
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
452 });
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
453 } else {
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
454 //TODO: handle proxying for unimplemented methods
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
455 }
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
456 };
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
457
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
458 cObject.prototype.checkInitMsg = function() {
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
459 if (!this.initmsgadded && this.init.length) {
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
460 var init = this.init.slice(0, this.init.length);
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
461 init.push('return (object *)self;');
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
462 this.addMessage('_init', {
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
463 vars: {},
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
464 lines: init
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
465 });
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
466 this.initmsgadded = true;
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
467 }
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
468 }
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
469
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: 67
diff changeset
470 cObject.prototype.populateSymbols = function() {};
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
471
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
472 cObject.prototype.toEarlyCDef = function() {
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
473 this.checkInitMsg();
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
474 var includes = '';
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
475 for (var file in this.includes) {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
476 includes += '#include ' + file + '\n';
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
477 }
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
478 var objdef = 'typedef struct ' + this.name + ' {\n\tobject header;\n';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
479 for (var i in this.properties) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
480 if (this.properties[i] instanceof Array) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
481 objdef += '\t' + this.properties[i][1] + ' ' + this.properties[i][0] + ';\n';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
482 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
483 objdef += '\tobject * ' + this.properties[i] + ';\n'
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
484 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
485 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
486 objdef += '} ' + this.name + ';\nobj_meta ' + this.name + '_meta;\n';
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
487 return includes + objdef;
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
488 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
489
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
490 cObject.prototype.toCDef = function() {
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
491 this.checkInitMsg();
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
492 var slotdefs = '';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
493 var metadef = 'obj_meta ' + this.name + '_meta = {sizeof(' + this.name +'), {';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
494 for (var i = 0; i < 16; i++) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
495 if (i) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
496 metadef += ', ';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
497 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
498 if (i in this.slots) {
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
499 slotdefs += 'object * ' + this.name + '_slot_' + i + '(uint32_t method_id, uint32_t num_params, object * oself, va_list args) {\n\t' +
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
500 this.name + ' *self = (' + this.name + ' *)oself;\n';
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
501 for (var varname in this.slotvars[i]) {
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
502 slotdefs += '\t' + this.slotvars[i][varname] + ' ' + varname + ';\n';
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
503 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
504 if (this.slots[i].length == 1) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
505 slotdefs += '\tif (method_id == ' + this.slots[i][0][0] + ') { /* ' + this.slots[i][0][2] + '*/\n' +
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
506 '\t\t' + this.slots[i][0][1] + '\n' +
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
507 '\t}\n' +
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
508 '\treturn no_impl(method_id, num_params, (object *)self, args);\n}\n';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
509 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
510 slotdefs += '\tswitch(method_id) {\n';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
511 for (j in this.slots[i]) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
512 slotdefs += '\t\tcase ' + this.slots[i][j][0] + ': /* ' + this.slots[i][j][2] + '*/\n' +
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
513 '\t\t\t' + this.slots[i][j][1] + '\n';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
514 }
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
515 slotdefs += '\t\tdefault:\n' +
57
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
516 '\t\t\treturn no_impl(method_id, num_params, (object *)self, args);\n\t}\n}\n';
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
517
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
518 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
519 metadef += this.name + '_slot_' + i;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
520 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
521 metadef += 'no_impl';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
522 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
523 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
524 metadef += '}};\n';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
525 return slotdefs + metadef;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
526 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
527
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
528 cObject.prototype.toCInstance = function() {
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
529 this.checkInitMsg();
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
530 var ret = 'make_object(&' + this.name + '_meta, ' + this.parent + ', ' + this.values.length + (this.values.length ? ', ' : '') + this.values.join(', ') + ')';
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
531 if (this.initmsgadded) {
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
532 ret = 'mcall(' + getMethodId('_init') + ', 1, ' + ret + ')'
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
533 }
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
534 return ret;
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
535 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
536
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
537 cObject.prototype.toC = function() {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
538 forwarddec += this.toEarlyCDef();
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
539 toplevelcode += this.toCDef();
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
540 return this.toCInstance();
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
541 }
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
542
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
543 var nextobject = 0;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
544
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: 79
diff changeset
545
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: 79
diff changeset
546 object.prototype.toCObject = function() {
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
547 var messages = this.messages;
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: 79
diff changeset
548 if (!this.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: 79
diff changeset
549 this.name = 'object_' + nextobject++;
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: 79
diff changeset
550 }
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: 79
diff changeset
551 var me = new cObject(this.name);
57
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
552 this.symbols.typename = me.name;
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
553 if (this.symbols.needsenv) {
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
554 me.addProperty('env', this.symbols.envVar(), 'struct ' + this.symbols.getEnvType() + ' * ');
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
555 me.hasenv = true;
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
556 }
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
557 if (this.symbols.needsparent && !(this.symbols.parent instanceof osymbols)) {
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
558 me.parent = '(object *)(' + (new symbol('self', this.symbols.parent)).toC() + ')';
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
559 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
560 for (var i in messages) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
561 if (messages[i] instanceof funcall) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
562 if (messages[i].name == 'import:' && messages[i].args.length == 1) {
140
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
563 me.addImport(false, messages[i].args[0]);
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
564 } else if(messages[i].name == 'import:from:' && messages[i].args.length == 2) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
565 var importsyms = [];
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
566 each(messages[i].args[0].val, function(i, el) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
567 if (!(el instanceof symbol)) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
568 throw new Error('Names in import:from statement must be symbols');
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
569 }
140
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
570 importsyms.push(el);
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
571 });
140
bf8f75b69048 Minor progress towards supporting imports in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 122
diff changeset
572 me.addImport(importsyms, messages[i].args[1]);
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: 79
diff changeset
573 } else if(messages[i].name == 'llProperty:withType:' && messages[i].args.length == 2) {
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: 79
diff changeset
574 me.addProperty(messages[i].args[0].name, null, messages[i].args[1].toCTypeName())
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: 79
diff changeset
575 } else if(messages[i].name == 'llMessage:withVars:andCode:' && messages[i].args.length == 3) {
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: 79
diff changeset
576 var msgname = messages[i].args[0].name
9811040704ac Add support for llMessage:withVars:andCode and llProperty:withType for specifying low level code without having to stick C inside the compiler. Redo array built-in type to use this feature.
Mike Pavone <pavone@retrodev.com>
parents: 79
diff changeset
577 var rawvars = messages[i].args[1].expressions;
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: 79
diff changeset
578 var vars = {};
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: 79
diff changeset
579 for(var v in rawvars) {
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: 79
diff changeset
580 vars[rawvars[v].symbol.name] = rawvars[v].expression.toCTypeName();
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: 79
diff changeset
581 }
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: 79
diff changeset
582 me.addMessage(msgname, {
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: 79
diff changeset
583 vars: vars,
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: 79
diff changeset
584 lines: messages[i].args[2].toCLines(vars, 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: 79
diff changeset
585 });
143
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
586 } else if(messages[i].name == 'includeSystemHeader:' && messages[i].args.length == 1) {
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
587 me.addInclude("<" + messages[i].args[0].val + ">");
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
588 } else {
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
589
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: 79
diff changeset
590 throw new Error('Only import and import:from calls allowed in object context. ' + messages[i].name + 'with ' + messages[i].args.length + ' arguments found instead.');
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
591 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
592 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
593 messages[i].toCObject(me);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
594 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
595 }
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
596
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: 79
diff changeset
597 return me;
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: 79
diff changeset
598 };
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: 79
diff changeset
599
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: 79
diff changeset
600 object.prototype.toC = function() {
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: 79
diff changeset
601 return this.toCObject().toC();
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: 79
diff changeset
602 };
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
603
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
604 var toplevelcode;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
605 var forwarddec;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
606
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
607 function addBinaryOp(cobject, opname, cop, objtype)
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
608 {
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
609 cobject.addMessage(opname, {
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
610 vars: {ret: objtype + ' *', argb: objtype +' *'},
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
611 lines: [
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
612 'argb = va_arg(args, ' + objtype + ' *);',
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
613 'ret = (' + objtype + ' *)make_object(&' + objtype + '_meta, NULL, 0);',
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
614 'ret->num = self->num ' + cop + ' argb->num;',
52
ab6217b8ae4c Remove some C compiler warnings due to sloppy native code
Mike Pavone <pavone@retrodev.com>
parents: 49
diff changeset
615 'return &(ret->header);'
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
616 ]
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
617 });
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
618 }
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
619
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
620 function addCompOp(cobject, opname, cop, objtype)
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
621 {
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
622 cobject.addMessage(opname, {
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
623 vars: {argb: objtype + ' *'},
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
624 lines: [
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
625 'argb = va_arg(args, ' + objtype + ' *);',
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
626 'if (self->num ' + cop + ' argb->num) {',
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: 67
diff changeset
627 ' return ' + toplevel.moduleVar('true') + ';',
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
628 '}',
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: 67
diff changeset
629 'return ' + toplevel.moduleVar('false') + ';',
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
630 ]
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
631 });
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
632 }
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
633
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
634 function makeInt(bits)
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
635 {
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
636 var typename = 'obj_int' + bits;
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
637 var intObj = new cObject(typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
638 intObj.addProperty('num', null, 'int' + bits +'_t');
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
639 addBinaryOp(intObj, 'ADD_', '+', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
640 addBinaryOp(intObj, 'SUB_', '-', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
641 addBinaryOp(intObj, 'MUL_', '*', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
642 addBinaryOp(intObj, 'DIV_', '/', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
643 addBinaryOp(intObj, 'MOD_', '%', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
644 addBinaryOp(intObj, 'or', '|', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
645 addBinaryOp(intObj, 'xor', '^', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
646 addBinaryOp(intObj, 'and', '&', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
647 addBinaryOp(intObj, 'lshift:by', '<<', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
648 addBinaryOp(intObj, 'rshift:by', '>>', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
649 addCompOp(intObj, 'LT_', '<', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
650 addCompOp(intObj, 'GT_', '>', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
651 addCompOp(intObj, 'EQ_', '==', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
652 addCompOp(intObj, 'NEQ_', '!=', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
653 addCompOp(intObj, 'GEQ_', '>=', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
654 addCompOp(intObj, 'LEQ_', '<=', typename);
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
655 intObj.addInclude('<string.h>');
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
656 //-9223372036854775808
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
657 //01234567890123456789
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
658 intObj.addMessage('string', {
43
27a2167663dd Improve compiler error reporting. Fix operator associativity. Add some more string operations and a string ops sample
Mike Pavone <pavone@retrodev.com>
parents: 42
diff changeset
659 vars: {str: 'string *'},
27a2167663dd Improve compiler error reporting. Fix operator associativity. Add some more string operations and a string ops sample
Mike Pavone <pavone@retrodev.com>
parents: 42
diff changeset
660 lines: [
27a2167663dd Improve compiler error reporting. Fix operator associativity. Add some more string operations and a string ops sample
Mike Pavone <pavone@retrodev.com>
parents: 42
diff changeset
661 'str = (string *)make_object(&string_meta, NULL, 0);',
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
662 'str->data = GC_MALLOC(' + (bits == 64 ? 21 : 12) + ');',
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
663 'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'d", self->num);',
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
664 'str->len = str->bytes = strlen(str->data);',
52
ab6217b8ae4c Remove some C compiler warnings due to sloppy native code
Mike Pavone <pavone@retrodev.com>
parents: 49
diff changeset
665 'return &(str->header);'
43
27a2167663dd Improve compiler error reporting. Fix operator associativity. Add some more string operations and a string ops sample
Mike Pavone <pavone@retrodev.com>
parents: 42
diff changeset
666 ]
27a2167663dd Improve compiler error reporting. Fix operator associativity. Add some more string operations and a string ops sample
Mike Pavone <pavone@retrodev.com>
parents: 42
diff changeset
667 });
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
668 //7FFFFFFFFFFFFFFF
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
669 //01234567890123456789
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
670 intObj.addMessage('hex', {
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
671 vars: {str: 'string *'},
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
672 lines: [
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
673 'str = (string *)make_object(&string_meta, NULL, 0);',
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
674 'str->data = GC_MALLOC(' + (bits == 64 ? 17 : 9) + ');',
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
675 'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'X", self->num);',
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
676 'str->len = str->bytes = strlen(str->data);',
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
677 'return &(str->header);'
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
678 ]
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
679 });
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
680 intObj.addMessage('isInteger?', {
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
681 vars: {},
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
682 lines: [
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
683 'return ' + toplevel.moduleVar('true') + ';'
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
684 ]
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
685 });
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
686 intObj.addMessage('hash', {
79
7f635666c73d Add hash and int32 messages to string. Add hash message to int32. Update compile script
Mike Pavone <pavone@retrodev.com>
parents: 78
diff changeset
687 vars: {},
7f635666c73d Add hash and int32 messages to string. Add hash message to int32. Update compile script
Mike Pavone <pavone@retrodev.com>
parents: 78
diff changeset
688 lines: [
7f635666c73d Add hash and int32 messages to string. Add hash message to int32. Update compile script
Mike Pavone <pavone@retrodev.com>
parents: 78
diff changeset
689 'return &(self->header);'
7f635666c73d Add hash and int32 messages to string. Add hash message to int32. Update compile script
Mike Pavone <pavone@retrodev.com>
parents: 78
diff changeset
690 ]
7f635666c73d Add hash and int32 messages to string. Add hash message to int32. Update compile script
Mike Pavone <pavone@retrodev.com>
parents: 78
diff changeset
691 });
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
692 return intObj;
45
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
693 }
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
694
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
695 function makeArray()
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
696 {
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: 79
diff changeset
697 var arrayfile = toplevel.names['array'];
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: 79
diff changeset
698 var ast = parseFile(arrayfile.path + '/' + arrayfile.file);
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: 79
diff changeset
699 ast.name = 'array';
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: 79
diff changeset
700 ast.populateSymbols(toplevel);
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: 79
diff changeset
701 return ast.toCObject();
45
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
702 }
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
703
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
704 function makeString()
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
705 {
87
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
706 var arrayfile = toplevel.names['string'];
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
707 var ast = parseFile(arrayfile.path + '/' + arrayfile.file);
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
708 ast.name = 'string';
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
709 ast.populateSymbols(toplevel);
25bc8a5ab41e Improve llMessage a bit and move implementation of string into string.tp module using llMessage. Update TASKS list
Mike Pavone <pavone@retrodev.com>
parents: 84
diff changeset
710 return ast.toCObject();
45
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
711 }
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
712
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
713 function makelambda()
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
714 {
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
715 var clos = new cObject('lambda');
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
716 clos.addProperty('env', null, 'void *');
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
717 clos.addProperty('func', null, 'closure_func');
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
718 clos.addMessage('while:do', {
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: 67
diff changeset
719 vars: {action: 'lambda *', ret: 'object *'},
45
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
720 lines: [
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
721 'action = va_arg(args, lambda *);',
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: 67
diff changeset
722 'ret = ' + toplevel.moduleVar('true') + ';',
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: 67
diff changeset
723 'while(' + toplevel.moduleVar('true') + ' == ccall(self, 0)) {',
45
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
724 ' ccall(action, 0);',
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
725 '}',
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
726 'return ret;'
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
727 ]
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
728 });
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
729 return clos;
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
730 }
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
731
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
732 function builtinTypes()
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
733 {
135
f98790d8a53d Add int64, int16 and int8. Also add hex method to integer types.
Mike Pavone <pavone@retrodev.com>
parents: 134
diff changeset
734 return [makeInt(64), makeInt(32), makeInt(16), makeInt(8), makeArray(), makeString(), makelambda()];
45
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
735 }
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
736
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
737 function addBuiltinModules(toplevel)
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
738 {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
739 var os = new cObject('mod_obj_os');
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
740 os.addInclude('<sys/stat.h>');
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
741 os.addInclude('<fcntl.h>');
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
742 os.addMessage('write', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
743 vars: {str: 'string *', intret: 'obj_int32 *', filedes: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
744 lines: [
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
745 'filedes = va_arg(args, obj_int32 *);',
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
746 'str = va_arg(args, string *);',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
747 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
748 'intret->num = write(filedes->num, str->data, str->bytes);',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
749 'return &(intret->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
750 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
751 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
752 os.addMessage('read', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
753 vars: {str: 'string *', size: 'obj_int32 *', filedes: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
754 lines: [
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
755 'filedes = va_arg(args, obj_int32 *);',
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
756 'size = va_arg(args, obj_int32 *);',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
757 'str = (string *)make_object(&string_meta, NULL, 0);',
78
abc6f3d644a4 Use Boehm-GC for garbage collection. Also make no_impl print on stderr rather than standard in and return a non-zero error code.
Mike Pavone <pavone@retrodev.com>
parents: 72
diff changeset
758 'str->data = GC_MALLOC_ATOMIC(size->num + 1);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
759 'str->length = str->bytes = read(filedes->num, str->data, size->num);',
58
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 57
diff changeset
760 'if (str->bytes < 0) { str->bytes = str->length = 0; }',
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 57
diff changeset
761 'str->data[str->bytes] = 0;',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
762 'return &(str->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
763 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
764 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
765 os.addMessage('open', {
49
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
766 vars: {str: 'string *', flags: 'obj_int32 *', filedes: 'obj_int32 *', perm: 'obj_int32 *'},
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
767 lines: [
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
768 'str = va_arg(args, string *);',
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
769 'flags = va_arg(args, obj_int32 *);',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
770 'filedes = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
49
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
771 'if (num_params == 3) {',
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
772 ' filedes->num = open(str->data, flags->num);',
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
773 '} else if (num_params == 4) {',
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
774 ' perm = va_arg(args, obj_int32 *);',
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
775 ' filedes->num = open(str->data, flags->num, perm->num);',
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
776 '} else {',
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
777 ' filedes->num = -1;',
f2cda2e6f70e Fix os open to optionally take a file permission bit parameter. Update example to use this parameter. Add support for hex and binary integer literals
Mike Pavone <pavone@retrodev.com>
parents: 48
diff changeset
778 '}',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
779 'return &(filedes->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
780 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
781 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
782 os.addMessage('close', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
783 vars: {filedes: 'obj_int32 *', intret: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
784 lines: [
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
785 'filedes = va_arg(args, obj_int32 *);',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
786 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
787 'intret->num = close(filedes->num);',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
788 'return &(intret->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
789 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
790 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
791 os.addMessage('O_RDONLY', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
792 vars: {intret: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
793 lines: [
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
794 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
795 'intret->num = O_RDONLY;',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
796 'return &(intret->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
797 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
798 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
799 os.addMessage('O_WRONLY', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
800 vars: {intret: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
801 lines: [
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
802 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
803 'intret->num = O_WRONLY;',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
804 'return &(intret->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
805 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
806 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
807 os.addMessage('O_RDWR', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
808 vars: {intret: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
809 lines: [
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
810 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
811 'intret->num = O_RDWR;',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
812 'return &(intret->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
813 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
814 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
815 os.addMessage('O_CREAT', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
816 vars: {intret: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
817 lines: [
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
818 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
819 'intret->num = O_CREAT;',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
820 'return &(intret->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
821 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
822 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
823 os.addMessage('O_APPEND', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
824 vars: {intret: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
825 lines: [
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
826 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
827 'intret->num = O_APPEND;',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
828 'return &(intret->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
829 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
830 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
831 os.addMessage('O_TRUNC', {
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
832 vars: {intret: 'obj_int32 *'},
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
833 lines: [
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
834 'intret = (obj_int32 *)make_object(&obj_int32_meta, NULL, 0);',
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
835 'intret->num = O_TRUNC;',
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
836 'return &(intret->header);'
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
837 ]
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
838 });
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
839 toplevel.names['os'] = os;
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
840 }
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
841
66
25b697c91629 Finish implementation of external module access
Mike Pavone <pavone@retrodev.com>
parents: 61
diff changeset
842 modulefile.prototype.toC = function(){
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: 67
diff changeset
843 return this.ast.toCModuleInstance();
66
25b697c91629 Finish implementation of external module access
Mike Pavone <pavone@retrodev.com>
parents: 61
diff changeset
844 };
25b697c91629 Finish implementation of external module access
Mike Pavone <pavone@retrodev.com>
parents: 61
diff changeset
845
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
846 function processUsedToplevel(toplevel)
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
847 {
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: 67
diff changeset
848 var alwaysused = ['true', 'false'];
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
849 var ret = '';
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
850 var modulenum = 0;
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: 67
diff changeset
851 var visited = {};
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: 67
diff changeset
852 for (var i in alwaysused) {
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: 79
diff changeset
853 toplevel.used[alwaysused[i]] = true;
66
25b697c91629 Finish implementation of external module access
Mike Pavone <pavone@retrodev.com>
parents: 61
diff changeset
854 }
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: 79
diff changeset
855 var newused = Object.keys(toplevel.used);
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: 79
diff changeset
856 var allused = newused;
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: 67
diff changeset
857 while (newused.length) {
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: 67
diff changeset
858 for (var i in newused) {
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: 67
diff changeset
859 debugprint('//---module', newused[i], '--- populate symbols');
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: 67
diff changeset
860 forwarddec += 'object * ' + toplevel.moduleVar(newused[i]) + ';\n';
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: 67
diff changeset
861 toplevel.names[newused[i]].populateSymbols(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: 67
diff changeset
862 visited[newused[i]] = true;
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: 67
diff changeset
863 }
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: 67
diff changeset
864 newused = [];
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: 67
diff changeset
865 for (var symbol in toplevel.used) {
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: 67
diff changeset
866 if (!(symbol in visited)) {
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: 67
diff changeset
867 debugprint('//found new usage of module', symbol);
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: 67
diff changeset
868 newused.push(symbol);
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: 67
diff changeset
869 allused.push(symbol);
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: 67
diff changeset
870 }
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: 67
diff changeset
871 }
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: 67
diff changeset
872 }
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
873
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: 67
diff changeset
874 for (var i = allused.length-1; i >= 0; i--) {
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: 67
diff changeset
875 var symbol = allused[i];
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: 79
diff changeset
876 debugprint('//---module', symbol, '(' + i +')--- compile');
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: 67
diff changeset
877 ret += '\t' + toplevel.moduleVar(symbol) + ' = ' + toplevel.names[symbol].toC() + ';\n';
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
878 }
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
879 return ret;
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
880 }
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
881
45
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
882 function makeCProg(obj)
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
883 {
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: 79
diff changeset
884 forwarddec = toplevelcode = '';
45
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
885 var builtins = builtinTypes();
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
886 for (var i in builtins) {
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
887 forwarddec += builtins[i].toEarlyCDef();
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
888 toplevelcode += builtins[i].toCDef();
2a9c6eed0c70 Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents: 43
diff changeset
889 }
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
890 addBuiltinModules(toplevel);
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
891 debugprint('//------POPULATING SYMBOLS-----');
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
892 obj.populateSymbols(toplevel);
48
18ab96287c3a Add builtin module os containing some baisc POSIX file IO
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
893 var moduleinit = processUsedToplevel(toplevel);
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
894 debugprint('//------COMPILING AST-----');
60
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
895 var rest = 'object * mainModule() {\n' + moduleinit + '\tmain_module = ' + obj.toCModuleInstance() + ';\n\treturn main_module;\n}\n';
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
896 return '#include "runtime/proghead.inc"\n' +
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
897 '#define METHOD_ID_MAIN ' + getMethodId('main') + '\n' +
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
898 forwarddec + toplevelcode + rest + '#include "runtime/progfoot.inc"\n';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
899 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
900
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
901 object.prototype.toCModule = function() {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
902 return makeCProg(this);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
903 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
904
60
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
905 object.prototype.toCModuleInstance = function() {
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
906 return this.toC();
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
907 }
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
908
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
909 lambda.prototype.toC = function() {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
910 var args = this.args ? this.args.slice(0, this.args.length) : [];
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
911 var exprs = this.expressions;
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
912 debugprint('//', this.name);
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
913 if (Object.keys(this.symbols.closedover).length) {
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
914 this.symbols.envtype = this.name + '_env';
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
915 forwarddec += 'typedef struct ' + this.symbols.envtype + ' ' + this.symbols.envtype + ';\n'
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
916 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
917 if (this.selftype) {
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
918 this.symbols.defineVar('self', this.selftype);
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
919 if (args[0] && args[0].cleanName() == 'self') {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
920 args.splice(0, 1);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
921 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
922 var offset = 1;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
923 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
924 var offset = 0;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
925 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
926 for (var i = 0; i < args.length; ++i) {
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
927 var argname = args[i].toC();
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
928
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
929 args[i] = (argname.indexOf('->') < 0 ? '\tobject * ' : '\t') + argname + ' = va_arg(args, object *);\n';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
930 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
931 var compiled = []
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
932 for (var i in exprs) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
933 var js = exprs[i].toC();
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
934 if (js) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
935 compiled.push(indent(js));
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
936 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
937 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
938 exprs = compiled;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
939 if (exprs.length) {
72
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
940 exprs[exprs.length-1] = 'return (object *)(' + exprs[exprs.length-1] + ');';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
941 }
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
942
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
943 if (Object.keys(this.symbols.closedover).length) {
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
944 forwarddec += 'struct ' + this.name + '_env {\n';
57
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
945 if (this.symbols.needsParentEnv) {
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
946 forwarddec += '\tstruct ' + this.symbols.parentEnvType() + ' * parent;\n';
08ae75d90dc2 Add != operator. Fix more closure bugs.
Mike Pavone <pavone@retrodev.com>
parents: 55
diff changeset
947 }
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
948 for (var varname in this.symbols.closedover) {
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
949 if (varname == 'self' && this.selftype) {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
950 forwarddec += '\tstruct ' + this.selftype + ' * self;\n';
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
951 } else {
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
952 forwarddec += '\tobject * ' + escapeCName(varname) + ';\n';
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
953 }
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
954 }
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
955 forwarddec += '};\n'
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
956
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
957 var myenvinit = '\t' + this.name + '_env * myenv = GC_MALLOC(sizeof(' + this.name + '_env));\n';
58
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 57
diff changeset
958 if (this.symbols.needsParentEnv) {
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 57
diff changeset
959 myenvinit += '\tmyenv->parent = env;\n';
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 57
diff changeset
960 }
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
961 this.symbols.envtype = this.name + '_env';
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
962 } else {
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
963 var myenvinit = '';
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
964 }
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
965 forwarddec += 'object *' + this.name + ' (' + this.symbols.parentEnvType() + ' * env, uint32_t num_args, ...);\n';
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
966
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
967 toplevelcode += 'object * ' + this.name + ' ( ' + this.symbols.parentEnvType() + ' * env, uint32_t num_args, ...) {\n\tva_list args;\n' + myenvinit + '\tva_start(args, num_args);\n';
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
968 if (this.selftype) {
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
969 var selfvar = (new symbol('self', this.symbols)).toC();
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
970 if (selfvar == 'self') {
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
971 toplevelcode += '\t' + this.selftype + ' * self = va_arg(args, ' + this.selftype + ' *);\n';
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
972 } else {
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
973 toplevelcode += '\t' + selfvar + ' = va_arg(args, ' + this.selftype + ' *);\n';
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
974 }
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
975
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
976 }
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
977 toplevelcode += args.join('') + '\tva_end(args);\n' + exprs.join(';\n\t') + '\n}\n';
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
978
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
979 if (this.selftype) {
60
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
980 return this.name;
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
981 } else {
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
982 if (this.symbols.parentEnvType() != 'void') {
55
93ddb4ad6fcb Fix some nested closure bugs
Mike Pavone <pavone@retrodev.com>
parents: 54
diff changeset
983 if (this.symbols.parent.passthruenv) {
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
984 var envvar = 'env';
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
985 } else {
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
986 var envvar = 'myenv';
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
987 }
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
988 debugprint('//' + this.name, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length);
60
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
989 return 'make_lambda(' + envvar + ', (closure_func)' + this.name + ')';
121
1a4446f573d3 Add isInteger? method to the int32 type in the C backend
Mike Pavone <pavone@retrodev.com>
parents: 97
diff changeset
990 } else {
143
282b8056b702 Lambda bugfix and some improvments to the llMessage support
Mike Pavone <pavone@retrodev.com>
parents: 142
diff changeset
991 toplevelcode += 'lambda ' + this.name + '_obj = {{&lambda_meta, NULL}, NULL, ' + this.name + '};\n';
96
84b65ee8b78b Optimize self method calls into static function calls
Mike Pavone <pavone@retrodev.com>
parents: 95
diff changeset
992 return '((object *)&' + this.name + '_obj)';
34
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
993 }
a10f1b049193 Working closures, but need to rethink method call strategy
Mike Pavone <pavone@retrodev.com>
parents: 32
diff changeset
994 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
995 };
60
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
996 lambda.prototype.toCModuleInstance = function() {
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
997 this.toC();
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
998 return this.name + '(NULL, 0)';
ef3b34c2c0a4 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
Mike Pavone <pavone@retrodev.com>
parents: 59
diff changeset
999 };
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1000 lambda.prototype.toCObject = function(typename) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1001 this.selftype = typename;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1002 return this.toC();
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1003 };
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1004 lambda.prototype.toCModule = function() {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1005 return makeCProg(this);
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: 79
diff changeset
1006 };
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: 79
diff changeset
1007 lambda.prototype.toCLines = function(vars, needsreturn) {
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: 79
diff changeset
1008 var lines = [];
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: 79
diff changeset
1009 for (var i in this.args) {
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: 79
diff changeset
1010 var name = this.args[i].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: 79
diff changeset
1011 if (name[0] == ':') {
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: 79
diff changeset
1012 name = name.substr(1);
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: 79
diff changeset
1013 }
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: 79
diff changeset
1014 if(name != '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: 79
diff changeset
1015 lines.push(name + ' = va_arg(args, ' + vars[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: 79
diff changeset
1016 }
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: 79
diff changeset
1017 }
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: 79
diff changeset
1018 for (var i in this.expressions) {
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: 79
diff changeset
1019 var exprlines = this.expressions[i].toCLines(vars, needsreturn && i == this.expressions.length - 1);
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: 79
diff changeset
1020 for (var j in exprlines) {
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: 79
diff changeset
1021 lines.push('\t' + exprlines[j]);
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: 79
diff changeset
1022 }
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: 79
diff changeset
1023 }
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: 79
diff changeset
1024 return lines;
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: 79
diff changeset
1025 }
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: 79
diff changeset
1026 lambda.prototype.toCLLExpr = function(vars) {
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: 79
diff changeset
1027 if (this.expressions.length != 1) {
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: 79
diff changeset
1028 throw new Error('lambda in expression context must have a single statement in llMessage block');
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: 79
diff changeset
1029 }
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: 79
diff changeset
1030 return this.expressions[0].toCLLExpr(vars);
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1031 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1032
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1033 assignment.prototype.toC = function() {
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
1034 debugprint('//assignment', this.symbol.name);
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1035 var existing = this.symbols.find(this.symbol.name);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1036 var prefix = '';
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1037 var val = this.expression.toC();
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1038 if (val === null) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1039 return null;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1040 }
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
1041 if (existing.type == 'local' && !existing.isdeclared) {
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
1042 prefix = 'object *';
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
1043 this.symbols.declareVar(this.symbol.name);
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
1044 debugprint('//declared var', this.symbol.name);
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 37
diff changeset
1045 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1046 return prefix + this.symbol.toC() + ' = ' + val;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1047 };
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1048 assignment.prototype.toCObject = function(cobj) {
54
976a0924e1d4 Fix closure over self var
Mike Pavone <pavone@retrodev.com>
parents: 52
diff changeset
1049 debugprint('//message definition', this.symbol.name);
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1050 if (this.expression.toCObject) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1051 var val = this.expression.toCObject(cobj.name);
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1052 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1053 var val = this.expression.toC();
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1054 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1055 if (val === null) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1056 return;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1057 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1058 if (this.expression instanceof lambda) {
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1059 var params = ['((object *)self)'];
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1060 var paramget = '';
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
1061 var messagevars = {};
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1062 for (var i in this.expression.args) {
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1063 var escaped = escapeCName(this.expression.args[i].cleanName());
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1064 if (escaped != 'self') {
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
1065 messagevars[escaped] = 'object *';
35
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1066 params.push(escaped);
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1067 paramget += escaped + ' = va_arg(args, object *); ';
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1068 }
bf5e88f6419d Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents: 34
diff changeset
1069 }
122
9820ecd4eed4 Add support for implementing operators on user defined objects
Mike Pavone <pavone@retrodev.com>
parents: 121
diff changeset
1070 cobj.addMessage(getOpMethodName(this.symbol.name), {
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
1071 vars: messagevars,
42
4e983fe32047 Fix closures as methods so that private vars work
Mike Pavone <pavone@retrodev.com>
parents: 41
diff changeset
1072 lines: [paramget + 'return ' + val + '(' + (cobj.hasenv ? 'self->env' : 'NULL') + ', ' + params.length + (params.length ? ', ' : '') + params.join(', ') + ');']
37
a6bf4869fcbe Small refactor of built-in int32 type and added support for more operators on said type
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
1073 });
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1074 } else {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1075 cobj.addProperty(this.symbol.name, val);
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
1076 if (this.expression instanceof object && this.expression.symbols.needsparent) {
72
ab6f24d6945d Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
Mike Pavone <pavone@retrodev.com>
parents: 69
diff changeset
1077 cobj.addInit('self->' + escapeCName(this.symbol.name) + '->parent = (object *)self;');
59
0fd06e077afe Fix object parent
Mike Pavone <pavone@retrodev.com>
parents: 58
diff changeset
1078 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1079 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
1080 };
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: 79
diff changeset
1081 assignment.prototype.toCLines = function(vars, needsreturn) {
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: 79
diff changeset
1082 return [(needsreturn ? 'return ' : '') + this.symbol.toCLLExpr(vars) + ' = ' + this.expression.toCLLExpr(vars) + ';']
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: 79
diff changeset
1083 };