Mercurial > repos > tabletprog
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 } |