changeset 72:ab6f24d6945d

Fix determination of whether a method call has an implicit self argument or not. Cleanup C warnings in output.
author Mike Pavone <pavone@retrodev.com>
date Sat, 14 Jul 2012 21:00:21 -0700
parents 0efd25a4958a
children 327db7cf37a2
files cbackend.js
diffstat 1 files changed, 21 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/cbackend.js	Sat Jul 14 19:32:14 2012 -0700
+++ b/cbackend.js	Sat Jul 14 21:00:21 2012 -0700
@@ -169,30 +169,36 @@
 	}
 	var method = false;
 	var funinfo = this.symbols.find(name);
+	var start = 0;
 	if (!funinfo || funinfo.def instanceof setter) {
 		method = true;
 	} else {
 		switch(funinfo.type)
 		{
 		case 'self':
-			
-			if (args.length < funinfo.def.args.length || !funinfo.def.args.length || funinfo.def.args[0].name != 'self') {
-				args.splice(0, 0, new symbol('self', this.symbols));
-			} else {
-				args.splice(0, 1);
+		case 'parent':
+			var defargs = funinfo.def.args.length;
+			if (!defargs || funinfo.def.args[0].name != 'self') {
+				defargs ++
+			}
+			if (args.length < defargs) {
+				if (funinfo.type == 'self') {
+					args.splice(0, 0, new symbol('self', this.symbols));
+				} else {
+					var obj = (new symbol('self', this.symbols)).toC() + '->header.';
+					for (var i = 0; i < funinfo.depth; ++i) {
+						obj += (i ? '->' : '') + 'parent';
+					}
+					args.splice(0, 0, ', ' + obj);
+					start = 1;
+				}
 			}
 			method = true;
 			break;
-		case 'parent':
-			ret = 'self';
-			for (var i = 0; i < funinfo.depth; ++i) {
-				ret += '->parent';
-			}
-			break;
 		}
 	}
-	for (var i in args) {
-		args[i] = ', ' + args[i].toC();
+	for (var i = start; i < args.length; i++) {
+		args[i] = ', ' + (!i && method ? '(object *)(' : '') + args[i].toC() + (!i && method ? ')' : '');
 	}
 	var callpart;
 	if (method) {
@@ -831,7 +837,7 @@
 	}
 	exprs = compiled;
 	if (exprs.length) {
-		exprs[exprs.length-1] = 'return ' + exprs[exprs.length-1] + ';';
+		exprs[exprs.length-1] = 'return (object *)(' + exprs[exprs.length-1] + ');';
 	}
 	
 	if (Object.keys(this.symbols.closedover).length) {
@@ -943,7 +949,7 @@
 	} else {
 		cobj.addProperty(this.symbol.name, val);
 		if (this.expression instanceof object && this.expression.symbols.needsparent) {
-			cobj.addInit('self->' + escapeCName(this.symbol.name) + '->parent = self;');
+			cobj.addInit('self->' + escapeCName(this.symbol.name) + '->parent = (object *)self;');
 		}
 	}
 };