changeset 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
files cbackend.js compiler.js
diffstat 2 files changed, 13 insertions(+), 4 deletions(-) [+]
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();
--- 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');
 	}
 }