From a195cee090509d6fda8eb46da6ba938b3ae255fa Mon Sep 17 00:00:00 2001 From: nisstyre56 Date: Mon, 14 Jul 2014 01:21:50 -0400 Subject: [PATCH] explanatory comment --- closures.c | 21 ++++++++------------- 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/closures.c b/closures.c index 12947c8..089b409 100644 --- a/closures.c +++ b/closures.c @@ -35,7 +35,6 @@ box_value(svalue_variants_t value, val.type_tag = type; case CLOSURE: val.value.closure = value.closure; - /*printf("%p\n", val->value.closure->func);*/ val.type_tag = type; } return val; @@ -100,7 +99,13 @@ box_closure(closure_t *closure) { closure_t* make_closure(svalue_t *(*func)(svalue_t*, svalue_t**), svalue_t **fvars) { - closure_t *closure = calloc(sizeof(closure_t), 1); + /* The reason we dynamically allocate here is because + * svalue_variants_t will hold a pointer to the closure + * and we cannot store a pointer to a stack allocated + * closure or else it is undefined behavior when it is invoked + * since it would get deallocated when this function returns + */ + closure_t *closure = malloc(sizeof(closure_t)); closure->func = func; closure->fvars = fvars; return closure; @@ -108,7 +113,6 @@ make_closure(svalue_t *(*func)(svalue_t*, svalue_t**), inline svalue_t* invoke(svalue_t *closure, svalue_t *val) { - printf("In invoke: %p\n", closure->value.closure->func); return closure->value.closure->func(val, closure->value.closure->fvars); } @@ -136,11 +140,6 @@ make_doubleadder(svalue_t *x, svalue_t **env) { return box_closure(closure); } -void printpointer(closure_t); -void printpointer(closure_t closure) { - printf("%p\n", closure.func); -} - int main(void) { (void)box_float; @@ -148,14 +147,10 @@ main(void) { (void)box_string; svalue_t **env = calloc(sizeof(svalue_t *), 2); closure_t *closure1_closure = make_closure(make_doubleadder, env); - printf("First %p\n", closure1_closure->func); svalue_t *closure1 = box_closure(closure1_closure); - printf("Second %p\n", closure1->value.closure->func); svalue_t *c1 = invoke(closure1, box_int(23)); - printf("Last %p\n", c1->value.closure->func); svalue_t *c2 = invoke(c1, box_int(5)); - printf("%d\n", c2->value.closure->fvars[1]->value.integer); svalue_t *result = invoke(c2, box_int(334)); - printf("%d\n", result->value.integer); + printf("print 23 + 5 + 334 == %d\n", result->value.integer); return 0; }