Mercurial > repos > tabletprog
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; |