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