Mercurial > repos > tabletprog
view 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 |
line wrap: on
line source
array * alloc_array(uint32_t num_els) { array * arr = malloc(sizeof(array)); arr->header.meta = &array_meta; arr->header.parent = NULL; arr->storage = arr->size = num_els; if (num_els < 4) { 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 *); va_end(els); return &(arr->header); } object * make_lambda(void * env, closure_func func) { lambda * ret = malloc(sizeof(lambda)); ret->header.meta = &lambda_meta; ret->header.parent = NULL; ret->env = env; ret->func = func; return (object *) ret; } int main(int argc, char ** argv) { 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; } return 0; }