comparison cbackend.js @ 55:93ddb4ad6fcb

Fix some nested closure bugs
author Mike Pavone <pavone@retrodev.com>
date Fri, 13 Jul 2012 21:05:52 -0700
parents 976a0924e1d4
children 08ae75d90dc2
comparison
equal deleted inserted replaced
54:976a0924e1d4 55:93ddb4ad6fcb
40 } 40 }
41 41
42 op.prototype.toC = function(isReceiver) { 42 op.prototype.toC = function(isReceiver) {
43 var optoMeth = {'+': 'ADD_', '-': 'SUB_', '*': 'MUL_', '/': 'DIV_', '=': 'EQ_', '!=': 'NEQ_', '<': 'LT_', '>': 'GT_', '>=': 'GEQ_', '<=': 'LEQ_', '.': 'CAT_'}; 43 var optoMeth = {'+': 'ADD_', '-': 'SUB_', '*': 'MUL_', '/': 'DIV_', '=': 'EQ_', '!=': 'NEQ_', '<': 'LT_', '>': 'GT_', '>=': 'GEQ_', '<=': 'LEQ_', '.': 'CAT_'};
44 var method = optoMeth[this.op]; 44 var method = optoMeth[this.op];
45 return 'mcall(' + getMethodId(method) + ', 2, ' + this.left.toC() + ', ' + this.right.toC() + ')\n'; 45 return 'mcall(' + getMethodId(method) + ', 2, (object *)' + this.left.toC() + ', ' + this.right.toC() + ')\n';
46 }; 46 };
47 47
48 function escapeCName(name) 48 function escapeCName(name)
49 { 49 {
50 if (name == 'self') { 50 if (name == 'self') {
187 } 187 }
188 var callpart; 188 var callpart;
189 if (method) { 189 if (method) {
190 callpart = 'mcall(' + getMethodId(name); 190 callpart = 'mcall(' + getMethodId(name);
191 } else { 191 } else {
192 callpart = 'ccall(' + escapeCName(name); 192 callpart = 'ccall(' + (new symbol(name, this.symbols)).toC();
193 } 193 }
194 return callpart + ', ' + args.length + args.join('') + ')'; 194 return callpart + ', ' + args.length + args.join('') + ')';
195 } 195 }
196 196
197 function cObject(name) { 197 function cObject(name) {
763 763
764 if (this.selftype) { 764 if (this.selftype) {
765 return 'lambda_' + mynum; 765 return 'lambda_' + mynum;
766 } else { 766 } else {
767 if (this.symbols.parentEnvType() != 'void') { 767 if (this.symbols.parentEnvType() != 'void') {
768 if (this.symbols.passthruenv) { 768 if (this.symbols.parent.passthruenv) {
769 var envvar = 'env'; 769 var envvar = 'env';
770 } else { 770 } else {
771 var envvar = 'myenv'; 771 var envvar = 'myenv';
772 } 772 }
773 return 'make_lambda(' + envvar + ', lambda_' + mynum + ')'; 773 debugprint('//lambda_' + mynum, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length);
774 return 'make_lambda(' + envvar + ', (closure_func)lambda_' + mynum + ')';
774 } else { 775 } else {
775 toplevelcode += 'lambda lambda_obj_' + mynum + ' = {{&lambda_meta, NULL}, NULL, lambda_' + mynum + '};\n'; 776 toplevelcode += 'lambda lambda_obj_' + mynum + ' = {{&lambda_meta, NULL}, NULL, lambda_' + mynum + '};\n';
776 return '((object *)&lambda_obj_' + mynum + ')'; 777 return '((object *)&lambda_obj_' + mynum + ')';
777 } 778 }
778 } 779 }