Mercurial > repos > tabletprog
comparison cbackend.js @ 57:08ae75d90dc2
Add != operator. Fix more closure bugs.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 14 Jul 2012 00:00:24 -0700 |
parents | 93ddb4ad6fcb |
children | 7b454d100dc8 |
comparison
equal
deleted
inserted
replaced
56:a9bf3ffb6379 | 57:08ae75d90dc2 |
---|---|
62 case 'self': | 62 case 'self': |
63 | 63 |
64 pre = (new symbol('self', symbols)).toC() + '->'; | 64 pre = (new symbol('self', symbols)).toC() + '->'; |
65 break; | 65 break; |
66 case 'parent': | 66 case 'parent': |
67 pre = 'self->'; | 67 pre = (new symbol('self', symbols)).toC() + '->header.'; |
68 for (var i = 0; i < info.depth; ++i) { | 68 for (var i = 0; i < info.depth; ++i) { |
69 pre += 'parent->'; | 69 pre += (i ? '->' : '') + 'parent'; |
70 } | 70 } |
71 pre = '((' + info.selftype + ' *)' + pre + ')->'; | |
71 break; | 72 break; |
72 case 'upvar': | 73 case 'upvar': |
73 pre = 'env->'; | 74 pre = 'env->'; |
74 for (var i = 1; i < info.depth; ++i) { | 75 for (var i = info.startdepth; i < info.depth; ++i) { |
75 pre += 'parent->'; | 76 pre += 'parent->'; |
76 } | 77 } |
77 break; | 78 break; |
78 case 'recupvar': | 79 case 'recupvar': |
79 if (info.subtype == 'object') { | 80 if (info.subtype == 'object') { |
289 for (j in this.slots[i]) { | 290 for (j in this.slots[i]) { |
290 slotdefs += '\t\tcase ' + this.slots[i][j][0] + ': /* ' + this.slots[i][j][2] + '*/\n' + | 291 slotdefs += '\t\tcase ' + this.slots[i][j][0] + ': /* ' + this.slots[i][j][2] + '*/\n' + |
291 '\t\t\t' + this.slots[i][j][1] + '\n'; | 292 '\t\t\t' + this.slots[i][j][1] + '\n'; |
292 } | 293 } |
293 slotdefs += '\t\tdefault:\n' + | 294 slotdefs += '\t\tdefault:\n' + |
294 '\treturn no_impl(method_id, num_params, params, args);\n}\n'; | 295 '\t\t\treturn no_impl(method_id, num_params, (object *)self, args);\n\t}\n}\n'; |
296 | |
295 } | 297 } |
296 metadef += this.name + '_slot_' + i; | 298 metadef += this.name + '_slot_' + i; |
297 } else { | 299 } else { |
298 metadef += 'no_impl'; | 300 metadef += 'no_impl'; |
299 } | 301 } |
317 object.prototype.toC = function() { | 319 object.prototype.toC = function() { |
318 var messages = this.messages; | 320 var messages = this.messages; |
319 var values = []; | 321 var values = []; |
320 var imports = [] | 322 var imports = [] |
321 var me = new cObject('object_' + nextobject++); | 323 var me = new cObject('object_' + nextobject++); |
324 this.symbols.typename = me.name; | |
322 if (this.symbols.needsenv) { | 325 if (this.symbols.needsenv) { |
323 me.addProperty('env', this.symbols.envVar(), 'struct ' + this.symbols.getEnvType() + ' * '); | 326 me.addProperty('env', this.symbols.envVar(), 'struct ' + this.symbols.getEnvType() + ' * '); |
324 me.hasenv = true; | 327 me.hasenv = true; |
325 } | 328 } |
326 for (var i in messages) { | 329 for (var i in messages) { |
492 ' return mcall(METHOD_ID_TRUE, 1, main_module);', | 495 ' return mcall(METHOD_ID_TRUE, 1, main_module);', |
493 '}', | 496 '}', |
494 'return mcall(METHOD_ID_FALSE, 1, main_module);' | 497 'return mcall(METHOD_ID_FALSE, 1, main_module);' |
495 ] | 498 ] |
496 }); | 499 }); |
500 string.addMessage('NEQ_', { | |
501 vars: {argb: 'string *'}, | |
502 lines: [ | |
503 'argb = va_arg(args, string *);', | |
504 'if (self->length != argb->length || self->bytes != argb->bytes || memcmp(self->data, argb->data, self->bytes)) {', | |
505 ' return mcall(METHOD_ID_TRUE, 1, main_module);', | |
506 '}', | |
507 'return mcall(METHOD_ID_FALSE, 1, main_module);' | |
508 ] | |
509 }); | |
497 string.addMessage('print', { | 510 string.addMessage('print', { |
498 vars: {}, | 511 vars: {}, |
499 lines: [ | 512 lines: [ |
500 'fwrite(self->data, 1, self->bytes, stdout);', | 513 'fwrite(self->data, 1, self->bytes, stdout);', |
501 'return &(self->header);' | 514 'return &(self->header);' |
701 | 714 |
702 lambda.prototype.toC = function() { | 715 lambda.prototype.toC = function() { |
703 var args = this.args ? this.args.slice(0, this.args.length) : []; | 716 var args = this.args ? this.args.slice(0, this.args.length) : []; |
704 var exprs = this.expressions; | 717 var exprs = this.expressions; |
705 var mynum = lambdanum++; | 718 var mynum = lambdanum++; |
719 debugprint('//lambda', mynum); | |
706 if (Object.keys(this.symbols.closedover).length) { | 720 if (Object.keys(this.symbols.closedover).length) { |
707 this.symbols.envtype = 'lambda_' + mynum + '_env'; | 721 this.symbols.envtype = 'lambda_' + mynum + '_env'; |
708 } | 722 } |
709 if (this.selftype) { | 723 if (this.selftype) { |
710 this.symbols.defineVar('self', this.selftype); | 724 this.symbols.defineVar('self', this.selftype); |
732 exprs[exprs.length-1] = 'return ' + exprs[exprs.length-1] + ';'; | 746 exprs[exprs.length-1] = 'return ' + exprs[exprs.length-1] + ';'; |
733 } | 747 } |
734 | 748 |
735 if (Object.keys(this.symbols.closedover).length) { | 749 if (Object.keys(this.symbols.closedover).length) { |
736 forwarddec += 'typedef struct lambda_' + mynum + '_env {\n'; | 750 forwarddec += 'typedef struct lambda_' + mynum + '_env {\n'; |
751 if (this.symbols.needsParentEnv) { | |
752 forwarddec += '\tstruct ' + this.symbols.parentEnvType() + ' * parent;\n'; | |
753 } | |
737 for (var varname in this.symbols.closedover) { | 754 for (var varname in this.symbols.closedover) { |
738 if (varname == 'self' && this.selftype) { | 755 if (varname == 'self' && this.selftype) { |
739 forwarddec += '\tstruct ' + this.selftype + ' * self;\n'; | 756 forwarddec += '\tstruct ' + this.selftype + ' * self;\n'; |
740 } else { | 757 } else { |
741 forwarddec += '\tobject * ' + escapeCName(varname) + ';\n'; | 758 forwarddec += '\tobject * ' + escapeCName(varname) + ';\n'; |