Mercurial > repos > tabletprog
comparison 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 |
comparison
equal
deleted
inserted
replaced
141:15aac5334b64 | 142:833624457b81 |
---|---|
134 }; | 134 }; |
135 | 135 |
136 var declaredInts = {}; | 136 var declaredInts = {}; |
137 | 137 |
138 intlit.prototype.toC = function() { | 138 intlit.prototype.toC = function() { |
139 var str = this.val < 0 ? 'neg_' + (0-this.val).toString() : this.val.toString(); | 139 var intType = 'int' + this.bits; |
140 if (!(this.val in declaredInts)) { | 140 var str = intType + '_' + (this.val < 0 ? 'neg_' + (0-this.val).toString() : this.val.toString()); |
141 toplevelcode += 'obj_int32 int32_' + str + ' = {{&obj_int32_meta, NULL}, ' + this.val.toString() + '};\n'; | 141 if (!(str in declaredInts)) { |
142 declaredInts[this.val] = true; | 142 toplevelcode += 'obj_' + intType + ' ' + str + ' = {{&obj_' + intType + '_meta, NULL}, ' + this.val.toString() + '};\n'; |
143 } | 143 declaredInts[str] = true; |
144 return '((object *)&int32_' + str + ')'; | 144 } |
145 return '((object *)&' + str + ')'; | |
145 } | 146 } |
146 intlit.prototype.toCLLExpr = function(vars) { | 147 intlit.prototype.toCLLExpr = function(vars) { |
147 return this.val.toString(); | 148 return this.val.toString(); |
148 }; | 149 }; |
149 intlit.prototype.toCLines = function(vars, needsreturn) { | 150 intlit.prototype.toCLines = function(vars, needsreturn) { |
234 obj += (i ? '->' : '') + 'parent'; | 235 obj += (i ? '->' : '') + 'parent'; |
235 } | 236 } |
236 args.splice(0, 0, ', ' + obj); | 237 args.splice(0, 0, ', ' + obj); |
237 start = 1; | 238 start = 1; |
238 } | 239 } |
240 } else if(!(args[0] instanceof symbol) || args[0].name != 'self') { | |
241 funinfo = null; | |
239 } | 242 } |
240 method = true; | 243 method = true; |
241 break; | 244 break; |
242 } | 245 } |
243 } | 246 } |
611 'return ' + toplevel.moduleVar('false') + ';', | 614 'return ' + toplevel.moduleVar('false') + ';', |
612 ] | 615 ] |
613 }); | 616 }); |
614 } | 617 } |
615 | 618 |
616 function makeInt32() | 619 function makeInt(bits) |
617 { | 620 { |
618 var int32 = new cObject('obj_int32'); | 621 var typename = 'obj_int' + bits; |
619 int32.addProperty('num', null, 'int32_t'); | 622 var intObj = new cObject(typename); |
620 addBinaryOp(int32, 'ADD_', '+', 'obj_int32'); | 623 intObj.addProperty('num', null, 'int' + bits +'_t'); |
621 addBinaryOp(int32, 'SUB_', '-', 'obj_int32'); | 624 addBinaryOp(intObj, 'ADD_', '+', typename); |
622 addBinaryOp(int32, 'MUL_', '*', 'obj_int32'); | 625 addBinaryOp(intObj, 'SUB_', '-', typename); |
623 addBinaryOp(int32, 'DIV_', '/', 'obj_int32'); | 626 addBinaryOp(intObj, 'MUL_', '*', typename); |
624 addBinaryOp(int32, 'MOD_', '%', 'obj_int32'); | 627 addBinaryOp(intObj, 'DIV_', '/', typename); |
625 addCompOp(int32, 'LT_', '<', 'obj_int32'); | 628 addBinaryOp(intObj, 'MOD_', '%', typename); |
626 addCompOp(int32, 'GT_', '>', 'obj_int32'); | 629 addBinaryOp(intObj, 'or', '|', typename); |
627 addCompOp(int32, 'EQ_', '==', 'obj_int32'); | 630 addBinaryOp(intObj, 'xor', '^', typename); |
628 addCompOp(int32, 'NEQ_', '!=', 'obj_int32'); | 631 addBinaryOp(intObj, 'and', '&', typename); |
629 addCompOp(int32, 'GEQ_', '>=', 'obj_int32'); | 632 addBinaryOp(intObj, 'lshift:by', '<<', typename); |
630 addCompOp(int32, 'LEQ_', '<=', 'obj_int32'); | 633 addBinaryOp(intObj, 'rshift:by', '>>', typename); |
631 int32.addInclude('<string.h>'); | 634 addCompOp(intObj, 'LT_', '<', typename); |
632 int32.addMessage('string', { | 635 addCompOp(intObj, 'GT_', '>', typename); |
636 addCompOp(intObj, 'EQ_', '==', typename); | |
637 addCompOp(intObj, 'NEQ_', '!=', typename); | |
638 addCompOp(intObj, 'GEQ_', '>=', typename); | |
639 addCompOp(intObj, 'LEQ_', '<=', typename); | |
640 intObj.addInclude('<string.h>'); | |
641 //-9223372036854775808 | |
642 //01234567890123456789 | |
643 intObj.addMessage('string', { | |
633 vars: {str: 'string *'}, | 644 vars: {str: 'string *'}, |
634 lines: [ | 645 lines: [ |
635 'str = (string *)make_object(&string_meta, NULL, 0);', | 646 'str = (string *)make_object(&string_meta, NULL, 0);', |
636 'str->data = GC_MALLOC(12);', | 647 'str->data = GC_MALLOC(' + (bits == 64 ? 21 : 12) + ');', |
637 'sprintf(str->data, "%d", self->num);', | 648 'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'d", self->num);', |
638 'str->len = str->bytes = strlen(str->data);', | 649 'str->len = str->bytes = strlen(str->data);', |
639 'return &(str->header);' | 650 'return &(str->header);' |
640 ] | 651 ] |
641 }); | 652 }); |
642 int32.addMessage('isInteger?', { | 653 //7FFFFFFFFFFFFFFF |
654 //01234567890123456789 | |
655 intObj.addMessage('hex', { | |
656 vars: {str: 'string *'}, | |
657 lines: [ | |
658 'str = (string *)make_object(&string_meta, NULL, 0);', | |
659 'str->data = GC_MALLOC(' + (bits == 64 ? 17 : 9) + ');', | |
660 'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'X", self->num);', | |
661 'str->len = str->bytes = strlen(str->data);', | |
662 'return &(str->header);' | |
663 ] | |
664 }); | |
665 intObj.addMessage('isInteger?', { | |
643 vars: {}, | 666 vars: {}, |
644 lines: [ | 667 lines: [ |
645 'return ' + toplevel.moduleVar('true') + ';' | 668 'return ' + toplevel.moduleVar('true') + ';' |
646 ] | 669 ] |
647 }); | 670 }); |
648 int32.addMessage('hash', { | 671 intObj.addMessage('hash', { |
649 vars: {}, | 672 vars: {}, |
650 lines: [ | 673 lines: [ |
651 'return &(self->header);' | 674 'return &(self->header);' |
652 ] | 675 ] |
653 }); | 676 }); |
654 return int32; | 677 return intObj; |
655 } | 678 } |
656 | 679 |
657 function makeArray() | 680 function makeArray() |
658 { | 681 { |
659 var arrayfile = toplevel.names['array']; | 682 var arrayfile = toplevel.names['array']; |
691 return clos; | 714 return clos; |
692 } | 715 } |
693 | 716 |
694 function builtinTypes() | 717 function builtinTypes() |
695 { | 718 { |
696 return [makeInt32(), makeArray(), makeString(), makelambda()]; | 719 return [makeInt(64), makeInt(32), makeInt(16), makeInt(8), makeArray(), makeString(), makelambda()]; |
697 } | 720 } |
698 | 721 |
699 function addBuiltinModules(toplevel) | 722 function addBuiltinModules(toplevel) |
700 { | 723 { |
701 var os = new cObject('mod_obj_os'); | 724 var os = new cObject('mod_obj_os'); |