annotate runtime/progfoot.inc @ 69:ba032565c7a5

Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
author Mike Pavone <pavone@retrodev.com>
date Sat, 14 Jul 2012 19:24:04 -0700
parents 7b454d100dc8
children abc6f3d644a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
1
58
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
2 array * alloc_array(uint32_t num_els)
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
3 {
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
4 array * arr = malloc(sizeof(array));
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
5 arr->header.meta = &array_meta;
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
6 arr->header.parent = NULL;
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
7 arr->storage = arr->size = num_els;
40
927fd7911a01 Add append message to array
Mike Pavone <pavone@retrodev.com>
parents: 38
diff changeset
8 if (num_els < 4) {
927fd7911a01 Add append message to array
Mike Pavone <pavone@retrodev.com>
parents: 38
diff changeset
9 arr->storage = 4;
927fd7911a01 Add append message to array
Mike Pavone <pavone@retrodev.com>
parents: 38
diff changeset
10 }
927fd7911a01 Add append message to array
Mike Pavone <pavone@retrodev.com>
parents: 38
diff changeset
11 arr->data = malloc(sizeof(object *) * arr->storage);
58
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
12 }
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
13
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
14 object * make_array(uint32_t num_els, ...)
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
15 {
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
16 va_list els;
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
17 int i;
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
18 array * arr = alloc_array(num_els);
38
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
19 va_start(els, num_els);
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
20 for (i = 0; i < num_els; i++)
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
21 arr->data[i] = va_arg(els, object *);
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
22 va_end(els);
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
23 return &(arr->header);
e7be612fd3ae Very basic array support
Mike Pavone <pavone@retrodev.com>
parents: 35
diff changeset
24 }
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
25
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
26 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
27 {
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 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
29 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
30 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
31 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
32 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
33 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
34 }
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
35
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
36 int main(int argc, char ** argv)
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
37 {
58
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
38 int i;
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
39 string * arg;
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
40 array * arr = alloc_array(argc);
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
41 for (i = 0; i < argc; ++i) {
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
42 arg = (string *)make_object(&string_meta, NULL, 0);
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
43 arg->data = argv[i];
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
44 arg->bytes = arg->length = strlen(argv[i]);
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
45 arr->data[i] = &(arg->header);
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
46 }
7b454d100dc8 Add length method to array. Pass array of arguments to main method. Initialize parent field of environment struct for closures
Mike Pavone <pavone@retrodev.com>
parents: 45
diff changeset
47 object * ret = mcall(METHOD_ID_MAIN, 2, mainModule(), &(arr->header));
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
48 if (ret->meta == &obj_int32_meta) {
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
49 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
50 return reti32->num;
31
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
51 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
52 return 0;
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
53 }
668f533e5284 Add initial version of C backend
Mike Pavone <pavone@retrodev.com>
parents:
diff changeset
54