From b0c2eb5a5e463ddb662701d95775ed5ea7e52276 Mon Sep 17 00:00:00 2001 From: Danila Fedorin Date: Fri, 10 Aug 2018 17:31:02 -0700 Subject: [PATCH] Maintain the promise that references are null-ed on error. --- src/interpreter.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/interpreter.c b/src/interpreter.c index 7405a3a..1bd68f0 100644 --- a/src/interpreter.c +++ b/src/interpreter.c @@ -939,6 +939,7 @@ libab_result _interpreter_call_operator(struct interpreter_state* state, libab_ref_vec params; libab_ref temp; + libab_ref_null(into); libab_ref_null(&function_value); va_start(args, scope); result = libab_ref_vec_init(¶ms); @@ -972,6 +973,7 @@ libab_result _interpreter_call_operator(struct interpreter_state* state, } if(result == LIBAB_SUCCESS) { + libab_ref_free(into); result = _interpreter_try_call(state, &function_value, ¶ms, into); } @@ -1151,7 +1153,7 @@ libab_result _interpreter_run(struct interpreter_state* state, libab_tree* tree, } if (result != LIBAB_SUCCESS) { - + libab_ref_null(into); } else if (tree->variant == TREE_BASE || tree->variant == TREE_BLOCK) { size_t index = 0; libab_get_unit_value(state->ab, into); @@ -1231,6 +1233,8 @@ libab_result _interpreter_run(struct interpreter_state* state, libab_tree* tree, int* boolean = libab_ref_get(&condition_value->data); result = _interpreter_run(state, vec_index(&tree->children, *boolean ? 1 : 2), into, scope, SCOPE_NORMAL); + } else { + libab_ref_null(into); } libab_ref_free(&condition);