changeset 57:08ae75d90dc2

Add != operator. Fix more closure bugs.
author Mike Pavone <pavone@retrodev.com>
date Sat, 14 Jul 2012 00:00:24 -0700
parents a9bf3ffb6379
children 7b454d100dc8
files cbackend.js compiler.js parser.js
diffstat 3 files changed, 33 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/cbackend.js	Fri Jul 13 21:28:37 2012 -0700
+++ b/cbackend.js	Sat Jul 14 00:00:24 2012 -0700
@@ -64,14 +64,15 @@
 		pre = (new symbol('self', symbols)).toC() + '->';
 		break;
 	case 'parent':
-		pre = 'self->';
+		pre = (new symbol('self', symbols)).toC() + '->header.';
 		for (var i = 0; i < info.depth; ++i) {
-			pre += 'parent->';
+			pre += (i ? '->' : '') + 'parent';
 		}
+		pre = '((' + info.selftype + ' *)' + pre + ')->';
 		break;
 	case 'upvar':
 		pre = 'env->';
-		for (var i = 1; i < info.depth; ++i) {
+		for (var i = info.startdepth; i < info.depth; ++i) {
 			pre += 'parent->';
 		}
 		break;
@@ -291,7 +292,8 @@
 						'\t\t\t' + this.slots[i][j][1] + '\n';
 				}
 				slotdefs += '\t\tdefault:\n' +
-					'\treturn no_impl(method_id, num_params, params, args);\n}\n';
+					'\t\t\treturn no_impl(method_id, num_params, (object *)self, args);\n\t}\n}\n';
+					
 			}
 			metadef += this.name + '_slot_' + i;
 		} else {
@@ -319,6 +321,7 @@
 	var values = [];
 	var imports = []
 	var me = new cObject('object_' + nextobject++);
+	this.symbols.typename = me.name;
 	if (this.symbols.needsenv) {
 		me.addProperty('env', this.symbols.envVar(), 'struct ' + this.symbols.getEnvType() + ' * ');
 		me.hasenv = true;
@@ -494,6 +497,16 @@
 			'return mcall(METHOD_ID_FALSE, 1, main_module);'
 		]
 	});
+	string.addMessage('NEQ_', {
+		vars: {argb: 'string *'},
+		lines: [
+			'argb = va_arg(args, string *);',
+			'if (self->length != argb->length || self->bytes != argb->bytes || memcmp(self->data, argb->data, self->bytes)) {',
+			'	return mcall(METHOD_ID_TRUE, 1, main_module);',
+			'}',
+			'return mcall(METHOD_ID_FALSE, 1, main_module);'
+		]
+	});
 	string.addMessage('print', {
 		vars: {},
 		lines: [
@@ -703,6 +716,7 @@
 	var args = this.args ? this.args.slice(0, this.args.length) : [];
 	var exprs = this.expressions;
 	var mynum = lambdanum++;
+	debugprint('//lambda', mynum);
 	if (Object.keys(this.symbols.closedover).length) {
 		this.symbols.envtype = 'lambda_' + mynum + '_env';
 	}
@@ -734,6 +748,9 @@
 	
 	if (Object.keys(this.symbols.closedover).length) {
 		forwarddec += 'typedef struct lambda_' + mynum + '_env {\n';
+		if (this.symbols.needsParentEnv) {
+			forwarddec += '\tstruct ' + this.symbols.parentEnvType() + ' * parent;\n';
+		}
 		for (var varname in this.symbols.closedover) {
 			if (varname == 'self' && this.selftype) {
 				forwarddec += '\tstruct ' + this.selftype + ' * self;\n';
--- a/compiler.js	Fri Jul 13 21:28:37 2012 -0700
+++ b/compiler.js	Sat Jul 14 00:00:24 2012 -0700
@@ -66,6 +66,7 @@
 	this.parent = parent;
 	this.names = {};
 	this.needsenv = false;
+	this.typename = null;
 }
 osymbols.prototype.find = function(name, nestedcall) {
 	debugprint('//osymbols.find', name + ', exists?:', name in this.names, ', nested?:', nestedcall);
@@ -79,6 +80,7 @@
 		var ret = {
 			type: 'self',
 			def: this.names[name],
+			selftype: this.typename
 		};
 	} else if(this.parent) {
 		var ret = this.parent.find(name, nestedcall);
@@ -140,6 +142,7 @@
 	this.needsSelfVar = false;
 	this.passthruenv = false;
 	this.envtype = 'void';
+	this.needsParentEnv = false;
 }
 lsymbols.prototype.find = function(name, nestedcall) {
 	debugprint('//lsymbols.find', name + ', exists?:', name in this.names, ', nested?:', nestedcall);
@@ -177,18 +180,22 @@
 			if (ret.type == 'upvar') {
 				if (Object.keys(this.closedover).length) {
 					ret.depth++;
+					ret.startdepth = 1;
+					this.needsParentEnv = true;
 				} else {
 					this.passthruenv = true;
-					if (ret.depth == 0) {
+					ret.startdepth = 0;
+					/*if (ret.depth == 0) {
 						ret.depth = 1;
-					}
+					}*/
 				}
 			}
 		}
 	} else {
 		return null;
 	}
-	debugprint('\t//symbol type:', ret ? ret.type : 'null');
+	var type = ret ? ret.type : 'null';
+	debugprint('\t//symbol type:', type , type == 'upvar' ? 'depth: ' + ret.depth : '');
 	return ret;
 };
 lsymbols.prototype.defineVar = function(name, def) {
@@ -261,7 +268,7 @@
 symbol.prototype.populateSymbols = function(symbols) {
 	this.symbols = symbols;
 	var ret = symbols.find(this.cleanName());
-	if (ret.type == 'self') {
+	if (ret && ret.type == 'self') {
 		symbols.find('self');
 	}
 }
--- a/parser.js	Fri Jul 13 21:28:37 2012 -0700
+++ b/parser.js	Sat Jul 14 00:00:24 2012 -0700
@@ -74,7 +74,7 @@
 'ws = ([ \\t\\n\\r] / "//" [^\\n]* "\\n")*;' +
 'hws = ([ \\t] / "/*" ([^*] / "*" ! "/")* "*/" )*;' +
 'expr = e:(funcall / methcall / opexpr) ws { return e; };' +
-'opexpr = left:addsub pieces:(hws ("<=" / ">=" / "<" / ">" / "=") hws addsub)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+
+'opexpr = left:addsub pieces:(hws ("<=" / ">=" / "<" / ">" / "=" / "!=") hws addsub)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+
 'addsub = left:muldiv pieces:(hws ("+"/"-"/".") hws muldiv)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+
 'muldiv = left:primlitsym pieces:(hws ("*"/"/") hws primlitsym)* { if (pieces.length) { var cur = new op(left, pieces[0][1], pieces[0][3]); for (var i = 1; i < pieces.length; i++) { cur = new op(cur, pieces[i][1], pieces[i][3]); } return cur; } else { return left; } };'+
 'primlitsym = hws val:(float / hex / binary / int / string / symbol / object / array / list / lambda / "(" ws expr:expr hws ")" { return expr; }) { return val; };' +