Mercurial > repos > tabletprog
diff cbackend.js @ 142:833624457b81
Merge
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 09 Aug 2013 01:37:09 -0700 |
parents | bf8f75b69048 101fa04ee9e1 |
children | 282b8056b702 |
line wrap: on
line diff
--- a/cbackend.js Fri Aug 09 01:36:53 2013 -0700 +++ b/cbackend.js Fri Aug 09 01:37:09 2013 -0700 @@ -136,12 +136,13 @@ var declaredInts = {}; intlit.prototype.toC = function() { - var str = this.val < 0 ? 'neg_' + (0-this.val).toString() : this.val.toString(); - if (!(this.val in declaredInts)) { - toplevelcode += 'obj_int32 int32_' + str + ' = {{&obj_int32_meta, NULL}, ' + this.val.toString() + '};\n'; - declaredInts[this.val] = true; + var intType = 'int' + this.bits; + var str = intType + '_' + (this.val < 0 ? 'neg_' + (0-this.val).toString() : this.val.toString()); + if (!(str in declaredInts)) { + toplevelcode += 'obj_' + intType + ' ' + str + ' = {{&obj_' + intType + '_meta, NULL}, ' + this.val.toString() + '};\n'; + declaredInts[str] = true; } - return '((object *)&int32_' + str + ')'; + return '((object *)&' + str + ')'; } intlit.prototype.toCLLExpr = function(vars) { return this.val.toString(); @@ -236,6 +237,8 @@ args.splice(0, 0, ', ' + obj); start = 1; } + } else if(!(args[0] instanceof symbol) || args[0].name != 'self') { + funinfo = null; } method = true; break; @@ -613,45 +616,65 @@ }); } -function makeInt32() +function makeInt(bits) { - var int32 = new cObject('obj_int32'); - int32.addProperty('num', null, 'int32_t'); - addBinaryOp(int32, 'ADD_', '+', 'obj_int32'); - addBinaryOp(int32, 'SUB_', '-', 'obj_int32'); - addBinaryOp(int32, 'MUL_', '*', 'obj_int32'); - addBinaryOp(int32, 'DIV_', '/', 'obj_int32'); - addBinaryOp(int32, 'MOD_', '%', 'obj_int32'); - addCompOp(int32, 'LT_', '<', 'obj_int32'); - addCompOp(int32, 'GT_', '>', 'obj_int32'); - addCompOp(int32, 'EQ_', '==', 'obj_int32'); - addCompOp(int32, 'NEQ_', '!=', 'obj_int32'); - addCompOp(int32, 'GEQ_', '>=', 'obj_int32'); - addCompOp(int32, 'LEQ_', '<=', 'obj_int32'); - int32.addInclude('<string.h>'); - int32.addMessage('string', { + var typename = 'obj_int' + bits; + var intObj = new cObject(typename); + intObj.addProperty('num', null, 'int' + bits +'_t'); + addBinaryOp(intObj, 'ADD_', '+', typename); + addBinaryOp(intObj, 'SUB_', '-', typename); + addBinaryOp(intObj, 'MUL_', '*', typename); + addBinaryOp(intObj, 'DIV_', '/', typename); + addBinaryOp(intObj, 'MOD_', '%', typename); + addBinaryOp(intObj, 'or', '|', typename); + addBinaryOp(intObj, 'xor', '^', typename); + addBinaryOp(intObj, 'and', '&', typename); + addBinaryOp(intObj, 'lshift:by', '<<', typename); + addBinaryOp(intObj, 'rshift:by', '>>', typename); + addCompOp(intObj, 'LT_', '<', typename); + addCompOp(intObj, 'GT_', '>', typename); + addCompOp(intObj, 'EQ_', '==', typename); + addCompOp(intObj, 'NEQ_', '!=', typename); + addCompOp(intObj, 'GEQ_', '>=', typename); + addCompOp(intObj, 'LEQ_', '<=', typename); + intObj.addInclude('<string.h>'); + //-9223372036854775808 + //01234567890123456789 + intObj.addMessage('string', { vars: {str: 'string *'}, lines: [ 'str = (string *)make_object(&string_meta, NULL, 0);', - 'str->data = GC_MALLOC(12);', - 'sprintf(str->data, "%d", self->num);', + 'str->data = GC_MALLOC(' + (bits == 64 ? 21 : 12) + ');', + 'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'d", self->num);', 'str->len = str->bytes = strlen(str->data);', 'return &(str->header);' ] }); - int32.addMessage('isInteger?', { + //7FFFFFFFFFFFFFFF + //01234567890123456789 + intObj.addMessage('hex', { + vars: {str: 'string *'}, + lines: [ + 'str = (string *)make_object(&string_meta, NULL, 0);', + 'str->data = GC_MALLOC(' + (bits == 64 ? 17 : 9) + ');', + 'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'X", self->num);', + 'str->len = str->bytes = strlen(str->data);', + 'return &(str->header);' + ] + }); + intObj.addMessage('isInteger?', { vars: {}, lines: [ 'return ' + toplevel.moduleVar('true') + ';' ] }); - int32.addMessage('hash', { + intObj.addMessage('hash', { vars: {}, lines: [ 'return &(self->header);' ] }); - return int32; + return intObj; } function makeArray() @@ -693,7 +716,7 @@ function builtinTypes() { - return [makeInt32(), makeArray(), makeString(), makelambda()]; + return [makeInt(64), makeInt(32), makeInt(16), makeInt(8), makeArray(), makeString(), makelambda()]; } function addBuiltinModules(toplevel)