# HG changeset patch # User Mike Pavone # Date 1377097174 25200 # Node ID 8d466c5a7dffa6989a4cf74247cb3ab9550a56fc # Parent 869399ff7faa1358f111b69c3d91f5c5a5aee0d3 Fixed a few bugs. Improved the "symbol not found" error messages. Added a "signed?" method to integer objects diff -r 869399ff7faa -r 8d466c5a7dff cbackend.js --- a/cbackend.js Tue Aug 13 22:01:00 2013 -0700 +++ b/cbackend.js Wed Aug 21 07:59:34 2013 -0700 @@ -47,7 +47,7 @@ if (name == 'self') { return name; } - name = name.replace("_", "UN_").replace(":", "CN_").replace("!", "EX_").replace('?', 'QS_').replace('@', 'AT_'); + name = name.replace(/_/g, "UN_").replace(/:/g, "CN_").replace(/!/g, "EX_").replace(/\?/g, 'QS_').replace(/@/g, 'AT_'); name = 'tp_' + name; return name; } @@ -90,7 +90,7 @@ var name = this.cleanName(); var info = this.symbols.find(name); if (!info) { - throw new Error('symbol ' + name + ' not found'); + throw new Error('symbol ' + name + ' not found in ' + assignNames.join('<-')); } if (info.type == 'toplevel') { return toplevel.moduleVar(name); @@ -262,7 +262,8 @@ callpart = 'mcall(' + getMethodId(name) + '/* ' + name + ' */'; } } else { - callpart = 'ccall(' + (new symbol(name, this.symbols)).toC(); + var closVar = (new symbol(name, this.symbols)).toC(); + callpart = '((lambda *)' + closVar + ')->func(((lambda *)' + closVar + ')->env'; } return callpart + ', ' + args.length + args.join('') + ')'; }; @@ -696,6 +697,12 @@ 'return &(self->header);' ] }); + intObj.addMessage('signed?', { + vars: {}, + lines: [ + 'return ' + toplevel.moduleVar(unsigned ? 'false' : 'true') + ';' + ] + }); var sizes = [8, 16, 32, 64]; var destunsigned = [false, true]; for (var i = 0; i < sizes.length; i++) { @@ -1029,10 +1036,14 @@ compiled.push(indent(js)); } } + if (compiled.length) { + if (exprs[exprs.length - 1] instanceof assignment) { + compiled.push('return ' + exprs[exprs.length - 1].symbol.toC() + ';'); + } else { + compiled[compiled.length-1] = 'return (object *)(' + compiled[compiled.length-1] + ');'; + } + } exprs = compiled; - if (exprs.length) { - exprs[exprs.length-1] = 'return (object *)(' + exprs[exprs.length-1] + ');'; - } if (Object.keys(this.symbols.closedover).length) { if (!addedTypeDef) {