From a66c175d98a80caa307f9bd6aeeafb5fd2f84a0f Mon Sep 17 00:00:00 2001 From: Ruben Ayrapetyan Date: Wed, 15 Oct 2014 20:39:56 +0400 Subject: [PATCH] Fixing 'delete_var' opcode handler. --- src/libcoreint/opcodes.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/libcoreint/opcodes.c b/src/libcoreint/opcodes.c index 9069a47d7..f3a569a6e 100644 --- a/src/libcoreint/opcodes.c +++ b/src/libcoreint/opcodes.c @@ -1542,19 +1542,28 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */ { ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_SYNTAX)); } - else if (ecma_is_value_undefined (ref.base)) - { - ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE); - } else { - JERRY_ASSERT (ref.base.value_type == ECMA_TYPE_OBJECT); - ecma_object_t *bindings_p = ECMA_GET_POINTER (ref.base.value); - JERRY_ASSERT (ecma_is_lexical_environment (bindings_p)); + if (ecma_is_value_undefined (ref.base)) + { + ret_value = set_variable_value (int_data, + dst_var_idx, + ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE)); + } + else + { + JERRY_ASSERT (ref.base.value_type == ECMA_TYPE_OBJECT); + ecma_object_t *bindings_p = ECMA_GET_POINTER (ref.base.value); + JERRY_ASSERT (ecma_is_lexical_environment (bindings_p)); - ecma_completion_value_t completion = ecma_op_delete_binding (bindings_p, ref.referenced_name_p); + ECMA_TRY_CATCH (delete_completion, + ecma_op_delete_binding (bindings_p, ref.referenced_name_p), + ret_value); - ret_value = set_variable_value (int_data, dst_var_idx, completion.u.value); + ret_value = set_variable_value (int_data, dst_var_idx, delete_completion.u.value); + + ECMA_FINALIZE (delete_completion); + } } ecma_free_reference (ref);