Просмотр исходного кода

bugfix function closure value handling

ncannasse 7 лет назад
Родитель
Сommit
37247006e7
1 измененных файлов с 6 добавлено и 3 удалено
  1. 6 3
      src/std/fun.c

+ 6 - 3
src/std/fun.c

@@ -30,6 +30,7 @@ HL_PRIM vclosure *hl_alloc_closure_void( hl_type *t, void *fvalue ) {
 	c->t = t;
 	c->t = t;
 	c->fun = fvalue;
 	c->fun = fvalue;
 	c->hasValue = false;
 	c->hasValue = false;
+	c->value = NULL;
 	return c;
 	return c;
 }
 }
 
 
@@ -80,11 +81,13 @@ HL_PRIM vdynamic *hl_make_closure( vdynamic *c, vdynamic *v ) {
 
 
 HL_PRIM vdynamic* hl_get_closure_value( vdynamic *c ) {
 HL_PRIM vdynamic* hl_get_closure_value( vdynamic *c ) {
 	vclosure *cl = (vclosure*)c;
 	vclosure *cl = (vclosure*)c;
+	if( !cl->hasValue )
+		return NULL;
 	if( cl->hasValue == 2 )
 	if( cl->hasValue == 2 )
 		return hl_get_closure_value((vdynamic*)((vclosure_wrapper*)c)->wrappedFun);
 		return hl_get_closure_value((vdynamic*)((vclosure_wrapper*)c)->wrappedFun);
-	if( cl->hasValue && cl->fun != fun_var_args )
-		return hl_make_dyn(&cl->value, cl->t->fun->parent->fun->args[0]);
-	return (vdynamic*)cl->value;
+	if( cl->fun == fun_var_args )
+		return (vdynamic*)cl->value;
+	return hl_make_dyn(&cl->value, cl->t->fun->parent->fun->args[0]);
 }
 }
 
 
 HL_PRIM bool hl_fun_compare( vdynamic *a, vdynamic *b ) {
 HL_PRIM bool hl_fun_compare( vdynamic *a, vdynamic *b ) {