changeset 93:46504d34cb44

merge
author William Morgan <bill@mrgn.org>
date Tue, 24 Jul 2012 00:35:24 -0700
parents 6abbf2454657 (current diff) b5152f5ac138 (diff)
children 6735db9b44ba
files
diffstat 3 files changed, 122 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/cbackend.js	Mon Jul 23 01:07:52 2012 -0700
+++ b/cbackend.js	Tue Jul 24 00:35:24 2012 -0700
@@ -12,33 +12,6 @@
 	return methodIds[methodName];
 }
 
-function importSym(obj, src, key)
-{
-	if(!(key in src)) {
-		throw new Error(key +' not found in source object for import');
-	}
-	if(key in obj) {
-		throw new Error(key +' already exists in target object for import')
-	}
-	obj[key] = src[key];
-}
-
-function doImport(obj, src, symlist)
-{
-	if (symlist === undefined) {
-		each(src, function(key,val) {
-			if (key != 'parent') {
-				importSym(obj, src, key);
-			}
-		});
-	} else {
-		for (var i = 0; i < symlist.length; ++i) {
-			importSym(obj, src, symlist[i]);
-		}
-	}
-	return obj;
-}
-
 op.prototype.toC = function(isReceiver) {
 	var optoMeth = {'+': 'ADD_', '-': 'SUB_', '*': 'MUL_', '/': 'DIV_', '%': 'MOD_', '=': 'EQ_', '!=': 'NEQ_', '<': 'LT_', '>': 'GT_', '>=': 'GEQ_', '<=': 'LEQ_', '.': 'CAT_'};
 	var method = optoMeth[this.op];
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/modules/string.tp	Tue Jul 24 00:35:24 2012 -0700
@@ -0,0 +1,96 @@
+#{
+	llProperty: len withType: uint32_t
+	llProperty: bytes withType: uint32_t
+	llProperty: data withType: (char ptr)
+	
+	llMessage: length withVars: {
+		intret <- (obj_int32 ptr)
+	} andCode: {
+		intret <- make_object: (addr_of: obj_int32_meta) NULL 0
+		intret num!: len
+		intret
+	}
+	
+	llMessage: byte_length withVars: {
+		intret <- (obj_int32 ptr)
+	} andCode: {
+		intret <- make_object: (addr_of: obj_int32_meta) NULL 0
+		intret num!: bytes
+		intret
+	}
+	
+	llMessage: EQ_ withVars: {
+		argb <- (string ptr)
+	} andCode: :argb {
+		if: len = (argb len) && bytes = (argb bytes) && (not: (memcmp: data (argb data) bytes)) {
+			true
+		}
+	}
+	
+	llMessage: NEQ_ withVars: {
+		argb <- (string ptr)
+	} andCode: :argb {
+		if: len != (argb len) || bytes != (argb bytes) || (memcmp: data (argb data) bytes) {
+			true
+		}
+	}
+	
+	llMessage: print withVars: {} andCode: {
+		fwrite: data 1 bytes stdout
+		self
+	}
+	
+	llMessage: string withVars: {} andCode: {
+		self
+	}
+	
+	llMessage: CAT_ withVars: {
+		argbo <- (object ptr)
+		argb <- (string ptr)
+		out <- (string ptr)
+	} andCode: :argbo {
+		argb <- mcall: string 1 argbo
+		out <- make_object: (addr_of: string_meta) NULL 0
+		out bytes!: bytes + (argb bytes)
+		out len!: len + (argb len)
+		out data!: (GC_MALLOC_ATOMIC: (out bytes) + 1)
+		memcpy: (out data) data bytes
+		memcpy: (out data) + bytes (argb data) (argb bytes) + 1
+		out
+	}
+	
+	llMessage: byte withVars: {
+		index <- (obj_int32 ptr)
+		intret <- (obj_int32 ptr)
+	} andCode: :index {
+		intret <- make_object: (addr_of: obj_int32_meta) NULL 0
+		intret num!: (if: (index num) < bytes { data get: (index num) } else: {0})
+		intret
+	}
+	
+	llMessage: int32 withVars: {
+		intret <- (obj_int32 ptr)
+	} andCode: {
+		intret  <- make_object: (addr_of: obj_int32_meta) NULL 0
+		intret num!: (atoi: data)
+		intret
+	}
+	
+	llMessage: hash withVars: {
+		intret <- (obj_int32 ptr)
+		i <- uint32_t
+	} andCode: {
+		intret <- make_object: (addr_of: obj_int32_meta) NULL 0
+		intret num!: 0
+		if: bytes {
+			intret num!: (data get: 0) * 128
+			i <- 0
+			while: { i < bytes } do: {
+				intret num!: (1000003 * (intret num)) xor (data get: i)
+				i <- i + 1
+			}
+			intret num!: (intret num) xor bytes
+		}
+		intret
+	}
+}
--- a/tpc.js	Mon Jul 23 01:07:52 2012 -0700
+++ b/tpc.js	Tue Jul 24 00:35:24 2012 -0700
@@ -6,12 +6,14 @@
 var includes = ['.'];
 var basedir = '';
 var debugmode = false;
+var backend = 'C';
 for (var i = 0; i < arguments.length; i++) {
 	switch (argtype) {
 	case 'normal':
 		switch (arguments[i]) {
 		case '-basedir':
 		case '-i':
+		case '-backend':
 			argtype = arguments[i];
 			break;
 		case '-compilerdebug':
@@ -38,6 +40,10 @@
 		includes.push(arguments[i]);
 		argtype = 'normal';
 		break;
+	case '-backend':
+		backend = arguments[i];
+		argtype = 'normal';
+		break;
 	}
 }
 if (argtype != 'normal') {
@@ -50,7 +56,7 @@
 	quit(1);
 }
 includes.push(basedir + 'modules');
-compileFile(file, basedir, includes, debugmode);
+compileFile(file, basedir, includes, debugmode, backend);
 
 
 function parseFile(filename)
@@ -78,19 +84,35 @@
 }
 
 
-function compileFile(filename, basedir, includes, debugmode)
+function compileFile(filename, basedir, includes, debugmode, backend)
 {
 	
 	load(basedir + 'peg.js');
 	PEG = module.exports;
 	load(basedir + 'parser.js');
 	load(basedir + 'compiler.js');
-	load(basedir + 'cbackend.js');
+	if (backend == 'C') {
+		load(basedir + 'cbackend.js');
+	} else {
+		load(basedir + 'jsbackend.js');
+	}
+	
 	var parsed = parseFile(filename);
 	if (debugmode) {
 		debugprint = print;
 	}
 	toplevel = new topsymbols(includes);
-	var c = parsed.toCModule();
+	switch(backend)
+	{
+	case 'C':
+		var c = parsed.toCModule();
+		break;
+	case 'JS':
+		var c = parsed.toJSModule();
+		break;
+	default:
+		print('Backend', backend, ' not recognized');
+		quit(1);
+	}
 	print(c);
 }