Mercurial > repos > tabletprog
annotate runtime/progfoot.inc @ 55:93ddb4ad6fcb
Fix some nested closure bugs
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 13 Jul 2012 21:05:52 -0700 |
parents | 2a9c6eed0c70 |
children | 7b454d100dc8 |
rev | line source |
---|---|
38 | 1 |
2 object * make_array(uint32_t num_els, ...) | |
3 { | |
4 va_list els; | |
5 int i; | |
6 array * arr = malloc(sizeof(array)); | |
7 arr->header.meta = &array_meta; | |
8 arr->header.parent = NULL; | |
9 arr->storage = arr->size = num_els; | |
40
927fd7911a01
Add append message to array
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
10 if (num_els < 4) { |
927fd7911a01
Add append message to array
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
11 arr->storage = 4; |
927fd7911a01
Add append message to array
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
12 } |
927fd7911a01
Add append message to array
Mike Pavone <pavone@retrodev.com>
parents:
38
diff
changeset
|
13 arr->data = malloc(sizeof(object *) * arr->storage); |
38 | 14 va_start(els, num_els); |
15 for (i = 0; i < num_els; i++) | |
16 arr->data[i] = va_arg(els, object *); | |
17 va_end(els); | |
18 return &(arr->header); | |
19 } | |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
20 |
45
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
21 object * make_lambda(void * env, closure_func func) |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
22 { |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
23 lambda * ret = malloc(sizeof(lambda)); |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
24 ret->header.meta = &lambda_meta; |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
25 ret->header.parent = NULL; |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
26 ret->env = env; |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
27 ret->func = func; |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
28 return (object *) ret; |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
29 } |
2a9c6eed0c70
Move closure/lambda object def into compiler rather than runtime code. Add while:do method to lambda
Mike Pavone <pavone@retrodev.com>
parents:
44
diff
changeset
|
30 |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
31 int main(int argc, char ** argv) |
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
32 { |
35
bf5e88f6419d
Use a function/method call strategy that actually works
Mike Pavone <pavone@retrodev.com>
parents:
31
diff
changeset
|
33 object * ret = mcall(METHOD_ID_MAIN, 1, mainModule()); |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
34 if (ret->meta == &obj_int32_meta) { |
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
35 obj_int32 * reti32 = (obj_int32 *) ret; |
44
9dd370530f69
Fix escape codes in string literals. Don't print out the return value of main method. Fixup fib example to use print: method. Cleanup error handling in compiler slightly
Mike Pavone <pavone@retrodev.com>
parents:
40
diff
changeset
|
36 return reti32->num; |
31
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
37 } |
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
38 return 0; |
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
39 } |
668f533e5284
Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff
changeset
|
40 |