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