Mercurial > repos > tabletprog
comparison cbackend.js @ 135:f98790d8a53d
Add int64, int16 and int8. Also add hex method to integer types.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 08 Aug 2013 20:03:15 -0700 |
parents | 34e0befbdd77 |
children | 101fa04ee9e1 |
comparison
equal
deleted
inserted
replaced
134:34e0befbdd77 | 135:f98790d8a53d |
---|---|
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) { |
596 'return ' + toplevel.moduleVar('false') + ';', | 597 'return ' + toplevel.moduleVar('false') + ';', |
597 ] | 598 ] |
598 }); | 599 }); |
599 } | 600 } |
600 | 601 |
601 function makeInt32() | 602 function makeInt(bits) |
602 { | 603 { |
603 var int32 = new cObject('obj_int32'); | 604 var typename = 'obj_int' + bits; |
604 int32.addProperty('num', null, 'int32_t'); | 605 var intObj = new cObject(typename); |
605 addBinaryOp(int32, 'ADD_', '+', 'obj_int32'); | 606 intObj.addProperty('num', null, 'int' + bits +'_t'); |
606 addBinaryOp(int32, 'SUB_', '-', 'obj_int32'); | 607 addBinaryOp(intObj, 'ADD_', '+', typename); |
607 addBinaryOp(int32, 'MUL_', '*', 'obj_int32'); | 608 addBinaryOp(intObj, 'SUB_', '-', typename); |
608 addBinaryOp(int32, 'DIV_', '/', 'obj_int32'); | 609 addBinaryOp(intObj, 'MUL_', '*', typename); |
609 addBinaryOp(int32, 'MOD_', '%', 'obj_int32'); | 610 addBinaryOp(intObj, 'DIV_', '/', typename); |
610 addBinaryOp(int32, 'or', '|', 'obj_int32'); | 611 addBinaryOp(intObj, 'MOD_', '%', typename); |
611 addBinaryOp(int32, 'xor', '^', 'obj_int32'); | 612 addBinaryOp(intObj, 'or', '|', typename); |
612 addBinaryOp(int32, 'and', '&', 'obj_int32'); | 613 addBinaryOp(intObj, 'xor', '^', typename); |
613 addBinaryOp(int32, 'lshift:by', '<<', 'obj_int32'); | 614 addBinaryOp(intObj, 'and', '&', typename); |
614 addBinaryOp(int32, 'rshift:by', '>>', 'obj_int32'); | 615 addBinaryOp(intObj, 'lshift:by', '<<', typename); |
615 addCompOp(int32, 'LT_', '<', 'obj_int32'); | 616 addBinaryOp(intObj, 'rshift:by', '>>', typename); |
616 addCompOp(int32, 'GT_', '>', 'obj_int32'); | 617 addCompOp(intObj, 'LT_', '<', typename); |
617 addCompOp(int32, 'EQ_', '==', 'obj_int32'); | 618 addCompOp(intObj, 'GT_', '>', typename); |
618 addCompOp(int32, 'NEQ_', '!=', 'obj_int32'); | 619 addCompOp(intObj, 'EQ_', '==', typename); |
619 addCompOp(int32, 'GEQ_', '>=', 'obj_int32'); | 620 addCompOp(intObj, 'NEQ_', '!=', typename); |
620 addCompOp(int32, 'LEQ_', '<=', 'obj_int32'); | 621 addCompOp(intObj, 'GEQ_', '>=', typename); |
621 int32.addInclude('<string.h>'); | 622 addCompOp(intObj, 'LEQ_', '<=', typename); |
622 int32.addMessage('string', { | 623 intObj.addInclude('<string.h>'); |
624 //-9223372036854775808 | |
625 //01234567890123456789 | |
626 intObj.addMessage('string', { | |
623 vars: {str: 'string *'}, | 627 vars: {str: 'string *'}, |
624 lines: [ | 628 lines: [ |
625 'str = (string *)make_object(&string_meta, NULL, 0);', | 629 'str = (string *)make_object(&string_meta, NULL, 0);', |
626 'str->data = GC_MALLOC(12);', | 630 'str->data = GC_MALLOC(' + (bits == 64 ? 21 : 12) + ');', |
627 'sprintf(str->data, "%d", self->num);', | 631 'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'d", self->num);', |
628 'str->len = str->bytes = strlen(str->data);', | 632 'str->len = str->bytes = strlen(str->data);', |
629 'return &(str->header);' | 633 'return &(str->header);' |
630 ] | 634 ] |
631 }); | 635 }); |
632 int32.addMessage('isInteger?', { | 636 //7FFFFFFFFFFFFFFF |
637 //01234567890123456789 | |
638 intObj.addMessage('hex', { | |
639 vars: {str: 'string *'}, | |
640 lines: [ | |
641 'str = (string *)make_object(&string_meta, NULL, 0);', | |
642 'str->data = GC_MALLOC(' + (bits == 64 ? 17 : 9) + ');', | |
643 'sprintf(str->data, "%' + (bits == 64 ? 'l' : '') +'X", self->num);', | |
644 'str->len = str->bytes = strlen(str->data);', | |
645 'return &(str->header);' | |
646 ] | |
647 }); | |
648 intObj.addMessage('isInteger?', { | |
633 vars: {}, | 649 vars: {}, |
634 lines: [ | 650 lines: [ |
635 'return ' + toplevel.moduleVar('true') + ';' | 651 'return ' + toplevel.moduleVar('true') + ';' |
636 ] | 652 ] |
637 }); | 653 }); |
638 int32.addMessage('hash', { | 654 intObj.addMessage('hash', { |
639 vars: {}, | 655 vars: {}, |
640 lines: [ | 656 lines: [ |
641 'return &(self->header);' | 657 'return &(self->header);' |
642 ] | 658 ] |
643 }); | 659 }); |
644 return int32; | 660 return intObj; |
645 } | 661 } |
646 | 662 |
647 function makeArray() | 663 function makeArray() |
648 { | 664 { |
649 var arrayfile = toplevel.names['array']; | 665 var arrayfile = toplevel.names['array']; |
681 return clos; | 697 return clos; |
682 } | 698 } |
683 | 699 |
684 function builtinTypes() | 700 function builtinTypes() |
685 { | 701 { |
686 return [makeInt32(), makeArray(), makeString(), makelambda()]; | 702 return [makeInt(64), makeInt(32), makeInt(16), makeInt(8), makeArray(), makeString(), makelambda()]; |
687 } | 703 } |
688 | 704 |
689 function addBuiltinModules(toplevel) | 705 function addBuiltinModules(toplevel) |
690 { | 706 { |
691 var os = new cObject('mod_obj_os'); | 707 var os = new cObject('mod_obj_os'); |