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]);