changeset 172:8d466c5a7dff

Fixed a few bugs. Improved the "symbol not found" error messages. Added a "signed?" method to integer objects
author Mike Pavone <pavone@retrodev.com>
date Wed, 21 Aug 2013 07:59:34 -0700
parents 869399ff7faa
children 158444b77c09
files cbackend.js
diffstat 1 files changed, 17 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/cbackend.js	Tue Aug 13 22:01:00 2013 -0700
+++ b/cbackend.js	Wed Aug 21 07:59:34 2013 -0700
@@ -47,7 +47,7 @@
 	if (name == 'self') {
 		return name;
 	}
-	name = name.replace("_", "UN_").replace(":", "CN_").replace("!", "EX_").replace('?', 'QS_').replace('@', 'AT_');
+	name = name.replace(/_/g, "UN_").replace(/:/g, "CN_").replace(/!/g, "EX_").replace(/\?/g, 'QS_').replace(/@/g, 'AT_');
 	name = 'tp_' + name;
 	return name;
 }
@@ -90,7 +90,7 @@
 	var name = this.cleanName();
 	var info = this.symbols.find(name);
 	if (!info) {
-		throw new Error('symbol ' + name + ' not found');
+		throw new Error('symbol ' + name + ' not found in ' + assignNames.join('<-'));
 	}
 	if (info.type == 'toplevel') {
 		return toplevel.moduleVar(name);
@@ -262,7 +262,8 @@
 			callpart = 'mcall(' + getMethodId(name) + '/* ' + name + ' */';
 		}
 	} else {
-		callpart = 'ccall(' + (new symbol(name, this.symbols)).toC();
+		var closVar = (new symbol(name, this.symbols)).toC();
+		callpart = '((lambda *)' + closVar + ')->func(((lambda *)' + closVar + ')->env';
 	}
 	return callpart + ', ' + args.length + args.join('') + ')';
 };
@@ -696,6 +697,12 @@
 			'return &(self->header);'
 		]
 	});
+	intObj.addMessage('signed?', {
+		vars: {},
+		lines: [
+			'return ' + toplevel.moduleVar(unsigned ? 'false' : 'true') + ';'
+		]
+	});
 	var sizes = [8, 16, 32, 64];
 	var destunsigned = [false, true];
 	for (var i = 0; i < sizes.length; i++) {
@@ -1029,10 +1036,14 @@
 			compiled.push(indent(js));
 		}
 	}
+	if (compiled.length) {
+		if (exprs[exprs.length - 1] instanceof assignment) {
+			compiled.push('return ' + exprs[exprs.length - 1].symbol.toC() + ';');
+		} else {
+			compiled[compiled.length-1] = 'return (object *)(' + compiled[compiled.length-1] + ');';
+		}
+	}
 	exprs = compiled;
-	if (exprs.length) {
-		exprs[exprs.length-1] = 'return (object *)(' + exprs[exprs.length-1] + ');';
-	}
 
 	if (Object.keys(this.symbols.closedover).length) {
 		if (!addedTypeDef) {