Mercurial > repos > tabletprog
diff cbackend.js @ 60:ef3b34c2c0a4
Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend.
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 14 Jul 2012 03:05:12 -0700 |
parents | 0fd06e077afe |
children | a6addd8c6bd4 |
line wrap: on
line diff
--- a/cbackend.js Sat Jul 14 01:39:43 2012 -0700 +++ b/cbackend.js Sat Jul 14 03:05:12 2012 -0700 @@ -734,7 +734,7 @@ obj.populateSymbols(toplevel); var moduleinit = processUsedToplevel(toplevel); debugprint('//------COMPILING AST-----'); - var rest = 'object * mainModule() {\n' + moduleinit + '\tmain_module = ' + obj.toC() + ';\n\treturn main_module;\n}\n'; + var rest = 'object * mainModule() {\n' + moduleinit + '\tmain_module = ' + obj.toCModuleInstance() + ';\n\treturn main_module;\n}\n'; return '#include "runtime/proghead.inc"\n' + '#define METHOD_ID_MAIN ' + getMethodId('main') + '\n' + '#define METHOD_ID_TRUE ' + getMethodId('true') + '\n' + @@ -746,6 +746,10 @@ return makeCProg(this); } +object.prototype.toCModuleInstance = function() { + return this.toC(); +} + var lambdanum = 0; lambda.prototype.toC = function() { @@ -816,9 +820,10 @@ } toplevelcode += args.join('') + '\tva_end(args);\n' + exprs.join(';\n\t') + '\n}\n'; + this.name = 'lambda_' + mynum; if (this.selftype) { - return 'lambda_' + mynum; + return this.name; } else { if (this.symbols.parentEnvType() != 'void') { if (this.symbols.parent.passthruenv) { @@ -827,13 +832,17 @@ var envvar = 'myenv'; } debugprint('//lambda_' + mynum, 'has envvar:', envvar, 'num vars closed over:', Object.keys(this.symbols.closedover).length); - return 'make_lambda(' + envvar + ', (closure_func)lambda_' + mynum + ')'; + return 'make_lambda(' + envvar + ', (closure_func)' + this.name + ')'; } else { toplevelcode += 'lambda lambda_obj_' + mynum + ' = {{&lambda_meta, NULL}, NULL, lambda_' + mynum + '};\n'; return '((object *)&lambda_obj_' + mynum + ')'; } } }; +lambda.prototype.toCModuleInstance = function() { + this.toC(); + return this.name + '(NULL, 0)'; +}; lambda.prototype.toCObject = function(typename) { this.selftype = typename; return this.toC();