changeset 58:7b454d100dc8

Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
author Mike Pavone <pavone@retrodev.com>
date Sat, 14 Jul 2012 00:35:50 -0700
parents 08ae75d90dc2
children 0fd06e077afe
files cbackend.js runtime/progfoot.inc
diffstat 2 files changed, 31 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- 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 = '';
--- 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;