Mercurial > repos > tabletprog
comparison cbackend.js @ 172:8d466c5a7dff
Fixed a few bugs. Improved the "symbol not found" error messages. Added a "signed?" method to integer objects
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Wed, 21 Aug 2013 07:59:34 -0700 |
parents | 869399ff7faa |
children | 76e3d4ae1746 |
comparison
equal
deleted
inserted
replaced
171:869399ff7faa | 172:8d466c5a7dff |
---|---|
45 function escapeCName(name) | 45 function escapeCName(name) |
46 { | 46 { |
47 if (name == 'self') { | 47 if (name == 'self') { |
48 return name; | 48 return name; |
49 } | 49 } |
50 name = name.replace("_", "UN_").replace(":", "CN_").replace("!", "EX_").replace('?', 'QS_').replace('@', 'AT_'); | 50 name = name.replace(/_/g, "UN_").replace(/:/g, "CN_").replace(/!/g, "EX_").replace(/\?/g, 'QS_').replace(/@/g, 'AT_'); |
51 name = 'tp_' + name; | 51 name = 'tp_' + name; |
52 return name; | 52 return name; |
53 } | 53 } |
54 | 54 |
55 function getSymbolPrefix(info, symbols) | 55 function getSymbolPrefix(info, symbols) |
88 | 88 |
89 symbol.prototype.toC = function() { | 89 symbol.prototype.toC = function() { |
90 var name = this.cleanName(); | 90 var name = this.cleanName(); |
91 var info = this.symbols.find(name); | 91 var info = this.symbols.find(name); |
92 if (!info) { | 92 if (!info) { |
93 throw new Error('symbol ' + name + ' not found'); | 93 throw new Error('symbol ' + name + ' not found in ' + assignNames.join('<-')); |
94 } | 94 } |
95 if (info.type == 'toplevel') { | 95 if (info.type == 'toplevel') { |
96 return toplevel.moduleVar(name); | 96 return toplevel.moduleVar(name); |
97 } else if (info.type == 'self' && info.def instanceof lambda) { | 97 } else if (info.type == 'self' && info.def instanceof lambda) { |
98 return 'mcall(' + getMethodId(name) + '/* ' + name + ' */, 1, ' + (new symbol('self', this.symbols)).toC() + ')'; | 98 return 'mcall(' + getMethodId(name) + '/* ' + name + ' */, 1, ' + (new symbol('self', this.symbols)).toC() + ')'; |
260 callpart = funinfo.def.name + '(' + (funinfo.def.symbols.parent.needsenv ? (new symbol('self', this.symbols)).toC() + '->env' : 'NULL' ); | 260 callpart = funinfo.def.name + '(' + (funinfo.def.symbols.parent.needsenv ? (new symbol('self', this.symbols)).toC() + '->env' : 'NULL' ); |
261 } else { | 261 } else { |
262 callpart = 'mcall(' + getMethodId(name) + '/* ' + name + ' */'; | 262 callpart = 'mcall(' + getMethodId(name) + '/* ' + name + ' */'; |
263 } | 263 } |
264 } else { | 264 } else { |
265 callpart = 'ccall(' + (new symbol(name, this.symbols)).toC(); | 265 var closVar = (new symbol(name, this.symbols)).toC(); |
266 callpart = '((lambda *)' + closVar + ')->func(((lambda *)' + closVar + ')->env'; | |
266 } | 267 } |
267 return callpart + ', ' + args.length + args.join('') + ')'; | 268 return callpart + ', ' + args.length + args.join('') + ')'; |
268 }; | 269 }; |
269 funcall.prototype.toCTypeName = function() { | 270 funcall.prototype.toCTypeName = function() { |
270 switch(this.name) | 271 switch(this.name) |
694 vars: {}, | 695 vars: {}, |
695 lines: [ | 696 lines: [ |
696 'return &(self->header);' | 697 'return &(self->header);' |
697 ] | 698 ] |
698 }); | 699 }); |
700 intObj.addMessage('signed?', { | |
701 vars: {}, | |
702 lines: [ | |
703 'return ' + toplevel.moduleVar(unsigned ? 'false' : 'true') + ';' | |
704 ] | |
705 }); | |
699 var sizes = [8, 16, 32, 64]; | 706 var sizes = [8, 16, 32, 64]; |
700 var destunsigned = [false, true]; | 707 var destunsigned = [false, true]; |
701 for (var i = 0; i < sizes.length; i++) { | 708 for (var i = 0; i < sizes.length; i++) { |
702 size = sizes[i]; | 709 size = sizes[i]; |
703 for (var j = 0; j < destunsigned.length; j++) { | 710 for (var j = 0; j < destunsigned.length; j++) { |
1027 var js = exprs[i].toC(); | 1034 var js = exprs[i].toC(); |
1028 if (js) { | 1035 if (js) { |
1029 compiled.push(indent(js)); | 1036 compiled.push(indent(js)); |
1030 } | 1037 } |
1031 } | 1038 } |
1039 if (compiled.length) { | |
1040 if (exprs[exprs.length - 1] instanceof assignment) { | |
1041 compiled.push('return ' + exprs[exprs.length - 1].symbol.toC() + ';'); | |
1042 } else { | |
1043 compiled[compiled.length-1] = 'return (object *)(' + compiled[compiled.length-1] + ');'; | |
1044 } | |
1045 } | |
1032 exprs = compiled; | 1046 exprs = compiled; |
1033 if (exprs.length) { | |
1034 exprs[exprs.length-1] = 'return (object *)(' + exprs[exprs.length-1] + ');'; | |
1035 } | |
1036 | 1047 |
1037 if (Object.keys(this.symbols.closedover).length) { | 1048 if (Object.keys(this.symbols.closedover).length) { |
1038 if (!addedTypeDef) { | 1049 if (!addedTypeDef) { |
1039 for (var key in this.symbols.closedover) { | 1050 for (var key in this.symbols.closedover) { |
1040 print(key, ": ", this.symbols.closedover[key]); | 1051 print(key, ": ", this.symbols.closedover[key]); |