diff cbackend.js @ 57:08ae75d90dc2

Add != operator. Fix more closure bugs.
author Mike Pavone <pavone@retrodev.com>
date Sat, 14 Jul 2012 00:00:24 -0700
parents 93ddb4ad6fcb
children 7b454d100dc8
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';