# HG changeset patch # User Mike Pavone # Date 1342251350 25200 # Node ID 7b454d100dc8afd97465c29357296e958eedb522 # Parent 08ae75d90dc2b401295b8a306fa2337cf9e2aedc Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures diff -r 08ae75d90dc2 -r 7b454d100dc8 cbackend.js --- a/cbackend.js Sat Jul 14 00:00:24 2012 -0700 +++ b/cbackend.js Sat Jul 14 00:35:50 2012 -0700 @@ -462,6 +462,14 @@ 'return &(self->header);' ] }); + array.addMessage('length', { + vars: {intret: 'obj_int32 *'}, + lines: [ + 'intret = make_object(&obj_int32_meta, NULL, 0);', + 'intret->num = self->size;', + 'return intret;' + ] + }); return array; } @@ -592,7 +600,8 @@ 'str = make_object(&string_meta, NULL, 0);', 'str->data = malloc(size->num + 1);', 'str->length = str->bytes = read(filedes->num, str->data, size->num);', - 'str->data[str->bytes+1] = 0;', + 'if (str->bytes < 0) { str->bytes = str->length = 0; }', + 'str->data[str->bytes] = 0;', 'return str;' ] }); @@ -761,6 +770,9 @@ forwarddec += '} lambda_' + mynum + '_env;\n' var myenvinit = '\tlambda_' + mynum + '_env * myenv = malloc(sizeof(lambda_' + mynum + '_env));\n'; + if (this.symbols.needsParentEnv) { + myenvinit += '\tmyenv->parent = env;\n'; + } this.symbols.envtype = 'lambda_' + mynum + '_env'; } else { var myenvinit = ''; diff -r 08ae75d90dc2 -r 7b454d100dc8 runtime/progfoot.inc --- a/runtime/progfoot.inc Sat Jul 14 00:00:24 2012 -0700 +++ b/runtime/progfoot.inc Sat Jul 14 00:35:50 2012 -0700 @@ -1,8 +1,6 @@ -object * make_array(uint32_t num_els, ...) +array * alloc_array(uint32_t num_els) { - va_list els; - int i; array * arr = malloc(sizeof(array)); arr->header.meta = &array_meta; arr->header.parent = NULL; @@ -11,6 +9,13 @@ arr->storage = 4; } arr->data = malloc(sizeof(object *) * arr->storage); +} + +object * make_array(uint32_t num_els, ...) +{ + va_list els; + int i; + array * arr = alloc_array(num_els); va_start(els, num_els); for (i = 0; i < num_els; i++) arr->data[i] = va_arg(els, object *); @@ -30,7 +35,16 @@ int main(int argc, char ** argv) { - object * ret = mcall(METHOD_ID_MAIN, 1, mainModule()); + int i; + string * arg; + array * arr = alloc_array(argc); + for (i = 0; i < argc; ++i) { + arg = (string *)make_object(&string_meta, NULL, 0); + arg->data = argv[i]; + arg->bytes = arg->length = strlen(argv[i]); + arr->data[i] = &(arg->header); + } + object * ret = mcall(METHOD_ID_MAIN, 2, mainModule(), &(arr->header)); if (ret->meta == &obj_int32_meta) { obj_int32 * reti32 = (obj_int32 *) ret; return reti32->num;