# HG changeset patch # User Mike Pavone # Date 1342260312 25200 # Node ID ef3b34c2c0a4dfa57e401a3e27823299c10fa151 # Parent 0fd06e077afebce6b0170a3f7c383bc7e71ebda2 Fix populatesymbols for parent property references. Fix lambda-style modules in cbackend. diff -r 0fd06e077afe -r ef3b34c2c0a4 cbackend.js --- 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(); diff -r 0fd06e077afe -r ef3b34c2c0a4 compiler.js --- a/compiler.js Sat Jul 14 01:39:43 2012 -0700 +++ b/compiler.js Sat Jul 14 03:05:12 2012 -0700 @@ -271,7 +271,7 @@ symbol.prototype.populateSymbols = function(symbols) { this.symbols = symbols; var ret = symbols.find(this.cleanName()); - if (ret && ret.type == 'self') { + if (ret && (ret.type == 'self' || ret.type == 'parent')) { symbols.find('self'); } }