Mercurial > repos > tabletprog
diff 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 |
line wrap: on
line diff
--- a/cbackend.js Fri Jul 13 19:22:39 2012 -0700 +++ b/cbackend.js Fri Jul 13 21:05:52 2012 -0700 @@ -42,7 +42,7 @@ op.prototype.toC = function(isReceiver) { var optoMeth = {'+': 'ADD_', '-': 'SUB_', '*': 'MUL_', '/': 'DIV_', '=': 'EQ_', '!=': 'NEQ_', '<': 'LT_', '>': 'GT_', '>=': 'GEQ_', '<=': 'LEQ_', '.': 'CAT_'}; var method = optoMeth[this.op]; - return 'mcall(' + getMethodId(method) + ', 2, ' + this.left.toC() + ', ' + this.right.toC() + ')\n'; + return 'mcall(' + getMethodId(method) + ', 2, (object *)' + this.left.toC() + ', ' + this.right.toC() + ')\n'; }; function escapeCName(name) @@ -189,7 +189,7 @@ if (method) { callpart = 'mcall(' + getMethodId(name); } else { - callpart = 'ccall(' + escapeCName(name); + callpart = 'ccall(' + (new symbol(name, this.symbols)).toC(); } return callpart + ', ' + args.length + args.join('') + ')'; } @@ -765,12 +765,13 @@ return 'lambda_' + mynum; } else { if (this.symbols.parentEnvType() != 'void') { - if (this.symbols.passthruenv) { + if (this.symbols.parent.passthruenv) { var envvar = 'env'; } else { var envvar = 'myenv'; } - return 'make_lambda(' + envvar + ', lambda_' + mynum + ')'; + debugprint('//lambda_' + mynum, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length); + return 'make_lambda(' + envvar + ', (closure_func)lambda_' + mynum + ')'; } else { toplevelcode += 'lambda lambda_obj_' + mynum + ' = {{&lambda_meta, NULL}, NULL, lambda_' + mynum + '};\n'; return '((object *)&lambda_obj_' + mynum + ')';