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