From 308bb3c8e1a5b550f264f039aa85411c3166886a Mon Sep 17 00:00:00 2001 From: Zoltan Herczeg Date: Fri, 3 Jun 2016 04:12:10 -0700 Subject: [PATCH] Remove last_completion_value. JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com --- jerry-core/vm/vm.c | 337 +++++++++++++++++++-------------------------- 1 file changed, 138 insertions(+), 199 deletions(-) diff --git a/jerry-core/vm/vm.c b/jerry-core/vm/vm.c index e9ed48f284..de2033c9e1 100644 --- a/jerry-core/vm/vm.c +++ b/jerry-core/vm/vm.c @@ -486,22 +486,22 @@ opfunc_construct (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ name_p); \ if (ref_base_lex_env_p != NULL) \ { \ - last_completion_value = ecma_op_get_value_lex_env_base (ref_base_lex_env_p, \ - name_p, \ - is_strict); \ + result = ecma_op_get_value_lex_env_base (ref_base_lex_env_p, \ + name_p, \ + is_strict); \ } \ else \ { \ - last_completion_value = ecma_raise_reference_error (ECMA_ERR_MSG ("")); \ + result = ecma_raise_reference_error (ECMA_ERR_MSG ("")); \ } \ \ ecma_deref_ecma_string (name_p); \ \ - if (ecma_is_value_error (last_completion_value)) \ + if (ecma_is_value_error (result)) \ { \ goto error; \ } \ - (target_value) = last_completion_value; \ + (target_value) = result; \ } \ } \ else if (literal_index < const_literal_end) \ @@ -551,7 +551,7 @@ vm_init_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ { const ecma_compiled_code_t *bytecode_header_p = frame_ctx_p->bytecode_header_p; uint8_t *byte_code_p = frame_ctx_p->byte_code_p; - ecma_value_t last_completion_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); + ecma_value_t result = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); uint16_t encoding_limit; uint16_t encoding_delta; uint16_t register_end; @@ -678,7 +678,7 @@ vm_init_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } } - return last_completion_value; + return result; } /* vm_init_loop */ /** @@ -692,7 +692,6 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ const ecma_compiled_code_t *bytecode_header_p = frame_ctx_p->bytecode_header_p; uint8_t *byte_code_p = frame_ctx_p->byte_code_p; lit_cpointer_t *literal_start_p = frame_ctx_p->literal_start_p; - ecma_value_t last_completion_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); ecma_value_t *stack_top_p; uint16_t encoding_limit; @@ -703,7 +702,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ int32_t branch_offset = 0; ecma_value_t left_value; ecma_value_t right_value; - ecma_value_t result = 0; + ecma_value_t result = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); ecma_value_t block_result = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); bool is_strict = ((frame_ctx_p->bytecode_header_p->status_flags & CBC_CODE_FLAGS_STRICT_MODE) != 0); @@ -963,14 +962,14 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } else { - last_completion_value = ecma_op_to_string (right_value); + result = ecma_op_to_string (right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - prop_name_p = ecma_get_string_from_value (last_completion_value); + prop_name_p = ecma_get_string_from_value (result); property_p = ecma_find_named_property (object_p, prop_name_p); } @@ -1006,13 +1005,12 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } case VM_OC_PUSH_ARRAY: { - last_completion_value = ecma_op_create_array_object (NULL, 0, false); + result = ecma_op_create_array_object (NULL, 0, false); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - result = last_completion_value; break; } case VM_OC_PUSH_ELISON: @@ -1102,16 +1100,16 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ if (ref_base_lex_env_p != NULL) { - last_completion_value = ecma_op_get_value_lex_env_base (ref_base_lex_env_p, - name_p, - is_strict); + result = ecma_op_get_value_lex_env_base (ref_base_lex_env_p, + name_p, + is_strict); } else { - last_completion_value = ecma_raise_reference_error (ECMA_ERR_MSG ("")); + result = ecma_raise_reference_error (ECMA_ERR_MSG ("")); } - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { ecma_deref_ecma_string (name_p); goto error; @@ -1120,8 +1118,6 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ ecma_ref_object (ref_base_lex_env_p); *stack_top_p++ = ecma_make_object_value (ref_base_lex_env_p); *stack_top_p++ = ecma_make_string_value (name_p); - - result = last_completion_value; } break; } @@ -1155,10 +1151,10 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ case VM_OC_PROP_POST_INCR: case VM_OC_PROP_POST_DECR: { - last_completion_value = vm_op_get_value (left_value, - right_value); + result = vm_op_get_value (left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { if (opcode >= CBC_PUSH_PROP_REFERENCE && opcode < CBC_PRE_INCR) { @@ -1168,8 +1164,6 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ goto error; } - result = last_completion_value; - if (opcode < CBC_PRE_INCR) { if (opcode >= CBC_PUSH_PROP_REFERENCE) @@ -1192,15 +1186,14 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ { uint32_t opcode_flags = VM_OC_GROUP_GET_INDEX (opcode_data) - VM_OC_PROP_PRE_INCR; - last_completion_value = ecma_op_to_number (left_value); + result = ecma_op_to_number (left_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } byte_code_p = byte_code_start_p + 1; - result = last_completion_value; if (ecma_is_value_integer_number (result)) { @@ -1352,19 +1345,19 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ block_result = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); } - last_completion_value = left_value; + result = left_value; left_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); goto error; } case VM_OC_THROW: { - last_completion_value = ecma_make_error_value (left_value); + result = ecma_make_error_value (left_value); left_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); goto error; } case VM_OC_THROW_REFERENCE_ERROR: { - last_completion_value = ecma_raise_reference_error (ECMA_ERR_MSG ("")); + result = ecma_raise_reference_error (ECMA_ERR_MSG ("")); goto error; } case VM_OC_EVAL: @@ -1391,23 +1384,21 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ frame_ctx_p->call_operation = VM_NO_EXEC_OP; - last_completion_value = *(--stack_top_p); + result = *(--stack_top_p); block_result = frame_ctx_p->call_block_result; - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } if (VM_OC_HAS_PUT_RESULT (opcode_data)) { - result = last_completion_value; - } - else - { - left_value = last_completion_value; + break; } - break; + + ecma_fast_free_value (result); + continue; } case VM_OC_NEW: { @@ -1427,28 +1418,25 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ frame_ctx_p->call_operation = VM_NO_EXEC_OP; - last_completion_value = *(--stack_top_p); + result = *(--stack_top_p); block_result = frame_ctx_p->call_block_result; - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } JERRY_ASSERT (VM_OC_HAS_PUT_RESULT (opcode_data)); - result = last_completion_value; break; } case VM_OC_PROP_DELETE: { - last_completion_value = vm_op_delete_prop (left_value, right_value, is_strict); + result = vm_op_delete_prop (left_value, right_value, is_strict); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_DELETE: @@ -1463,16 +1451,14 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ break; } - last_completion_value = vm_op_delete_var (literal_start_p[literal_index], - frame_ctx_p->lex_env_p, - is_strict); + result = vm_op_delete_var (literal_start_p[literal_index], + frame_ctx_p->lex_env_p, + is_strict); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_JUMP: @@ -1521,52 +1507,44 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } case VM_OC_PLUS: { - last_completion_value = opfunc_unary_plus (left_value); + result = opfunc_unary_plus (left_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_MINUS: { - last_completion_value = opfunc_unary_minus (left_value); + result = opfunc_unary_minus (left_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_NOT: { - last_completion_value = opfunc_logical_not (left_value); + result = opfunc_logical_not (left_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_BIT_NOT: { - last_completion_value = do_number_bitwise_logic (NUMBER_BITWISE_NOT, - left_value, - left_value); + result = do_number_bitwise_logic (NUMBER_BITWISE_NOT, + left_value, + left_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_TYPEOF_IDENT: @@ -1596,123 +1574,107 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ break; } - last_completion_value = ecma_op_get_value_lex_env_base (ref_base_lex_env_p, - name_p, - is_strict); + result = ecma_op_get_value_lex_env_base (ref_base_lex_env_p, + name_p, + is_strict); ecma_deref_ecma_string (name_p); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - left_value = last_completion_value; + left_value = result; } /* FALLTHRU */ } case VM_OC_TYPEOF: { - last_completion_value = opfunc_typeof (left_value); + result = opfunc_typeof (left_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_ADD: { - last_completion_value = opfunc_addition (left_value, right_value); + result = opfunc_addition (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_SUB: { - last_completion_value = do_number_arithmetic (NUMBER_ARITHMETIC_SUBSTRACTION, - left_value, - right_value); + result = do_number_arithmetic (NUMBER_ARITHMETIC_SUBSTRACTION, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_MUL: { - last_completion_value = do_number_arithmetic (NUMBER_ARITHMETIC_MULTIPLICATION, - left_value, - right_value); + result = do_number_arithmetic (NUMBER_ARITHMETIC_MULTIPLICATION, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_DIV: { - last_completion_value = do_number_arithmetic (NUMBER_ARITHMETIC_DIVISION, - left_value, - right_value); + result = do_number_arithmetic (NUMBER_ARITHMETIC_DIVISION, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_MOD: { - last_completion_value = do_number_arithmetic (NUMBER_ARITHMETIC_REMAINDER, - left_value, - right_value); + result = do_number_arithmetic (NUMBER_ARITHMETIC_REMAINDER, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_EQUAL: { - last_completion_value = opfunc_equal_value (left_value, right_value); + result = opfunc_equal_value (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_NOT_EQUAL: { - last_completion_value = opfunc_not_equal_value (left_value, right_value); + result = opfunc_not_equal_value (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_STRICT_EQUAL: @@ -1733,158 +1695,134 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } case VM_OC_BIT_OR: { - last_completion_value = do_number_bitwise_logic (NUMBER_BITWISE_LOGIC_OR, - left_value, - right_value); + result = do_number_bitwise_logic (NUMBER_BITWISE_LOGIC_OR, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_BIT_XOR: { - last_completion_value = do_number_bitwise_logic (NUMBER_BITWISE_LOGIC_XOR, - left_value, - right_value); + result = do_number_bitwise_logic (NUMBER_BITWISE_LOGIC_XOR, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_BIT_AND: { - last_completion_value = do_number_bitwise_logic (NUMBER_BITWISE_LOGIC_AND, - left_value, - right_value); + result = do_number_bitwise_logic (NUMBER_BITWISE_LOGIC_AND, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_LEFT_SHIFT: { - last_completion_value = do_number_bitwise_logic (NUMBER_BITWISE_SHIFT_LEFT, - left_value, - right_value); + result = do_number_bitwise_logic (NUMBER_BITWISE_SHIFT_LEFT, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_RIGHT_SHIFT: { - last_completion_value = do_number_bitwise_logic (NUMBER_BITWISE_SHIFT_RIGHT, - left_value, - right_value); + result = do_number_bitwise_logic (NUMBER_BITWISE_SHIFT_RIGHT, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_UNS_RIGHT_SHIFT: { - last_completion_value = do_number_bitwise_logic (NUMBER_BITWISE_SHIFT_URIGHT, - left_value, - right_value); + result = do_number_bitwise_logic (NUMBER_BITWISE_SHIFT_URIGHT, + left_value, + right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_LESS: { - last_completion_value = opfunc_less_than (left_value, right_value); + result = opfunc_less_than (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_GREATER: { - last_completion_value = opfunc_greater_than (left_value, right_value); + result = opfunc_greater_than (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_LESS_EQUAL: { - last_completion_value = opfunc_less_or_equal_than (left_value, right_value); + result = opfunc_less_or_equal_than (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_GREATER_EQUAL: { - last_completion_value = opfunc_greater_or_equal_than (left_value, right_value); + result = opfunc_greater_or_equal_than (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_IN: { - last_completion_value = opfunc_in (left_value, right_value); + result = opfunc_in (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_INSTANCEOF: { - last_completion_value = opfunc_instanceof (left_value, right_value); + result = opfunc_instanceof (left_value, right_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - - result = last_completion_value; break; } case VM_OC_WITH: @@ -1896,14 +1834,14 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ JERRY_ASSERT (frame_ctx_p->registers_p + register_end + frame_ctx_p->context_depth == stack_top_p); - last_completion_value = ecma_op_to_object (left_value); + result = ecma_op_to_object (left_value); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (result)) { goto error; } - object_p = ecma_get_object_from_value (last_completion_value); + object_p = ecma_get_object_from_value (result); with_env_p = ecma_create_object_lex_env (frame_ctx_p->lex_env_p, object_p, @@ -2066,7 +2004,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } case VM_CONTEXT_FINALLY_THROW: { - last_completion_value = stack_top_p[-2]; + result = stack_top_p[-2]; VM_MINUS_EQUAL_U16 (frame_ctx_p->context_depth, PARSER_TRY_CONTEXT_STACK_ALLOCATION); @@ -2075,7 +2013,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } case VM_CONTEXT_FINALLY_RETURN: { - last_completion_value = stack_top_p[-2]; + result = stack_top_p[-2]; VM_MINUS_EQUAL_U16 (frame_ctx_p->context_depth, PARSER_TRY_CONTEXT_STACK_ALLOCATION); @@ -2149,16 +2087,17 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ ref_base_lex_env_p = ecma_op_resolve_reference_base (frame_ctx_p->lex_env_p, var_name_str_p); - last_completion_value = ecma_op_put_value_lex_env_base (ref_base_lex_env_p, - var_name_str_p, - is_strict, - result); + ecma_value_t put_value_result = ecma_op_put_value_lex_env_base (ref_base_lex_env_p, + var_name_str_p, + is_strict, + result); ecma_deref_ecma_string (var_name_str_p); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (put_value_result)) { ecma_free_value (result); + result = put_value_result; goto error; } @@ -2186,17 +2125,18 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } else { - last_completion_value = vm_op_set_value (object, - property, - result, - is_strict); + ecma_value_t set_value_result = vm_op_set_value (object, + property, + result, + is_strict); ecma_free_value (object); ecma_free_value (property); - if (ecma_is_value_error (last_completion_value)) + if (ecma_is_value_error (set_value_result)) { ecma_free_value (result); + result = set_value_result; goto error; } @@ -2226,7 +2166,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ ecma_fast_free_value (left_value); ecma_fast_free_value (right_value); - if (unlikely (ecma_is_value_error (last_completion_value))) + if (ecma_is_value_error (result)) { ecma_value_t *vm_stack_p = stack_top_p; @@ -2255,10 +2195,10 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ /* In most cases there is no context. */ ecma_fast_free_value (block_result); - return last_completion_value; + return result; } - if (!ecma_is_value_error (last_completion_value)) + if (!ecma_is_value_error (result)) { JERRY_ASSERT (frame_ctx_p->registers_p + register_end + frame_ctx_p->context_depth == stack_top_p); @@ -2273,7 +2213,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ JERRY_ASSERT (frame_ctx_p->registers_p + register_end + frame_ctx_p->context_depth == stack_top_p); byte_code_p = frame_ctx_p->byte_code_p; - stack_top_p[-2] = last_completion_value; + stack_top_p[-2] = result; continue; } } @@ -2286,7 +2226,6 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ { JERRY_ASSERT (frame_ctx_p->registers_p + register_end + frame_ctx_p->context_depth == stack_top_p); - result = last_completion_value; byte_code_p = frame_ctx_p->byte_code_p; if (VM_GET_CONTEXT_TYPE (stack_top_p[-1]) == VM_CONTEXT_CATCH) @@ -2326,7 +2265,7 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */ } ecma_free_value (block_result); - return last_completion_value; + return result; } } /* vm_loop */