# HG changeset patch # User William Morgan # Date 1343115324 25200 # Node ID 46504d34cb44e124595f1fe70645c61b2c2b7775 # Parent 6abbf24546571ea1b8fad6488d9591aa645ae4f7# Parent b5152f5ac13839bcce4ae48079a2d5acfeb2ba7b merge diff -r 6abbf2454657 -r 46504d34cb44 cbackend.js --- 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]; diff -r 6abbf2454657 -r 46504d34cb44 modules/string.tp --- /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 + } +} diff -r 6abbf2454657 -r 46504d34cb44 tpc.js --- 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); }