comparison runtime/progfoot.inc @ 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 2a9c6eed0c70
children abc6f3d644a4
comparison
equal deleted inserted replaced
57:08ae75d90dc2 58:7b454d100dc8
1 1
2 object * make_array(uint32_t num_els, ...) 2 array * alloc_array(uint32_t num_els)
3 { 3 {
4 va_list els;
5 int i;
6 array * arr = malloc(sizeof(array)); 4 array * arr = malloc(sizeof(array));
7 arr->header.meta = &array_meta; 5 arr->header.meta = &array_meta;
8 arr->header.parent = NULL; 6 arr->header.parent = NULL;
9 arr->storage = arr->size = num_els; 7 arr->storage = arr->size = num_els;
10 if (num_els < 4) { 8 if (num_els < 4) {
11 arr->storage = 4; 9 arr->storage = 4;
12 } 10 }
13 arr->data = malloc(sizeof(object *) * arr->storage); 11 arr->data = malloc(sizeof(object *) * arr->storage);
12 }
13
14 object * make_array(uint32_t num_els, ...)
15 {
16 va_list els;
17 int i;
18 array * arr = alloc_array(num_els);
14 va_start(els, num_els); 19 va_start(els, num_els);
15 for (i = 0; i < num_els; i++) 20 for (i = 0; i < num_els; i++)
16 arr->data[i] = va_arg(els, object *); 21 arr->data[i] = va_arg(els, object *);
17 va_end(els); 22 va_end(els);
18 return &(arr->header); 23 return &(arr->header);
28 return (object *) ret; 33 return (object *) ret;
29 } 34 }
30 35
31 int main(int argc, char ** argv) 36 int main(int argc, char ** argv)
32 { 37 {
33 object * ret = mcall(METHOD_ID_MAIN, 1, mainModule()); 38 int i;
39 string * arg;
40 array * arr = alloc_array(argc);
41 for (i = 0; i < argc; ++i) {
42 arg = (string *)make_object(&string_meta, NULL, 0);
43 arg->data = argv[i];
44 arg->bytes = arg->length = strlen(argv[i]);
45 arr->data[i] = &(arg->header);
46 }
47 object * ret = mcall(METHOD_ID_MAIN, 2, mainModule(), &(arr->header));
34 if (ret->meta == &obj_int32_meta) { 48 if (ret->meta == &obj_int32_meta) {
35 obj_int32 * reti32 = (obj_int32 *) ret; 49 obj_int32 * reti32 = (obj_int32 *) ret;
36 return reti32->num; 50 return reti32->num;
37 } 51 }
38 return 0; 52 return 0;