diff --git a/src/libcoreint/interpreter.c b/src/libcoreint/interpreter.c index 065a29330..6d609818e 100644 --- a/src/libcoreint/interpreter.c +++ b/src/libcoreint/interpreter.c @@ -370,7 +370,7 @@ run_int (void) ecma_object_t *glob_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL); ecma_object_t *lex_env_p = ecma_op_create_global_environment (glob_obj_p); - ecma_value_t this_binding_value = ecma_make_object_value (glob_obj_p); + ecma_value_t this_binding_value (glob_obj_p); ecma_completion_value_t completion = run_int_from_pos (start_pos, this_binding_value, @@ -384,7 +384,10 @@ run_int (void) ecma_deref_object (lex_env_p); ecma_finalize (); - return ecma_is_value_true (ecma_get_completion_value_value (completion)); + ecma_value_t value_ret; + ecma_get_completion_value_value (value_ret, completion); + + return ecma_is_value_true (value_ret); } else if (ecma_is_completion_value_throw (completion)) { @@ -470,11 +473,11 @@ run_int_from_pos (opcode_counter_t start_pos, const int32_t regs_num = max_reg_num - min_reg_num + 1; - MEM_DEFINE_LOCAL_ARRAY (regs, regs_num, ecma_value_t); + MEM_DEFINE_LOCAL_ARRAY (regs, regs_num, ecma_value_packed_t); int_data_t int_data; int_data.pos = (opcode_counter_t) (start_pos + 1); - int_data.this_binding = this_binding_value; + int_data.this_binding_p = &this_binding_value; int_data.lex_env_p = lex_env_p; int_data.is_strict = is_strict; int_data.is_eval_code = is_eval_code; diff --git a/src/libcoreint/interpreter.h b/src/libcoreint/interpreter.h index 7363b7f0d..531ea96fa 100644 --- a/src/libcoreint/interpreter.h +++ b/src/libcoreint/interpreter.h @@ -17,6 +17,7 @@ #define INTERPRETER_H #include "ecma-globals.h" +#include "ecma-value.h" #include "globals.h" #include "opcodes.h" diff --git a/src/libcoreint/opcodes-ecma-arithmetics.c b/src/libcoreint/opcodes-ecma-arithmetics.c index a2287b13b..8e54e3cbc 100644 --- a/src/libcoreint/opcodes-ecma-arithmetics.c +++ b/src/libcoreint/opcodes-ecma-arithmetics.c @@ -86,7 +86,7 @@ do_number_arithmetic (int_data_t *int_data, /**< interpreter context */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (res_p)); + ecma_value_t (res_p)); ECMA_OP_TO_NUMBER_FINALIZE (num_right); ECMA_OP_TO_NUMBER_FINALIZE (num_left); @@ -134,7 +134,7 @@ opfunc_addition (opcode_t opdata, /**< operation data */ ecma_string_t *concat_str_p = ecma_concat_ecma_strings (string1_p, string2_p); - ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_string_value (concat_str_p)); + ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (concat_str_p)); ecma_deref_ecma_string (concat_str_p); @@ -327,7 +327,7 @@ opfunc_unary_plus (opcode_t opdata, /**< operation data */ *tmp_p = num_var_value; ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (tmp_p)); + ecma_value_t (tmp_p)); ECMA_OP_TO_NUMBER_FINALIZE (num_var_value); ECMA_FINALIZE (var_value); @@ -364,7 +364,7 @@ opfunc_unary_minus (opcode_t opdata, /**< operation data */ *tmp_p = ecma_number_negate (num_var_value); ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (tmp_p)); + ecma_value_t (tmp_p)); ECMA_OP_TO_NUMBER_FINALIZE (num_var_value); ECMA_FINALIZE (var_value); diff --git a/src/libcoreint/opcodes-ecma-bitwise.c b/src/libcoreint/opcodes-ecma-bitwise.c index e0a40dca1..4558f000c 100644 --- a/src/libcoreint/opcodes-ecma-bitwise.c +++ b/src/libcoreint/opcodes-ecma-bitwise.c @@ -102,7 +102,7 @@ do_number_bitwise_logic (int_data_t *int_data, /**< interpreter context */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (res_p)); + ecma_value_t (res_p)); ECMA_OP_TO_NUMBER_FINALIZE (num_right); ECMA_OP_TO_NUMBER_FINALIZE (num_left); diff --git a/src/libcoreint/opcodes-ecma-equality.c b/src/libcoreint/opcodes-ecma-equality.c index bf8387ecb..0ca727dd1 100644 --- a/src/libcoreint/opcodes-ecma-equality.c +++ b/src/libcoreint/opcodes-ecma-equality.c @@ -84,8 +84,8 @@ opfunc_not_equal_value (opcode_t opdata, /**< operation data */ bool is_equal = ecma_is_value_true (compare_result); ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_FALSE - : ECMA_SIMPLE_VALUE_TRUE)); + ecma_value_t (is_equal ? ECMA_SIMPLE_VALUE_FALSE + : ECMA_SIMPLE_VALUE_TRUE)); ECMA_FINALIZE (compare_result); ECMA_FINALIZE (right_value); @@ -120,8 +120,8 @@ opfunc_equal_value_type (opcode_t opdata, /**< operation data */ bool is_equal = ecma_op_strict_equality_compare (left_value, right_value); ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE - : ECMA_SIMPLE_VALUE_FALSE)); + ecma_value_t (is_equal ? ECMA_SIMPLE_VALUE_TRUE + : ECMA_SIMPLE_VALUE_FALSE)); ECMA_FINALIZE (right_value); ECMA_FINALIZE (left_value); @@ -155,8 +155,8 @@ opfunc_not_equal_value_type (opcode_t opdata, /**< operation data */ bool is_equal = ecma_op_strict_equality_compare (left_value, right_value); ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_FALSE - : ECMA_SIMPLE_VALUE_TRUE)); + ecma_value_t (is_equal ? ECMA_SIMPLE_VALUE_FALSE + : ECMA_SIMPLE_VALUE_TRUE)); ECMA_FINALIZE (right_value); diff --git a/src/libcoreint/opcodes-ecma-relational.c b/src/libcoreint/opcodes-ecma-relational.c index 11e90b04b..2b719615b 100644 --- a/src/libcoreint/opcodes-ecma-relational.c +++ b/src/libcoreint/opcodes-ecma-relational.c @@ -53,7 +53,7 @@ opfunc_less_than (opcode_t opdata, /**< operation data */ res = (ecma_is_value_true (compare_result) ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE); } - ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_simple_value (res)); + ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (res)); ECMA_FINALIZE (compare_result); ECMA_FINALIZE (right_value); @@ -101,7 +101,7 @@ opfunc_greater_than (opcode_t opdata, /**< operation data */ res = (ecma_is_value_true (compare_result) ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE); } - ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_simple_value (res)); + ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (res)); ECMA_FINALIZE (compare_result); ECMA_FINALIZE (right_value); @@ -156,7 +156,7 @@ opfunc_less_or_equal_than (opcode_t opdata, /**< operation data */ } } - ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_simple_value (res)); + ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (res)); ECMA_FINALIZE (compare_result); ECMA_FINALIZE (right_value); @@ -211,7 +211,7 @@ opfunc_greater_or_equal_than (opcode_t opdata, /**< operation data */ } } - ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_make_simple_value (res)); + ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, ecma_value_t (res)); ECMA_FINALIZE (compare_result); ECMA_FINALIZE (right_value); @@ -312,7 +312,7 @@ opfunc_in (opcode_t opdata __unused, /**< operation data */ ret_value = set_variable_value (int_data, int_data->pos, dst_idx, - ecma_make_simple_value (is_in)); + ecma_value_t (is_in)); ECMA_FINALIZE (str_left_value); } diff --git a/src/libcoreint/opcodes-ecma-support.h b/src/libcoreint/opcodes-ecma-support.h index 672914a37..82e7bf5a1 100644 --- a/src/libcoreint/opcodes-ecma-support.h +++ b/src/libcoreint/opcodes-ecma-support.h @@ -31,6 +31,7 @@ #include "ecma-operations.h" #include "ecma-reference.h" #include "ecma-try-catch-macro.h" +#include "ecma-value.h" #include "deserializer.h" bool is_reg_variable (int_data_t *int_data, idx_t var_idx); diff --git a/src/libcoreint/opcodes-ecma-try-catch-finally.c b/src/libcoreint/opcodes-ecma-try-catch-finally.c index ba3770498..93ca902d7 100644 --- a/src/libcoreint/opcodes-ecma-try-catch-finally.c +++ b/src/libcoreint/opcodes-ecma-try-catch-finally.c @@ -75,9 +75,12 @@ opfunc_try_block (opcode_t opdata, /**< operation data */ false); JERRY_ASSERT (ecma_is_completion_value_empty (completion)); + ecma_value_t catched_exc_value; + ecma_get_completion_value_value (catched_exc_value, try_completion); + completion = ecma_op_set_mutable_binding (catch_env_p, catch_exc_var_name_str_p, - ecma_get_completion_value_value (try_completion), + catched_exc_value, false); JERRY_ASSERT (ecma_is_completion_value_empty (completion)); diff --git a/src/libcoreint/opcodes-helpers-variables.c b/src/libcoreint/opcodes-helpers-variables.c index b82889e77..821108ed6 100644 --- a/src/libcoreint/opcodes-helpers-variables.c +++ b/src/libcoreint/opcodes-helpers-variables.c @@ -81,12 +81,17 @@ get_variable_value (int_data_t *int_data, /**< interpreter context */ if (is_reg_variable (int_data, var_idx)) { - ecma_value_t reg_value = ecma_stack_frame_get_reg_value (&int_data->stack_frame, - var_idx - int_data->min_reg_num); + ecma_value_t reg_value; + ecma_stack_frame_get_reg_value (reg_value, + &int_data->stack_frame, + var_idx - int_data->min_reg_num); JERRY_ASSERT (!ecma_is_value_empty (reg_value)); - ret_value = ecma_make_normal_completion_value (ecma_copy_value (reg_value, true)); + ecma_value_t value_copy; + ecma_copy_value (value_copy, reg_value, true); + + ret_value = ecma_make_normal_completion_value (value_copy); } else { @@ -135,8 +140,10 @@ set_variable_value (int_data_t *int_data, /**< interpreter context */ { ret_value = ecma_make_empty_completion_value (); - ecma_value_t reg_value = ecma_stack_frame_get_reg_value (&int_data->stack_frame, - var_idx - int_data->min_reg_num); + ecma_value_t reg_value; + ecma_stack_frame_get_reg_value (reg_value, + &int_data->stack_frame, + var_idx - int_data->min_reg_num); if (ecma_is_value_number (reg_value) && ecma_is_value_number (value)) @@ -150,9 +157,12 @@ set_variable_value (int_data_t *int_data, /**< interpreter context */ ecma_free_value (reg_value, false); } + ecma_value_t value_copy; + ecma_copy_value (value_copy, value, false); + ecma_stack_frame_set_reg_value (&int_data->stack_frame, var_idx - int_data->min_reg_num, - ecma_copy_value (value, false)); + value_copy); } } else diff --git a/src/libcoreint/opcodes-varg.c b/src/libcoreint/opcodes-varg.c index 6f0c78366..cfc8c717b 100644 --- a/src/libcoreint/opcodes-varg.c +++ b/src/libcoreint/opcodes-varg.c @@ -54,7 +54,7 @@ fill_varg_list (int_data_t *int_data, /**< interpreter context */ if (ecma_is_completion_value_normal (get_arg_completion)) { - arg_values[arg_index] = ecma_get_completion_value_value (get_arg_completion); + ecma_get_completion_value_value (arg_values[arg_index], get_arg_completion); } else { diff --git a/src/libcoreint/opcodes.c b/src/libcoreint/opcodes.c index fe748344d..407abccd6 100644 --- a/src/libcoreint/opcodes.c +++ b/src/libcoreint/opcodes.c @@ -94,7 +94,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_simple_value ((ecma_simple_value_t) src_val_descr)); + ecma_value_t ((ecma_simple_value_t) src_val_descr)); } else if (type_value_right == OPCODE_ARG_TYPE_STRING) { @@ -104,7 +104,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_string_value (string_p)); + ecma_value_t (string_p)); ecma_deref_ecma_string (string_p); } @@ -136,7 +136,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (num_p)); + ecma_value_t (num_p)); } else if (type_value_right == OPCODE_ARG_TYPE_NUMBER_NEGATE) { @@ -151,7 +151,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (num_p)); + ecma_value_t (num_p)); } else if (type_value_right == OPCODE_ARG_TYPE_SMALLINT) { @@ -162,7 +162,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (num_p)); + ecma_value_t (num_p)); } else { @@ -174,7 +174,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (num_p)); + ecma_value_t (num_p)); } int_data->pos++; @@ -208,7 +208,7 @@ opfunc_pre_incr (opcode_t opdata, /**< operation data */ *new_num_p = ecma_number_add (old_num, ECMA_NUMBER_ONE); - ecma_value_t new_num_value = ecma_make_number_value (new_num_p); + ecma_value_t new_num_value (new_num_p); // 5. ret_value = set_variable_value (int_data, int_data->pos, @@ -255,7 +255,7 @@ opfunc_pre_decr (opcode_t opdata, /**< operation data */ *new_num_p = ecma_number_substract (old_num, ECMA_NUMBER_ONE); - ecma_value_t new_num_value = ecma_make_number_value (new_num_p); + ecma_value_t new_num_value (new_num_p); // 5. ret_value = set_variable_value (int_data, int_data->pos, @@ -305,7 +305,7 @@ opfunc_post_incr (opcode_t opdata, /**< operation data */ // 5. ret_value = set_variable_value (int_data, int_data->pos, incr_var_idx, - ecma_make_number_value (new_num_p)); + ecma_value_t (new_num_p)); ecma_number_t *tmp_p = int_data->tmp_num_p; *tmp_p = old_num; @@ -313,7 +313,7 @@ opfunc_post_incr (opcode_t opdata, /**< operation data */ // assignment of operator result to register variable ecma_completion_value_t reg_assignment_res = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (tmp_p)); + ecma_value_t (tmp_p)); JERRY_ASSERT (ecma_is_completion_value_empty (reg_assignment_res)); ECMA_OP_TO_NUMBER_FINALIZE (old_num); @@ -353,7 +353,7 @@ opfunc_post_decr (opcode_t opdata, /**< operation data */ // 5. ret_value = set_variable_value (int_data, int_data->pos, decr_var_idx, - ecma_make_number_value (new_num_p)); + ecma_value_t (new_num_p)); ecma_number_t *tmp_p = int_data->tmp_num_p; *tmp_p = old_num; @@ -361,7 +361,7 @@ opfunc_post_decr (opcode_t opdata, /**< operation data */ // assignment of operator result to register variable ecma_completion_value_t reg_assignment_res = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_number_value (tmp_p)); + ecma_value_t (tmp_p)); JERRY_ASSERT (ecma_is_completion_value_empty (reg_assignment_res)); ECMA_OP_TO_NUMBER_FINALIZE (old_num); @@ -584,13 +584,13 @@ opfunc_func_expr_n (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, lit_oc, dst_var_idx, - ecma_make_object_value (func_obj_p)); + ecma_value_t (func_obj_p)); if (is_named_func_expr) { ecma_op_initialize_immutable_binding (scope_p, function_name_string_p, - ecma_make_object_value (func_obj_p)); + ecma_value_t (func_obj_p)); ecma_deref_ecma_string (function_name_string_p); } @@ -681,7 +681,8 @@ opfunc_call_n (opcode_t opdata, /**< operation data */ } JERRY_ASSERT (ecma_is_completion_value_normal (get_this_completion_value)); - ecma_value_t this_value = ecma_get_completion_value_value (get_this_completion_value); + ecma_value_t this_value; + ecma_get_completion_value_value (this_value, get_this_completion_value); if (!ecma_op_is_callable (func_value)) { @@ -913,11 +914,11 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */ const idx_t prop_name_var_idx = next_opcode.data.meta.data_1; const idx_t value_for_prop_desc_var_idx = next_opcode.data.meta.data_2; - ecma_completion_value_t value_for_prop_desc = get_variable_value (int_data, - value_for_prop_desc_var_idx, - false); + ecma_completion_value_t value_for_prop_desc_completion = get_variable_value (int_data, + value_for_prop_desc_var_idx, + false); - if (ecma_is_completion_value_normal (value_for_prop_desc)) + if (ecma_is_completion_value_normal (value_for_prop_desc_completion)) { JERRY_ASSERT (is_reg_variable (int_data, prop_name_var_idx)); @@ -951,10 +952,14 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */ prop_desc.is_configurable = true; } + ecma_value_t value_for_prop_desc; + ecma_get_completion_value_value (value_for_prop_desc, value_for_prop_desc_completion); + if (type == OPCODE_META_TYPE_VARG_PROP_DATA) { prop_desc.is_value_defined = true; - prop_desc.value = ecma_get_completion_value_value (value_for_prop_desc); + + prop_desc.value = (ecma_value_packed_t) value_for_prop_desc; prop_desc.is_writable_defined = true; prop_desc.is_writable = true; @@ -970,7 +975,7 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */ else if (type == OPCODE_META_TYPE_VARG_PROP_GETTER) { prop_desc.is_get_defined = true; - prop_desc.get_p = ecma_get_object_from_completion_value (value_for_prop_desc); + prop_desc.get_p = ecma_get_object_from_value (value_for_prop_desc); if (!is_previous_undefined && is_previous_data_desc) @@ -981,7 +986,7 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */ else { prop_desc.is_set_defined = true; - prop_desc.set_p = ecma_get_object_from_completion_value (value_for_prop_desc); + prop_desc.set_p = ecma_get_object_from_value (value_for_prop_desc); if (!is_previous_undefined && is_previous_data_desc) @@ -1000,14 +1005,14 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */ JERRY_ASSERT (ecma_is_completion_value_normal_true (define_prop_completion) || ecma_is_completion_value_normal_false (define_prop_completion)); - ecma_free_completion_value (value_for_prop_desc); + ecma_free_completion_value (value_for_prop_desc_completion); ECMA_FINALIZE (prop_name_str_value); ECMA_FINALIZE (prop_name_value); } else { - completion = value_for_prop_desc; + completion = value_for_prop_desc_completion; break; } @@ -1026,7 +1031,7 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */ if (ecma_is_completion_value_empty (completion)) { - ret_value = set_variable_value (int_data, obj_lit_oc, lhs_var_idx, ecma_make_object_value (obj_p)); + ret_value = set_variable_value (int_data, obj_lit_oc, lhs_var_idx, ecma_value_t (obj_p)); } else { @@ -1050,7 +1055,7 @@ ecma_completion_value_t opfunc_ret (opcode_t opdata __unused, /**< operation data */ int_data_t *int_data __unused) /**< interpreter context */ { - return ecma_make_return_completion_value (ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED)); + return ecma_make_return_completion_value (ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED)); } /* opfunc_ret */ /** @@ -1070,7 +1075,10 @@ opfunc_retval (opcode_t opdata __unused, /**< operation data */ ECMA_TRY_CATCH (expr_val, get_variable_value (int_data, opdata.data.retval.ret_value, false), ret_value); - ret_value = ecma_make_return_completion_value (ecma_copy_value (expr_val, true)); + ecma_value_t value_copy; + ecma_copy_value (value_copy, expr_val, true); + + ret_value = ecma_make_return_completion_value (value_copy); ECMA_FINALIZE (expr_val); @@ -1110,7 +1118,9 @@ opfunc_prop_getter (opcode_t opdata __unused, /**< operation data */ ret_value); ecma_string_t *prop_name_string_p = ecma_get_string_from_value (prop_name_str_value); - ecma_reference_t ref = ecma_make_reference (base_value, prop_name_string_p, int_data->is_strict); + + ecma_reference_t ref; + ecma_make_reference (ref, base_value, prop_name_string_p, int_data->is_strict); ECMA_TRY_CATCH (prop_value, ecma_op_get_value_object_base (ref), ret_value); @@ -1163,9 +1173,12 @@ opfunc_prop_setter (opcode_t opdata __unused, /**< operation data */ ret_value); ecma_string_t *prop_name_string_p = ecma_get_string_from_value (prop_name_str_value); - ecma_reference_t ref = ecma_make_reference (base_value, - prop_name_string_p, - int_data->is_strict); + + ecma_reference_t ref; + ecma_make_reference (ref, + base_value, + prop_name_string_p, + int_data->is_strict); ECMA_TRY_CATCH (rhs_value, get_variable_value (int_data, rhs_var_idx, false), ret_value); ret_value = ecma_op_put_value_object_base (ref, rhs_value); @@ -1228,14 +1241,14 @@ opfunc_logical_not (opcode_t opdata, /**< operation data */ ecma_simple_value_t old_value = ECMA_SIMPLE_VALUE_TRUE; ecma_completion_value_t to_bool_value = ecma_op_to_boolean (right_value); - if (ecma_is_value_true (ecma_get_completion_value_value (to_bool_value))) + if (ecma_is_completion_value_normal_true (to_bool_value)) { old_value = ECMA_SIMPLE_VALUE_FALSE; } ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_simple_value (old_value)); + ecma_value_t (old_value)); ECMA_FINALIZE (right_value); @@ -1265,7 +1278,7 @@ opfunc_this_binding (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, lit_oc, dst_var_idx, - int_data->this_binding); + *int_data->this_binding_p); return ret_value; } /* opfunc_this_binding */ @@ -1356,7 +1369,10 @@ opfunc_throw_value (opcode_t opdata, /**< operation data */ false), ret_value); - ret_value = ecma_make_throw_completion_value (ecma_copy_value (var_value, true)); + ecma_value_t var_value_copy; + ecma_copy_value (var_value_copy, var_value, true); + + ret_value = ecma_make_throw_completion_value (var_value_copy); ECMA_FINALIZE (var_value); @@ -1474,7 +1490,7 @@ opfunc_typeof (opcode_t opdata, /**< operation data */ ret_value = set_variable_value (int_data, int_data->pos, dst_var_idx, - ecma_make_string_value (type_str_p)); + ecma_value_t (type_str_p)); ecma_deref_ecma_string (type_str_p); @@ -1510,9 +1526,11 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */ ecma_string_t *name_string_p = ecma_new_ecma_string_from_lit_index (lit_id); - ecma_reference_t ref = ecma_op_get_identifier_reference (int_data->lex_env_p, - name_string_p, - int_data->is_strict); + ecma_reference_t ref; + ecma_op_get_identifier_reference (ref, + int_data->lex_env_p, + name_string_p, + int_data->is_strict); if (ref.is_strict) { @@ -1525,7 +1543,7 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */ { ret_value = set_variable_value (int_data, lit_oc, dst_var_idx, - ecma_make_simple_value (ECMA_SIMPLE_VALUE_TRUE)); + ecma_value_t (ECMA_SIMPLE_VALUE_TRUE)); } else { diff --git a/src/libcoreint/opcodes.h b/src/libcoreint/opcodes.h index 88aa1a0d4..7d7c91ff7 100644 --- a/src/libcoreint/opcodes.h +++ b/src/libcoreint/opcodes.h @@ -18,6 +18,7 @@ #include "ecma-globals.h" #include "ecma-stack.h" +#include "ecma-value.h" #include "globals.h" /* Maximum opcodes number in bytecode. */ @@ -76,7 +77,7 @@ typedef enum typedef struct { opcode_counter_t pos; /**< current opcode to execute */ - ecma_value_t this_binding; /**< this binding for current context */ + const ecma_value_t* this_binding_p; /**< this binding for current context */ ecma_object_t *lex_env_p; /**< current lexical environment */ bool is_strict; /**< is current code execution mode strict? */ bool is_eval_code; /**< is current code executed with eval */ diff --git a/src/libecmabuiltins/ecma-builtin-boolean-prototype.c b/src/libecmabuiltins/ecma-builtin-boolean-prototype.c index d0efe1848..ad4efd4c5 100644 --- a/src/libecmabuiltins/ecma-builtin-boolean-prototype.c +++ b/src/libecmabuiltins/ecma-builtin-boolean-prototype.c @@ -75,7 +75,7 @@ ecma_builtin_boolean_prototype_object_to_string (const ecma_value_t& this_arg) / ret_str_p = ecma_get_magic_string (ECMA_MAGIC_STRING_FALSE); } - ret_value = ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (ret_str_p)); ECMA_FINALIZE (value_of_ret); @@ -113,7 +113,7 @@ ecma_builtin_boolean_prototype_object_value_of (const ecma_value_t& this_arg) /* ecma_simple_value_t prim_simple_value = (ecma_simple_value_t) prim_value_prop_p->u.internal_property.value; - ecma_value_t ret_boolean_value = ecma_make_simple_value (prim_simple_value); + ecma_value_t ret_boolean_value (prim_simple_value); JERRY_ASSERT (ecma_is_value_boolean (ret_boolean_value)); diff --git a/src/libecmabuiltins/ecma-builtin-boolean.c b/src/libecmabuiltins/ecma-builtin-boolean.c index c3c65c6a9..97b177b55 100644 --- a/src/libecmabuiltins/ecma-builtin-boolean.c +++ b/src/libecmabuiltins/ecma-builtin-boolean.c @@ -55,18 +55,17 @@ ecma_builtin_boolean_dispatch_call (const ecma_value_t *arguments_list_p, /**< a { JERRY_ASSERT (arguments_list_len == 0 || arguments_list_p != NULL); - ecma_value_t arg_value; - if (arguments_list_len == 0) { - arg_value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); + ecma_value_t value_undefined (ECMA_SIMPLE_VALUE_UNDEFINED); + + return ecma_op_to_boolean (value_undefined); } else { - arg_value = arguments_list_p [0]; + return ecma_op_to_boolean (arguments_list_p [0]); } - return ecma_op_to_boolean (arg_value); } /* ecma_builtin_boolean_dispatch_call */ /** @@ -82,7 +81,7 @@ ecma_builtin_boolean_dispatch_construct (const ecma_value_t *arguments_list_p, / if (arguments_list_len == 0) { - return ecma_op_create_boolean_object (ecma_make_simple_value (ECMA_SIMPLE_VALUE_FALSE)); + return ecma_op_create_boolean_object (ecma_value_t (ECMA_SIMPLE_VALUE_FALSE)); } else { diff --git a/src/libecmabuiltins/ecma-builtin-error-prototype.c b/src/libecmabuiltins/ecma-builtin-error-prototype.c index be6c7f16c..53dc1a4dc 100644 --- a/src/libecmabuiltins/ecma-builtin-error-prototype.c +++ b/src/libecmabuiltins/ecma-builtin-error-prototype.c @@ -78,7 +78,7 @@ ecma_builtin_error_prototype_object_to_string (const ecma_value_t& this_arg) /** { ecma_string_t *error_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ERROR_UL); - name_to_str_completion = ecma_make_normal_completion_value (ecma_make_string_value (error_magic_string_p)); + name_to_str_completion = ecma_make_normal_completion_value (ecma_value_t (error_magic_string_p)); } else { @@ -103,7 +103,7 @@ ecma_builtin_error_prototype_object_to_string (const ecma_value_t& this_arg) /** { ecma_string_t *empty_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING__EMPTY); - msg_to_str_completion = ecma_make_normal_completion_value (ecma_make_string_value (empty_magic_string_p)); + msg_to_str_completion = ecma_make_normal_completion_value (ecma_value_t (empty_magic_string_p)); } else { @@ -116,8 +116,13 @@ ecma_builtin_error_prototype_object_to_string (const ecma_value_t& this_arg) /** } else { - ecma_string_t *name_string_p = ecma_get_string_from_completion_value (name_to_str_completion); - ecma_string_t *msg_string_p = ecma_get_string_from_completion_value (msg_to_str_completion); + ecma_value_t name_to_str_value, msg_to_str_value; + + ecma_get_completion_value_value (name_to_str_value, name_to_str_completion); + ecma_get_completion_value_value (msg_to_str_value, msg_to_str_completion); + + ecma_string_t *name_string_p = ecma_get_string_from_value (name_to_str_value); + ecma_string_t *msg_string_p = ecma_get_string_from_value (msg_to_str_value); ecma_string_t *ret_str_p; @@ -177,7 +182,7 @@ ecma_builtin_error_prototype_object_to_string (const ecma_value_t& this_arg) /** MEM_FINALIZE_LOCAL_ARRAY (ret_str_buffer); } - ret_value = ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (ret_str_p)); } ecma_free_completion_value (msg_to_str_completion); diff --git a/src/libecmabuiltins/ecma-builtin-error.c b/src/libecmabuiltins/ecma-builtin-error.c index 17e7b3368..9256ec5bd 100644 --- a/src/libecmabuiltins/ecma-builtin-error.c +++ b/src/libecmabuiltins/ecma-builtin-error.c @@ -66,7 +66,7 @@ ecma_builtin_error_dispatch_call (const ecma_value_t *arguments_list_p, /**< arg ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value); ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_COMMON, message_string_p); - ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); ECMA_FINALIZE (msg_str_value); @@ -76,7 +76,7 @@ ecma_builtin_error_dispatch_call (const ecma_value_t *arguments_list_p, /**< arg { ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_COMMON); - return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); } } /* ecma_builtin_error_dispatch_call */ diff --git a/src/libecmabuiltins/ecma-builtin-evalerror.c b/src/libecmabuiltins/ecma-builtin-evalerror.c index 61c3fdfc1..03f421417 100644 --- a/src/libecmabuiltins/ecma-builtin-evalerror.c +++ b/src/libecmabuiltins/ecma-builtin-evalerror.c @@ -66,7 +66,7 @@ ecma_builtin_eval_error_dispatch_call (const ecma_value_t *arguments_list_p, /** ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value); ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_EVAL, message_string_p); - ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); ECMA_FINALIZE (msg_str_value); @@ -76,7 +76,7 @@ ecma_builtin_eval_error_dispatch_call (const ecma_value_t *arguments_list_p, /** { ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_EVAL); - return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); } } /* ecma_builtin_eval_error_dispatch_call */ diff --git a/src/libecmabuiltins/ecma-builtin-internal-routines-template.inc.h b/src/libecmabuiltins/ecma-builtin-internal-routines-template.inc.h index 286d702cf..4d15f3258 100644 --- a/src/libecmabuiltins/ecma-builtin-internal-routines-template.inc.h +++ b/src/libecmabuiltins/ecma-builtin-internal-routines-template.inc.h @@ -160,7 +160,7 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t mask_prop_p->u.internal_property.value = bit_mask; - ecma_value_t value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); + ecma_value_t value (ECMA_SIMPLE_VALUE_EMPTY); ecma_property_writable_value_t writable; ecma_property_enumerable_value_t enumerable; ecma_property_configurable_value_t configurable; @@ -177,13 +177,13 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t enumerable = ECMA_PROPERTY_NOT_ENUMERABLE; \ configurable = ECMA_PROPERTY_CONFIGURABLE; \ \ - value = ecma_make_object_value (func_obj_p); \ + value = func_obj_p; \ \ break; \ } #define OBJECT_VALUE(name, obj_getter, prop_writable, prop_enumerable, prop_configurable) case name: \ { \ - value = ecma_make_object_value (obj_getter); \ + value = obj_getter; \ writable = prop_writable; \ enumerable = prop_enumerable; \ configurable = prop_configurable; \ @@ -191,7 +191,7 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t } #define SIMPLE_VALUE(name, simple_value, prop_writable, prop_enumerable, prop_configurable) case name: \ { \ - value = ecma_make_simple_value (simple_value); \ + value = simple_value; \ \ writable = prop_writable; \ enumerable = prop_enumerable; \ @@ -204,7 +204,7 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t ecma_number_t *num_p = ecma_alloc_number (); \ *num_p = number_value; \ \ - value = ecma_make_number_value (num_p); \ + value = num_p; \ \ writable = prop_writable; \ enumerable = prop_enumerable; \ @@ -216,7 +216,7 @@ TRY_TO_INSTANTIATE_PROPERTY_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_object_t { \ ecma_string_t *magic_string_p = ecma_get_magic_string (magic_string_id); \ \ - value = ecma_make_string_value (magic_string_p); \ + value = magic_string_p; \ \ writable = prop_writable; \ enumerable = prop_enumerable; \ @@ -288,10 +288,11 @@ DISPATCH_ROUTINE_ROUTINE_NAME (BUILTIN_UNDERSCORED_ID) (ecma_magic_string_id_t b (void) arguments_list; (void) arguments_number; + ecma_value_t value_undefined (ECMA_SIMPLE_VALUE_UNDEFINED); switch (builtin_routine_id) { #define ROUTINE_ARG(n) (arguments_number >= n ? arguments_list[n - 1] \ - : ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED)) + : value_undefined) #define ROUTINE_ARG_LIST_0 #define ROUTINE_ARG_LIST_1 , ROUTINE_ARG(1) #define ROUTINE_ARG_LIST_2 ROUTINE_ARG_LIST_1, ROUTINE_ARG(2) diff --git a/src/libecmabuiltins/ecma-builtin-math.c b/src/libecmabuiltins/ecma-builtin-math.c index 701508822..bf02098eb 100644 --- a/src/libecmabuiltins/ecma-builtin-math.c +++ b/src/libecmabuiltins/ecma-builtin-math.c @@ -73,7 +73,7 @@ ecma_builtin_math_object_abs (const ecma_value_t& this_arg __unused, /**< 'this' *num_p = ecma_number_abs (arg_num); } - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p)); ECMA_OP_TO_NUMBER_FINALIZE (arg_num); @@ -222,7 +222,7 @@ ecma_builtin_math_object_cos (const ecma_value_t& this_arg __unused, /**< 'this' *num_p = sum; } - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p)); ECMA_OP_TO_NUMBER_FINALIZE (arg_num); @@ -272,7 +272,7 @@ ecma_builtin_math_object_exp (const ecma_value_t& this_arg __unused, /**< 'this' *num_p = ecma_number_exp (arg_num); } - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p)); ECMA_OP_TO_NUMBER_FINALIZE (arg_num); @@ -335,7 +335,7 @@ ecma_builtin_math_object_log (const ecma_value_t& this_arg __unused, /**< 'this' *num_p = ecma_number_ln (arg_num); } - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p)); ECMA_OP_TO_NUMBER_FINALIZE (arg_num); @@ -426,7 +426,7 @@ ecma_builtin_math_object_max (const ecma_value_t& this_arg __unused, /**< 'this' ecma_number_t *num_p = ecma_alloc_number (); *num_p = ret_num; - return ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + return ecma_make_normal_completion_value (ecma_value_t (num_p)); } /* ecma_builtin_math_object_max */ /** @@ -513,7 +513,7 @@ ecma_builtin_math_object_min (const ecma_value_t& this_arg __unused, /**< 'this' ecma_number_t *num_p = ecma_alloc_number (); *num_p = ret_num; - return ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + return ecma_make_normal_completion_value (ecma_value_t (num_p)); } /* ecma_builtin_math_object_min */ /** @@ -742,7 +742,7 @@ ecma_builtin_math_object_pow (const ecma_value_t& this_arg __unused, /**< 'this' } } - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p)); ECMA_OP_TO_NUMBER_FINALIZE (y); ECMA_OP_TO_NUMBER_FINALIZE (x); @@ -788,7 +788,7 @@ ecma_builtin_math_object_random (const ecma_value_t& this_arg __unused) /**< 'th ecma_number_t *rand_p = ecma_alloc_number (); *rand_p = rand; - return ecma_make_normal_completion_value (ecma_make_number_value (rand_p)); + return ecma_make_normal_completion_value (ecma_value_t (rand_p)); } /* ecma_builtin_math_object_random */ /** @@ -838,7 +838,7 @@ ecma_builtin_math_object_round (const ecma_value_t& this_arg __unused, /**< 'thi } } - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p)); ECMA_OP_TO_NUMBER_FINALIZE (arg_num); @@ -906,7 +906,7 @@ ecma_builtin_math_object_sin (const ecma_value_t& this_arg __unused, /**< 'this' *num_p = sum; } - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p)); ECMA_OP_TO_NUMBER_FINALIZE (arg_num); @@ -956,7 +956,7 @@ ecma_builtin_math_object_sqrt (const ecma_value_t& this_arg __unused, /**< 'this ecma_number_t *num_p = ecma_alloc_number (); *num_p = ret_num; - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (num_p)); ECMA_OP_TO_NUMBER_FINALIZE (arg_num); diff --git a/src/libecmabuiltins/ecma-builtin-number-prototype.c b/src/libecmabuiltins/ecma-builtin-number-prototype.c index e5d15a178..27d1f3121 100644 --- a/src/libecmabuiltins/ecma-builtin-number-prototype.c +++ b/src/libecmabuiltins/ecma-builtin-number-prototype.c @@ -95,7 +95,7 @@ ecma_builtin_number_prototype_object_to_string (const ecma_value_t& this_arg, /* { ecma_string_t *ret_str_p = ecma_new_ecma_string_from_number (this_arg_number); - return ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p)); + return ecma_make_normal_completion_value (ecma_value_t (ret_str_p)); } { ECMA_BUILTIN_CP_UNIMPLEMENTED (arguments_list_p); @@ -131,7 +131,10 @@ ecma_builtin_number_prototype_object_value_of (const ecma_value_t& this_arg) /** { if (ecma_is_value_number (this_arg)) { - return ecma_make_normal_completion_value (ecma_copy_value (this_arg, true)); + ecma_value_t this_arg_copy; + ecma_copy_value (this_arg_copy, this_arg, true); + + return ecma_make_normal_completion_value (this_arg_copy); } else if (ecma_is_value_object (this_arg)) { @@ -150,7 +153,7 @@ ecma_builtin_number_prototype_object_value_of (const ecma_value_t& this_arg) /** ecma_number_t *ret_num_p = ecma_alloc_number (); *ret_num_p = *prim_value_num_p; - return ecma_make_normal_completion_value (ecma_make_number_value (ret_num_p)); + return ecma_make_normal_completion_value (ecma_value_t (ret_num_p)); } } diff --git a/src/libecmabuiltins/ecma-builtin-number.c b/src/libecmabuiltins/ecma-builtin-number.c index edb63e393..35fd67925 100644 --- a/src/libecmabuiltins/ecma-builtin-number.c +++ b/src/libecmabuiltins/ecma-builtin-number.c @@ -62,7 +62,7 @@ ecma_builtin_number_dispatch_call (const ecma_value_t *arguments_list_p, /**< ar ecma_number_t *zero_num_p = ecma_alloc_number (); *zero_num_p = ECMA_NUMBER_ZERO; - ret_value = ecma_make_normal_completion_value (ecma_make_number_value (zero_num_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (zero_num_p)); } else { @@ -88,7 +88,7 @@ ecma_builtin_number_dispatch_construct (const ecma_value_t *arguments_list_p, /* ecma_number_t *zero_num_p = ecma_alloc_number (); *zero_num_p = ECMA_NUMBER_ZERO; - ecma_completion_value_t completion = ecma_op_create_number_object (ecma_make_number_value (zero_num_p)); + ecma_completion_value_t completion = ecma_op_create_number_object (ecma_value_t (zero_num_p)); ecma_dealloc_number (zero_num_p); diff --git a/src/libecmabuiltins/ecma-builtin-object-prototype.c b/src/libecmabuiltins/ecma-builtin-object-prototype.c index 0cede0049..c366b03a7 100644 --- a/src/libecmabuiltins/ecma-builtin-object-prototype.c +++ b/src/libecmabuiltins/ecma-builtin-object-prototype.c @@ -66,22 +66,22 @@ ecma_builtin_object_prototype_object_to_string (const ecma_value_t& this_arg) /* } else { - ecma_completion_value_t obj_this = ecma_op_to_object (this_arg); + ecma_completion_value_t this_to_obj_completion = ecma_op_to_object (this_arg); - if (!ecma_is_completion_value_normal (obj_this)) + if (!ecma_is_completion_value_normal (this_to_obj_completion)) { - return obj_this; + return this_to_obj_completion; } - JERRY_ASSERT (ecma_is_value_object (ecma_get_completion_value_value (obj_this))); + ecma_value_t obj_this_value; + ecma_get_completion_value_value (obj_this_value, this_to_obj_completion); - ecma_object_t *obj_p = ecma_get_object_from_completion_value (obj_this); - - ecma_property_t *class_prop_p = ecma_get_internal_property (obj_p, + JERRY_ASSERT (ecma_is_value_object (obj_this_value)); + ecma_property_t *class_prop_p = ecma_get_internal_property (ecma_get_object_from_value (obj_this_value), ECMA_INTERNAL_PROPERTY_CLASS); type_string = (ecma_magic_string_id_t) class_prop_p->u.internal_property.value; - ecma_free_completion_value (obj_this); + ecma_free_completion_value (this_to_obj_completion); } ecma_string_t *ret_string_p; @@ -127,7 +127,7 @@ ecma_builtin_object_prototype_object_to_string (const ecma_value_t& this_arg) /* MEM_FINALIZE_LOCAL_ARRAY (str_buffer); - return ecma_make_normal_completion_value (ecma_make_string_value (ret_string_p)); + return ecma_make_normal_completion_value (ecma_value_t (ret_string_p)); } /* ecma_builtin_object_prototype_object_to_string */ /** diff --git a/src/libecmabuiltins/ecma-builtin-object.c b/src/libecmabuiltins/ecma-builtin-object.c index c377ee498..581c9c7fc 100644 --- a/src/libecmabuiltins/ecma-builtin-object.c +++ b/src/libecmabuiltins/ecma-builtin-object.c @@ -84,19 +84,22 @@ ecma_builtin_object_dispatch_construct (const ecma_value_t *arguments_list_p, /* { ecma_object_t *obj_p = ecma_op_create_object_object_noarg (); - return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); + return ecma_make_normal_completion_value (ecma_value_t (obj_p)); } else { - ecma_completion_value_t new_obj_value = ecma_op_create_object_object_arg (arguments_list_p [0]); + ecma_completion_value_t new_obj_completion = ecma_op_create_object_object_arg (arguments_list_p [0]); - if (!ecma_is_completion_value_normal (new_obj_value)) + if (!ecma_is_completion_value_normal (new_obj_completion)) { - return new_obj_value; + return new_obj_completion; } else { - return ecma_make_normal_completion_value (ecma_get_completion_value_value (new_obj_value)); + ecma_value_t new_obj_value; + ecma_get_completion_value_value (new_obj_value, new_obj_completion); + + return ecma_make_normal_completion_value (new_obj_value); } } } /* ecma_builtin_object_dispatch_construct */ @@ -340,7 +343,10 @@ ecma_builtin_object_object_define_property (const ecma_value_t& this_arg __unuse true), ret_value); - ret_value = ecma_make_normal_completion_value (ecma_copy_value (arg1, true)); + ecma_value_t arg1_copy; + ecma_copy_value (arg1_copy, arg1, true); + + ret_value = ecma_make_normal_completion_value (arg1_copy); ECMA_FINALIZE (define_own_prop_ret); ecma_free_property_descriptor (&prop_desc); diff --git a/src/libecmabuiltins/ecma-builtin-rangeerror.c b/src/libecmabuiltins/ecma-builtin-rangeerror.c index 6dd7699e5..2df106677 100644 --- a/src/libecmabuiltins/ecma-builtin-rangeerror.c +++ b/src/libecmabuiltins/ecma-builtin-rangeerror.c @@ -66,7 +66,7 @@ ecma_builtin_range_error_dispatch_call (const ecma_value_t *arguments_list_p, /* ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value); ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_RANGE, message_string_p); - ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); ECMA_FINALIZE (msg_str_value); @@ -76,7 +76,7 @@ ecma_builtin_range_error_dispatch_call (const ecma_value_t *arguments_list_p, /* { ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_RANGE); - return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); } } /* ecma_builtin_range_error_dispatch_call */ diff --git a/src/libecmabuiltins/ecma-builtin-referenceerror.c b/src/libecmabuiltins/ecma-builtin-referenceerror.c index 6e07adabb..db7798143 100644 --- a/src/libecmabuiltins/ecma-builtin-referenceerror.c +++ b/src/libecmabuiltins/ecma-builtin-referenceerror.c @@ -66,7 +66,7 @@ ecma_builtin_reference_error_dispatch_call (const ecma_value_t *arguments_list_p ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value); ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_REFERENCE, message_string_p); - ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); ECMA_FINALIZE (msg_str_value); @@ -76,7 +76,7 @@ ecma_builtin_reference_error_dispatch_call (const ecma_value_t *arguments_list_p { ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_REFERENCE); - return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); } } /* ecma_builtin_reference_error_dispatch_call */ diff --git a/src/libecmabuiltins/ecma-builtin-string-prototype.c b/src/libecmabuiltins/ecma-builtin-string-prototype.c index 385114f22..113d5eda7 100644 --- a/src/libecmabuiltins/ecma-builtin-string-prototype.c +++ b/src/libecmabuiltins/ecma-builtin-string-prototype.c @@ -58,7 +58,10 @@ ecma_builtin_string_prototype_object_to_string (const ecma_value_t& this_arg) /* { if (ecma_is_value_string (this_arg)) { - return ecma_make_normal_completion_value (ecma_copy_value (this_arg, true)); + ecma_value_t this_arg_copy; + ecma_copy_value (this_arg_copy, this_arg, true); + + return ecma_make_normal_completion_value (this_arg_copy); } else if (ecma_is_value_object (this_arg)) { @@ -76,7 +79,7 @@ ecma_builtin_string_prototype_object_to_string (const ecma_value_t& this_arg) /* prim_value_str_p = ecma_copy_or_ref_ecma_string (prim_value_str_p); - return ecma_make_normal_completion_value (ecma_make_string_value (prim_value_str_p)); + return ecma_make_normal_completion_value (ecma_value_t (prim_value_str_p)); } } diff --git a/src/libecmabuiltins/ecma-builtin-string.c b/src/libecmabuiltins/ecma-builtin-string.c index f8bb6d387..2e251ec27 100644 --- a/src/libecmabuiltins/ecma-builtin-string.c +++ b/src/libecmabuiltins/ecma-builtin-string.c @@ -104,7 +104,7 @@ ecma_builtin_string_object_from_char_code (const ecma_value_t& this_arg __unused mem_heap_free_block (ret_zt_str_p); - return ecma_make_normal_completion_value (ecma_make_string_value (ret_str_p)); + return ecma_make_normal_completion_value (ecma_value_t (ret_str_p)); } /* ecma_builtin_string_object_from_char_code */ /** @@ -123,7 +123,7 @@ ecma_builtin_string_dispatch_call (const ecma_value_t *arguments_list_p, /**< ar if (arguments_list_len == 0) { ecma_string_t *str_p = ecma_new_ecma_string_from_magic_string_id (ECMA_MAGIC_STRING__EMPTY); - ecma_value_t str_value = ecma_make_string_value (str_p); + ecma_value_t str_value (str_p); ret_value = ecma_make_normal_completion_value (str_value); } diff --git a/src/libecmabuiltins/ecma-builtin-syntaxerror.c b/src/libecmabuiltins/ecma-builtin-syntaxerror.c index 41bce8499..67cf0779d 100644 --- a/src/libecmabuiltins/ecma-builtin-syntaxerror.c +++ b/src/libecmabuiltins/ecma-builtin-syntaxerror.c @@ -66,7 +66,7 @@ ecma_builtin_syntax_error_dispatch_call (const ecma_value_t *arguments_list_p, / ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value); ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_SYNTAX, message_string_p); - ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); ECMA_FINALIZE (msg_str_value); @@ -76,7 +76,7 @@ ecma_builtin_syntax_error_dispatch_call (const ecma_value_t *arguments_list_p, / { ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_SYNTAX); - return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); } } /* ecma_builtin_syntax_error_dispatch_call */ diff --git a/src/libecmabuiltins/ecma-builtin-typeerror.c b/src/libecmabuiltins/ecma-builtin-typeerror.c index cf855bf0c..7c9db319c 100644 --- a/src/libecmabuiltins/ecma-builtin-typeerror.c +++ b/src/libecmabuiltins/ecma-builtin-typeerror.c @@ -66,7 +66,7 @@ ecma_builtin_type_error_dispatch_call (const ecma_value_t *arguments_list_p, /** ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value); ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_TYPE, message_string_p); - ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); ECMA_FINALIZE (msg_str_value); @@ -76,7 +76,7 @@ ecma_builtin_type_error_dispatch_call (const ecma_value_t *arguments_list_p, /** { ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_TYPE); - return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); } } /* ecma_builtin_type_error_dispatch_call */ diff --git a/src/libecmabuiltins/ecma-builtin-urierror.c b/src/libecmabuiltins/ecma-builtin-urierror.c index 5eb28f374..b0045e78e 100644 --- a/src/libecmabuiltins/ecma-builtin-urierror.c +++ b/src/libecmabuiltins/ecma-builtin-urierror.c @@ -66,7 +66,7 @@ ecma_builtin_uri_error_dispatch_call (const ecma_value_t *arguments_list_p, /**< ecma_string_t *message_string_p = ecma_get_string_from_value (msg_str_value); ecma_object_t *new_error_object_p = ecma_new_standard_error_with_message (ECMA_ERROR_URI, message_string_p); - ret_value = ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + ret_value = ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); ECMA_FINALIZE (msg_str_value); @@ -76,7 +76,7 @@ ecma_builtin_uri_error_dispatch_call (const ecma_value_t *arguments_list_p, /**< { ecma_object_t *new_error_object_p = ecma_new_standard_error (ECMA_ERROR_URI); - return ecma_make_normal_completion_value (ecma_make_object_value (new_error_object_p)); + return ecma_make_normal_completion_value (ecma_value_t (new_error_object_p)); } } /* ecma_builtin_uri_error_dispatch_call */ diff --git a/src/libecmabuiltins/ecma-builtins-internal.h b/src/libecmabuiltins/ecma-builtins-internal.h index bb5e18000..98de93a67 100644 --- a/src/libecmabuiltins/ecma-builtins-internal.h +++ b/src/libecmabuiltins/ecma-builtins-internal.h @@ -22,6 +22,7 @@ #include "ecma-builtins.h" #include "ecma-globals.h" +#include "ecma-value.h" /** * Position of built-in object's id field in [[Built-in routine ID]] internal property diff --git a/src/libecmabuiltins/ecma-builtins.c b/src/libecmabuiltins/ecma-builtins.c index 17800e30a..2710d21a2 100644 --- a/src/libecmabuiltins/ecma-builtins.c +++ b/src/libecmabuiltins/ecma-builtins.c @@ -348,7 +348,7 @@ ecma_builtin_make_function_object_for_routine (ecma_builtin_id_t builtin_id, /** ecma_number_t* len_p = ecma_alloc_number (); *len_p = length_prop_num_value; - ecma_set_named_data_property_value (len_prop_p, ecma_make_number_value (len_p)); + ecma_set_named_data_property_value (len_prop_p, ecma_value_t (len_p)); return func_obj_p; } /* ecma_builtin_make_function_object_for_routine */ diff --git a/src/libecmabuiltins/ecma-builtins.h b/src/libecmabuiltins/ecma-builtins.h index 554f6afbc..384fbd145 100644 --- a/src/libecmabuiltins/ecma-builtins.h +++ b/src/libecmabuiltins/ecma-builtins.h @@ -17,6 +17,7 @@ #define ECMA_BUILTINS_H #include "ecma-globals.h" +#include "ecma-value.h" /** * A built-in object's identifier diff --git a/src/libecmaobjects/ecma-alloc.c b/src/libecmaobjects/ecma-alloc.c index afcbe92e3..6897ab89a 100644 --- a/src/libecmaobjects/ecma-alloc.c +++ b/src/libecmaobjects/ecma-alloc.c @@ -1,4 +1,4 @@ -/* Copyright 2014 Samsung Electronics Co., Ltd. +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -20,7 +20,7 @@ #include "globals.h" #include "mem-poolman.h" -JERRY_STATIC_ASSERT (sizeof (ecma_value_t) <= sizeof (uint16_t)); +JERRY_STATIC_ASSERT (sizeof (ecma_value_packed_t) <= sizeof (uint16_t)); JERRY_STATIC_ASSERT (sizeof (ecma_property_t) <= sizeof (uint64_t)); JERRY_STATIC_ASSERT (sizeof (ecma_object_t) <= sizeof (uint64_t)); diff --git a/src/libecmaobjects/ecma-compressed-pointers.h b/src/libecmaobjects/ecma-compressed-pointers.h new file mode 100644 index 000000000..8eed5c08c --- /dev/null +++ b/src/libecmaobjects/ecma-compressed-pointers.h @@ -0,0 +1,67 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "mem-allocator.h" + +#ifndef ECMA_COMPRESSED_POINTERS_H +#define ECMA_COMPRESSED_POINTERS_H + +/** \addtogroup ecma ECMA + * @{ + * + * \addtogroup ecmacompressedpointers Helpers for operations with compressed heap pointers + * @{ + */ + +/** + * Get value of pointer from specified non-null compressed pointer field. + */ +#define ECMA_GET_NON_NULL_POINTER(type, field) \ + ((type *) mem_decompress_pointer (field)) + +/** + * Get value of pointer from specified compressed pointer field. + */ +#define ECMA_GET_POINTER(type, field) \ + (((unlikely (field == ECMA_NULL_POINTER)) ? NULL : ECMA_GET_NON_NULL_POINTER (type, field))) + +/** + * Set value of non-null compressed pointer field so that it will correspond + * to specified non_compressed_pointer. + */ +#define ECMA_SET_NON_NULL_POINTER(field, non_compressed_pointer) \ + (field) = (mem_compress_pointer (non_compressed_pointer) & ((1u << ECMA_POINTER_FIELD_WIDTH) - 1)) + +/** + * Set value of compressed pointer field so that it will correspond + * to specified non_compressed_pointer. + */ +#define ECMA_SET_POINTER(field, non_compressed_pointer) \ + do \ + { \ + auto __temp_pointer = non_compressed_pointer; \ + non_compressed_pointer = __temp_pointer; \ + } while (0); \ + \ + (field) = (unlikely ((non_compressed_pointer) == NULL) ? ECMA_NULL_POINTER \ + : (mem_compress_pointer (non_compressed_pointer) \ + & ((1u << ECMA_POINTER_FIELD_WIDTH) - 1))) + +/** + * @} + * @} + */ + +#endif /* ECMA_COMPRESSED_POINTERS_H */ diff --git a/src/libecmaobjects/ecma-gc.c b/src/libecmaobjects/ecma-gc.c index 2689e5b36..4d77c91ed 100644 --- a/src/libecmaobjects/ecma-gc.c +++ b/src/libecmaobjects/ecma-gc.c @@ -365,7 +365,8 @@ ecma_gc_mark (ecma_object_t *object_p, /**< start object */ { case ECMA_PROPERTY_NAMEDDATA: { - ecma_value_t value = ecma_get_named_data_property_value (property_p); + ecma_value_t value; + ecma_get_named_data_property_value (value, property_p); if (ecma_is_value_object (value)) { @@ -571,7 +572,8 @@ ecma_gc_run (ecma_gc_gen_t max_gen_to_collect) /**< maximum generation to run co { for (int32_t reg_index = 0; reg_index < frame_iter_p->regs_number; reg_index++) { - ecma_value_t reg_value = ecma_stack_frame_get_reg_value (frame_iter_p, reg_index); + ecma_value_t reg_value; + ecma_stack_frame_get_reg_value (reg_value, frame_iter_p, reg_index); if (ecma_is_value_object (reg_value)) { diff --git a/src/libecmaobjects/ecma-gc.h b/src/libecmaobjects/ecma-gc.h index 42f547dc3..de0731032 100644 --- a/src/libecmaobjects/ecma-gc.h +++ b/src/libecmaobjects/ecma-gc.h @@ -24,6 +24,7 @@ #define ECMA_GC_H #include "ecma-globals.h" +#include "ecma-value.h" #include "mem-allocator.h" /** diff --git a/src/libecmaobjects/ecma-globals.h b/src/libecmaobjects/ecma-globals.h index 5f7d78d8f..fe80bbbb2 100644 --- a/src/libecmaobjects/ecma-globals.h +++ b/src/libecmaobjects/ecma-globals.h @@ -113,11 +113,11 @@ typedef enum } ecma_completion_type_t; /** - * Description of an ecma-value + * Description of an packed ecma-value representation * * Bit-field structure: type (2) | value (ECMA_POINTER_FIELD_WIDTH) */ -typedef uint16_t ecma_value_t; +typedef uint16_t ecma_value_packed_t; /** * Value type (ecma_type_t) @@ -133,52 +133,10 @@ typedef uint16_t ecma_value_t; #define ECMA_VALUE_VALUE_WIDTH (ECMA_POINTER_FIELD_WIDTH) /** - * ecma_value_t size + * ecma_value_packed_t size */ #define ECMA_VALUE_SIZE (ECMA_VALUE_VALUE_POS + ECMA_VALUE_VALUE_WIDTH) -/** - * Description of a block completion value - * - * See also: ECMA-262 v5, 8.9. - * - * value (16) - * Bit-field structure: type (8) | padding (8) < - * label_desc_cp (16) - */ -typedef uint32_t ecma_completion_value_t; - -/** - * Type (ecma_completion_type_t) - */ -#define ECMA_COMPLETION_VALUE_TYPE_POS (0) -#define ECMA_COMPLETION_VALUE_TYPE_WIDTH (8) - -/** - * Padding (1 byte) - */ -#define ECMA_COMPLETION_VALUE_PADDING_WIDTH (8) - -/** - * Value - * - * Used for normal, return, throw and exit completion types. - */ -#define ECMA_COMPLETION_VALUE_VALUE_POS (ECMA_COMPLETION_VALUE_TYPE_POS + \ - ECMA_COMPLETION_VALUE_TYPE_WIDTH + \ - ECMA_COMPLETION_VALUE_PADDING_WIDTH) -#define ECMA_COMPLETION_VALUE_VALUE_WIDTH (ECMA_VALUE_SIZE) - -/** - * Label - * - * Used for break and continue completion types. - */ -#define ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS (ECMA_COMPLETION_VALUE_TYPE_POS + \ - ECMA_COMPLETION_VALUE_TYPE_WIDTH + \ - ECMA_COMPLETION_VALUE_PADDING_WIDTH) -#define ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH (ECMA_POINTER_FIELD_WIDTH) - /** * Label * @@ -304,7 +262,7 @@ typedef struct ecma_property_t unsigned int is_lcached : 1; /** Value */ - ecma_value_t value; + ecma_value_packed_t value; } named_data_property; /** Description of named accessor property */ @@ -531,7 +489,7 @@ typedef struct unsigned int is_configurable_defined : 1; /** [[Value]] */ - ecma_value_t value; + ecma_value_packed_t value; /** [[Get]] */ ecma_object_t* get_p; diff --git a/src/libecmaobjects/ecma-helpers-values-collection.c b/src/libecmaobjects/ecma-helpers-values-collection.c index f11e9ff22..5aa41d745 100644 --- a/src/libecmaobjects/ecma-helpers-values-collection.c +++ b/src/libecmaobjects/ecma-helpers-values-collection.c @@ -44,8 +44,9 @@ ecma_new_values_collection (ecma_value_t values_buffer[], /**< ecma-values */ header_p->unit_number = values_number; uint16_t* next_chunk_cp_p = &header_p->next_chunk_cp; - ecma_value_t* cur_value_buf_iter_p = (ecma_value_t*) header_p->data; - ecma_value_t* cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (header_p->data) / sizeof (ecma_value_t); + ecma_value_packed_t *cur_value_buf_iter_p, *cur_value_buf_end_p; + cur_value_buf_iter_p = (ecma_value_packed_t*) header_p->data; + cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (header_p->data) / sizeof (ecma_value_packed_t); for (ecma_length_t value_index = 0; value_index < values_number; @@ -57,13 +58,15 @@ ecma_new_values_collection (ecma_value_t values_buffer[], /**< ecma-values */ ECMA_SET_POINTER (*next_chunk_cp_p, chunk_p); next_chunk_cp_p = &chunk_p->next_chunk_cp; - cur_value_buf_iter_p = (ecma_value_t*) chunk_p->data; - cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (chunk_p->data) / sizeof (ecma_value_t); + cur_value_buf_iter_p = (ecma_value_packed_t*) chunk_p->data; + cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (chunk_p->data) / sizeof (ecma_value_packed_t); } JERRY_ASSERT (cur_value_buf_iter_p + 1 <= cur_value_buf_end_p); - *cur_value_buf_iter_p++ = ecma_copy_value (values_buffer[value_index], do_ref_if_object); + ecma_value_t value_copy; + ecma_copy_value (value_copy, values_buffer [value_index], do_ref_if_object); + *cur_value_buf_iter_p++ = (ecma_value_packed_t) value_copy; } *next_chunk_cp_p = ECMA_NULL_POINTER; @@ -81,8 +84,9 @@ ecma_free_values_collection (ecma_collection_header_t* header_p, /**< collection { JERRY_ASSERT (header_p != NULL); - ecma_value_t* cur_value_buf_iter_p = (ecma_value_t*) header_p->data; - ecma_value_t* cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (header_p->data) / sizeof (ecma_value_t); + ecma_value_packed_t *cur_value_buf_iter_p, *cur_value_buf_end_p; + cur_value_buf_iter_p = (ecma_value_packed_t*) header_p->data; + cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (header_p->data) / sizeof (ecma_value_packed_t); ecma_length_t string_index = 0; while (cur_value_buf_iter_p != cur_value_buf_end_p @@ -90,7 +94,8 @@ ecma_free_values_collection (ecma_collection_header_t* header_p, /**< collection { JERRY_ASSERT (cur_value_buf_iter_p < cur_value_buf_end_p); - ecma_free_value (*cur_value_buf_iter_p, do_deref_if_object); + ecma_value_t value_to_free (*cur_value_buf_iter_p); + ecma_free_value (value_to_free, do_deref_if_object); cur_value_buf_iter_p++; string_index++; @@ -103,15 +108,16 @@ ecma_free_values_collection (ecma_collection_header_t* header_p, /**< collection { JERRY_ASSERT (string_index < header_p->unit_number); - cur_value_buf_iter_p = (ecma_value_t*) chunk_p->data; - cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (chunk_p->data) / sizeof (ecma_value_t); + cur_value_buf_iter_p = (ecma_value_packed_t*) chunk_p->data; + cur_value_buf_end_p = cur_value_buf_iter_p + sizeof (chunk_p->data) / sizeof (ecma_value_packed_t); while (cur_value_buf_iter_p != cur_value_buf_end_p && string_index < header_p->unit_number) { JERRY_ASSERT (cur_value_buf_iter_p < cur_value_buf_end_p); - ecma_free_value (*cur_value_buf_iter_p, do_deref_if_object); + ecma_value_t value_to_free (*cur_value_buf_iter_p); + ecma_free_value (value_to_free, do_deref_if_object); cur_value_buf_iter_p++; string_index++; @@ -146,7 +152,7 @@ ecma_new_strings_collection (ecma_string_t* string_ptrs_buffer[], /**< pointers string_index < strings_number; string_index++) { - values_buffer[string_index] = ecma_make_string_value (string_ptrs_buffer[string_index]); + values_buffer[string_index] = string_ptrs_buffer[string_index]; } new_collection_p = ecma_new_values_collection (values_buffer, @@ -169,8 +175,8 @@ ecma_collection_iterator_init (ecma_collection_iterator_t *iterator_p, /**< cont iterator_p->next_chunk_cp = collection_p->next_chunk_cp; iterator_p->current_index = 0; iterator_p->current_value_p = NULL; - iterator_p->current_chunk_end_p = ((ecma_value_t*) iterator_p->header_p->data - + sizeof (iterator_p->header_p->data) / sizeof (ecma_value_t)); + iterator_p->current_chunk_end_p = ((ecma_value_packed_t*) iterator_p->header_p->data + + sizeof (iterator_p->header_p->data) / sizeof (ecma_value_packed_t)); } /* ecma_collection_iterator_init */ /** @@ -190,7 +196,7 @@ ecma_collection_iterator_next (ecma_collection_iterator_t *iterator_p) /**< cont if (iterator_p->current_value_p == NULL) { JERRY_ASSERT (iterator_p->current_index == 0); - iterator_p->current_value_p = (ecma_value_t*) iterator_p->header_p->data; + iterator_p->current_value_p = (ecma_value_packed_t*) iterator_p->header_p->data; return true; } @@ -212,8 +218,9 @@ ecma_collection_iterator_next (ecma_collection_iterator_t *iterator_p) /**< cont JERRY_ASSERT (next_chunk_p != NULL); iterator_p->next_chunk_cp = next_chunk_p->next_chunk_cp; - iterator_p->current_value_p = (ecma_value_t*) &next_chunk_p->data; - iterator_p->current_chunk_end_p = iterator_p->current_value_p + sizeof (next_chunk_p->data) / sizeof (ecma_value_t); + iterator_p->current_value_p = (ecma_value_packed_t*) &next_chunk_p->data; + iterator_p->current_chunk_end_p = (iterator_p->current_value_p + + sizeof (next_chunk_p->data) / sizeof (ecma_value_packed_t)); } else { diff --git a/src/libecmaobjects/ecma-helpers.c b/src/libecmaobjects/ecma-helpers.c index f5b39df87..cd561264f 100644 --- a/src/libecmaobjects/ecma-helpers.c +++ b/src/libecmaobjects/ecma-helpers.c @@ -519,7 +519,7 @@ ecma_create_named_data_property (ecma_object_t *obj_p, /**< object */ prop_p->u.named_data_property.is_lcached = false; - prop_p->u.named_data_property.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); + prop_p->u.named_data_property.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED); ecma_lcache_invalidate (obj_p, name_p, NULL); @@ -690,8 +690,8 @@ ecma_free_named_data_property (ecma_object_t *object_p, /**< object the property ecma_deref_ecma_string (ECMA_GET_NON_NULL_POINTER (ecma_string_t, property_p->u.named_data_property.name_p)); - ecma_value_t v = property_p->u.named_data_property.value; - ecma_free_value (v, false); + ecma_value_t value_to_free (property_p->u.named_data_property.value); + ecma_free_value (value_to_free, false); ecma_dealloc_property (property_p); } /* ecma_free_named_data_property */ @@ -864,12 +864,13 @@ ecma_delete_property (ecma_object_t *obj_p, /**< object */ * * @return ecma-value */ -ecma_value_t -ecma_get_named_data_property_value (const ecma_property_t *prop_p) /**< property */ +void +ecma_get_named_data_property_value (ecma_value_t &ret, /**< out: value */ + const ecma_property_t *prop_p) /**< property */ { JERRY_ASSERT (prop_p->type == ECMA_PROPERTY_NAMEDDATA); - return prop_p->u.named_data_property.value; + ret = prop_p->u.named_data_property.value; } /* ecma_get_named_data_property_value */ /** @@ -884,7 +885,7 @@ ecma_set_named_data_property_value (ecma_property_t *prop_p, /**< property */ /* 'May ref younger' flag should be updated upon assignment of object value */ JERRY_ASSERT (!ecma_is_value_object (value)); - prop_p->u.named_data_property.value = value; + prop_p->u.named_data_property.value = (ecma_value_packed_t) value; } /* ecma_set_named_data_property_value */ /** @@ -914,23 +915,29 @@ ecma_named_data_property_assign_value (ecma_object_t *obj_p, /**< object */ JERRY_ASSERT (prop_iter_p != NULL); #endif /* !JERRY_NDEBUG */ - if (ecma_is_value_number (value) - && ecma_is_value_number (prop_p->u.named_data_property.value)) + if (ecma_is_value_number (value)) { - const ecma_number_t *num_src_p = ecma_get_number_from_value (value); - ecma_number_t *num_dst_p = ecma_get_number_from_value (prop_p->u.named_data_property.value); + ecma_value_t num_value (prop_p->u.named_data_property.value); - *num_dst_p = *num_src_p; - } - else - { - ecma_value_t v = ecma_get_named_data_property_value (prop_p); - ecma_free_value (v, false); + if (ecma_is_value_number (num_value)) + { + const ecma_number_t *num_src_p = ecma_get_number_from_value (value); + ecma_number_t *num_dst_p = ecma_get_number_from_value (num_value); - prop_p->u.named_data_property.value = ecma_copy_value (value, false); - ecma_gc_update_may_ref_younger_object_flag_by_value (obj_p, - prop_p->u.named_data_property.value); + *num_dst_p = *num_src_p; + + return; + } } + + ecma_value_t v; + ecma_get_named_data_property_value (v, prop_p); + ecma_free_value (v, false); + + ecma_value_t value_copy; + ecma_copy_value (value_copy, value, false); + prop_p->u.named_data_property.value = (ecma_value_packed_t) value_copy; + ecma_gc_update_may_ref_younger_object_flag_by_value (obj_p, value_copy); } /* ecma_named_data_property_assign_value */ /** @@ -1097,7 +1104,7 @@ ecma_make_empty_property_descriptor (void) ecma_property_descriptor_t prop_desc; prop_desc.is_value_defined = false; - prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED); prop_desc.is_writable_defined = false; prop_desc.is_writable = false; prop_desc.is_enumerable_defined = false; @@ -1121,7 +1128,9 @@ ecma_free_property_descriptor (ecma_property_descriptor_t *prop_desc_p) /**< pro { if (prop_desc_p->is_value_defined) { - ecma_free_value (prop_desc_p->value, true); + ecma_value_t value_to_free (prop_desc_p->value); + + ecma_free_value (value_to_free, true); } if (prop_desc_p->is_get_defined diff --git a/src/libecmaobjects/ecma-helpers.h b/src/libecmaobjects/ecma-helpers.h index d80ff291a..3194fcd75 100644 --- a/src/libecmaobjects/ecma-helpers.h +++ b/src/libecmaobjects/ecma-helpers.h @@ -24,100 +24,8 @@ #define JERRY_ECMA_HELPERS_H #include "ecma-globals.h" -#include "mem-allocator.h" - -/** - * Get value of pointer from specified non-null compressed pointer field. - */ -#define ECMA_GET_NON_NULL_POINTER(type, field) \ - ((type *) mem_decompress_pointer (field)) - -/** - * Get value of pointer from specified compressed pointer field. - */ -#define ECMA_GET_POINTER(type, field) \ - (((unlikely (field == ECMA_NULL_POINTER)) ? NULL : ECMA_GET_NON_NULL_POINTER (type, field))) - -/** - * Set value of non-null compressed pointer field so that it will correspond - * to specified non_compressed_pointer. - */ -#define ECMA_SET_NON_NULL_POINTER(field, non_compressed_pointer) \ - (field) = (mem_compress_pointer (non_compressed_pointer) & ((1u << ECMA_POINTER_FIELD_WIDTH) - 1)) - -/** - * Set value of compressed pointer field so that it will correspond - * to specified non_compressed_pointer. - */ -#define ECMA_SET_POINTER(field, non_compressed_pointer) \ - do \ - { \ - auto __temp_pointer = non_compressed_pointer; \ - non_compressed_pointer = __temp_pointer; \ - } while (0); \ - \ - (field) = (unlikely ((non_compressed_pointer) == NULL) ? ECMA_NULL_POINTER \ - : (mem_compress_pointer (non_compressed_pointer) \ - & ((1u << ECMA_POINTER_FIELD_WIDTH) - 1))) - -/* ecma-helpers-value.c */ -extern bool ecma_is_value_empty (const ecma_value_t& value); -extern bool ecma_is_value_undefined (const ecma_value_t& value); -extern bool ecma_is_value_null (const ecma_value_t& value); -extern bool ecma_is_value_boolean (const ecma_value_t& value); -extern bool ecma_is_value_true (const ecma_value_t& value); - -extern bool ecma_is_value_number (const ecma_value_t& value); -extern bool ecma_is_value_string (const ecma_value_t& value); -extern bool ecma_is_value_object (const ecma_value_t& value); - -extern void ecma_check_value_type_is_spec_defined (const ecma_value_t& value); - -extern ecma_value_t ecma_make_simple_value (ecma_simple_value_t value); -extern ecma_value_t ecma_make_number_value (ecma_number_t* num_p); -extern ecma_value_t ecma_make_string_value (ecma_string_t* ecma_string_p); -extern ecma_value_t ecma_make_object_value (ecma_object_t* object_p); -extern ecma_number_t* __attribute_pure__ ecma_get_number_from_value (const ecma_value_t& value); -extern ecma_string_t* __attribute_pure__ ecma_get_string_from_value (const ecma_value_t& value); -extern ecma_object_t* __attribute_pure__ ecma_get_object_from_value (const ecma_value_t& value); -extern ecma_value_t ecma_copy_value (const ecma_value_t& value, bool do_ref_if_object); -extern void ecma_free_value (ecma_value_t& value, bool do_deref_if_object); - -extern ecma_completion_value_t ecma_make_completion_value (ecma_completion_type_t type, - const ecma_value_t& value); -extern ecma_completion_value_t ecma_make_label_completion_value (ecma_completion_type_t type, - uint8_t depth_level, - uint16_t offset); -extern ecma_completion_value_t ecma_make_simple_completion_value (ecma_simple_value_t simple_value); -extern ecma_completion_value_t ecma_make_normal_completion_value (const ecma_value_t& value); -extern ecma_completion_value_t ecma_make_throw_completion_value (const ecma_value_t& value); -extern ecma_completion_value_t ecma_make_throw_obj_completion_value (ecma_object_t *exception_p); -extern ecma_completion_value_t ecma_make_empty_completion_value (void); -extern ecma_completion_value_t ecma_make_return_completion_value (const ecma_value_t& value); -extern ecma_completion_value_t ecma_make_exit_completion_value (bool is_successful); -extern ecma_completion_value_t ecma_make_meta_completion_value (void); -extern ecma_value_t ecma_get_completion_value_value (ecma_completion_value_t completion_value); -extern ecma_number_t* __attribute_const__ -ecma_get_number_from_completion_value (ecma_completion_value_t completion_value); -extern ecma_string_t* __attribute_const__ -ecma_get_string_from_completion_value (ecma_completion_value_t completion_value); -extern ecma_object_t* __attribute_const__ -ecma_get_object_from_completion_value (ecma_completion_value_t completion_value); -extern ecma_completion_value_t ecma_copy_completion_value (ecma_completion_value_t value); -extern void ecma_free_completion_value (ecma_completion_value_t completion_value); - -extern bool ecma_is_completion_value_normal (ecma_completion_value_t value); -extern bool ecma_is_completion_value_throw (ecma_completion_value_t value); -extern bool ecma_is_completion_value_return (ecma_completion_value_t value); -extern bool ecma_is_completion_value_exit (ecma_completion_value_t value); -extern bool ecma_is_completion_value_meta (ecma_completion_value_t value); -extern bool ecma_is_completion_value_break (ecma_completion_value_t value); -extern bool ecma_is_completion_value_continue (ecma_completion_value_t value); -extern bool ecma_is_completion_value_normal_simple_value (ecma_completion_value_t value, - ecma_simple_value_t simple_value); -extern bool ecma_is_completion_value_normal_true (ecma_completion_value_t value); -extern bool ecma_is_completion_value_normal_false (ecma_completion_value_t value); -extern bool ecma_is_completion_value_empty (ecma_completion_value_t value); +#include "ecma-compressed-pointers.h" +#include "ecma-value.h" /* ecma-helpers-string.c */ extern ecma_string_t* ecma_new_ecma_string (const ecma_char_t *string_p); @@ -211,9 +119,9 @@ typedef struct ecma_collection_header_t *header_p; /**< collection header */ uint16_t next_chunk_cp; /**< compressed pointer to next chunk */ ecma_length_t current_index; /**< index of current element */ - const ecma_value_t *current_value_p; /**< pointer to current element */ - const ecma_value_t *current_chunk_beg_p; /**< pointer to beginning of current chunk's data */ - const ecma_value_t *current_chunk_end_p; /**< pointer to place right after the end of current chunk's data */ + const ecma_value_packed_t *current_value_p; /**< pointer to current element */ + const ecma_value_packed_t *current_chunk_beg_p; /**< pointer to beginning of current chunk's data */ + const ecma_value_packed_t *current_chunk_end_p; /**< pointer to place right after the end of current chunk's data */ } ecma_collection_iterator_t; extern void @@ -274,7 +182,7 @@ extern void ecma_free_property (ecma_object_t *obj_p, ecma_property_t *prop_p); extern void ecma_delete_property (ecma_object_t *obj_p, ecma_property_t *prop_p); -extern ecma_value_t ecma_get_named_data_property_value (const ecma_property_t *prop_p); +extern void ecma_get_named_data_property_value (ecma_value_t &ret, const ecma_property_t *prop_p); extern void ecma_set_named_data_property_value (ecma_property_t *prop_p, const ecma_value_t& value); extern void ecma_named_data_property_assign_value (ecma_object_t *obj_p, ecma_property_t *prop_p, diff --git a/src/libecmaobjects/ecma-stack.c b/src/libecmaobjects/ecma-stack.c index 973132127..8dbc615a0 100644 --- a/src/libecmaobjects/ecma-stack.c +++ b/src/libecmaobjects/ecma-stack.c @@ -74,7 +74,7 @@ ecma_stack_get_top_frame (void) */ void ecma_stack_add_frame (ecma_stack_frame_t *frame_p, /**< frame to initialize */ - ecma_value_t *regs_p, /**< array of register variables' values */ + ecma_value_packed_t *regs_p, /**< array of register variables' values */ int32_t regs_num) /**< number of register variables */ { frame_p->prev_frame_p = ecma_stack_top_frame_p; @@ -88,7 +88,7 @@ ecma_stack_add_frame (ecma_stack_frame_t *frame_p, /**< frame to initialize */ for (int32_t i = 0; i < regs_num; i++) { - regs_p [i] = ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY); + regs_p [i] = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_EMPTY); } } /* ecma_stack_add_frame */ @@ -115,7 +115,8 @@ ecma_stack_free_frame (ecma_stack_frame_t *frame_p) /**< frame to initialize */ reg_index < frame_p->regs_number; reg_index++) { - ecma_free_value (frame_p->regs_p [reg_index], false); + ecma_value_t value_to_free (frame_p->regs_p [reg_index]); + ecma_free_value (value_to_free, false); } } /* ecma_stack_free_frame */ @@ -124,13 +125,14 @@ ecma_stack_free_frame (ecma_stack_frame_t *frame_p) /**< frame to initialize */ * * @return ecma-value */ -ecma_value_t -ecma_stack_frame_get_reg_value (ecma_stack_frame_t *frame_p, /**< frame */ +void +ecma_stack_frame_get_reg_value (ecma_value_t &ret, /**< out: ecma-value */ + ecma_stack_frame_t *frame_p, /**< frame */ int32_t reg_index) /**< index of register variable */ { JERRY_ASSERT (reg_index >= 0 && reg_index < frame_p->regs_number); - return frame_p->regs_p [reg_index]; + ret = frame_p->regs_p [reg_index]; } /* ecma_stack_frame_get_reg_value */ /** @@ -139,11 +141,11 @@ ecma_stack_frame_get_reg_value (ecma_stack_frame_t *frame_p, /**< frame */ void ecma_stack_frame_set_reg_value (ecma_stack_frame_t *frame_p, /**< frame */ int32_t reg_index, /**< index of register variable */ - ecma_value_t value) /**< ecma-value */ + const ecma_value_t& value) /**< ecma-value */ { JERRY_ASSERT (reg_index >= 0 && reg_index < frame_p->regs_number); - frame_p->regs_p [reg_index] = value; + frame_p->regs_p [reg_index] = (ecma_value_packed_t) value; } /* ecma_stack_frame_set_reg_value */ /** @@ -177,7 +179,7 @@ ecma_stack_push_value_longpath (ecma_stack_frame_t *frame_p) /**< ecma-stack fra ECMA_SET_POINTER (chunk_p->prev_chunk_p, frame_p->top_chunk_p); frame_p->top_chunk_p = chunk_p; - frame_p->dynamically_allocated_value_slots_p = (ecma_value_t*) (frame_p->top_chunk_p + 1); + frame_p->dynamically_allocated_value_slots_p = (ecma_value_packed_t*) (frame_p->top_chunk_p + 1); frame_p->current_slot_index = 0; } } /* ecma_stack_push_value_longpath */ @@ -199,20 +201,21 @@ ecma_stack_push_value (ecma_stack_frame_t *frame_p, /**< ecma-stack frame */ JERRY_ASSERT (frame_p->current_slot_index < ecma_stack_slots_in_top_chunk (frame_p)); - frame_p->dynamically_allocated_value_slots_p [frame_p->current_slot_index] = value; + frame_p->dynamically_allocated_value_slots_p [frame_p->current_slot_index] = (ecma_value_packed_t) value; } /* ecma_stack_push_value */ /** * Get top value from ecma-stack */ -inline ecma_value_t __attribute_always_inline__ -ecma_stack_top_value (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */ +inline void __attribute_always_inline__ +ecma_stack_top_value (ecma_value_t &ret, /**< out: ecma-value */ + ecma_stack_frame_t *frame_p) /**< ecma-stack frame */ { const size_t slots_in_top_chunk = ecma_stack_slots_in_top_chunk (frame_p); JERRY_ASSERT (frame_p->current_slot_index < slots_in_top_chunk); - return frame_p->dynamically_allocated_value_slots_p [frame_p->current_slot_index]; + ret = frame_p->dynamically_allocated_value_slots_p [frame_p->current_slot_index]; } /* ecma_stack_top_value */ /** @@ -229,7 +232,7 @@ ecma_stack_pop_longpath (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */ if (frame_p->top_chunk_p != NULL) { - frame_p->dynamically_allocated_value_slots_p = (ecma_value_t*) (frame_p->top_chunk_p + 1); + frame_p->dynamically_allocated_value_slots_p = (ecma_value_packed_t*) (frame_p->top_chunk_p + 1); frame_p->current_slot_index = (uint32_t) (ECMA_STACK_SLOTS_IN_DYNAMIC_CHUNK - 1u); } else @@ -249,7 +252,8 @@ ecma_stack_pop (ecma_stack_frame_t *frame_p) /**< ecma-stack frame */ { JERRY_ASSERT (frame_p->current_slot_index < ecma_stack_slots_in_top_chunk (frame_p)); - ecma_value_t value = ecma_stack_top_value (frame_p); + ecma_value_t value; + ecma_stack_top_value (value, frame_p); if (unlikely (frame_p->current_slot_index == 0 && frame_p->top_chunk_p != NULL)) diff --git a/src/libecmaobjects/ecma-stack.h b/src/libecmaobjects/ecma-stack.h index 1c2b54da5..2067f9bc0 100644 --- a/src/libecmaobjects/ecma-stack.h +++ b/src/libecmaobjects/ecma-stack.h @@ -18,6 +18,7 @@ #include "config.h" #include "ecma-globals.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ @@ -46,13 +47,14 @@ typedef struct ecma_stack_frame_t { struct ecma_stack_frame_t *prev_frame_p; /**< previous frame */ ecma_stack_chunk_header_t *top_chunk_p; /**< the top-most chunk of the frame */ - ecma_value_t *dynamically_allocated_value_slots_p; /**< pointer to dynamically allocated value slots - * in the top-most chunk */ + ecma_value_packed_t *dynamically_allocated_value_slots_p; /**< pointer to dynamically allocated value slots + * in the top-most chunk */ uint32_t current_slot_index; /**< index of first free slot in the top chunk */ - ecma_value_t inlined_values [ECMA_STACK_FRAME_INLINED_VALUES_NUMBER]; /**< place for values inlined in stack frame - * (instead of being dynamically allocated - * on the heap) */ - ecma_value_t *regs_p; /**< register variables */ + ecma_value_packed_t inlined_values [ECMA_STACK_FRAME_INLINED_VALUES_NUMBER]; /**< place for values inlined + * in stack frame (instead of + * being dynamically allocated + * on the heap) */ + ecma_value_packed_t *regs_p; /**< register variables */ int32_t regs_number; /**< number of register variables */ } ecma_stack_frame_t; @@ -62,13 +64,18 @@ extern ecma_stack_frame_t* ecma_stack_get_top_frame (void); extern void ecma_stack_add_frame (ecma_stack_frame_t *frame_p, - ecma_value_t *regs_p, + ecma_value_packed_t *regs_p, int32_t regs_num); extern void ecma_stack_free_frame (ecma_stack_frame_t *frame_p); -extern ecma_value_t ecma_stack_frame_get_reg_value (ecma_stack_frame_t *frame_p, int32_t reg_index); -extern void ecma_stack_frame_set_reg_value (ecma_stack_frame_t *frame_p, int32_t reg_index, ecma_value_t value); +extern void ecma_stack_frame_get_reg_value (ecma_value_t &ret, + ecma_stack_frame_t *frame_p, + int32_t reg_index); +extern void +ecma_stack_frame_set_reg_value (ecma_stack_frame_t *frame_p, + int32_t reg_index, + const ecma_value_t& value); extern void ecma_stack_push_value (ecma_stack_frame_t *frame_p, ecma_value_t value); -extern ecma_value_t ecma_stack_top_value (ecma_stack_frame_t *frame_p); +extern void ecma_stack_top_value (ecma_value_t &ret, ecma_stack_frame_t *frame_p); extern void ecma_stack_pop (ecma_stack_frame_t *frame_p); extern void ecma_stack_pop_multiple (ecma_stack_frame_t *frame_p, uint32_t number); diff --git a/src/libecmaobjects/ecma-value.c b/src/libecmaobjects/ecma-value.c new file mode 100644 index 000000000..a7ea5a0dd --- /dev/null +++ b/src/libecmaobjects/ecma-value.c @@ -0,0 +1,341 @@ +/* Copyright 2015 Samsung Electronics Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "ecma-alloc.h" +#include "ecma-gc.h" +#include "ecma-globals.h" +#include "ecma-helpers.h" +#include "ecma-value.h" +#include "globals.h" +#include "jrt-bit-fields.h" + +JERRY_STATIC_ASSERT (sizeof (ecma_value_packed_t) * JERRY_BITSINBYTE == ECMA_VALUE_SIZE); + +/** + * Get pointer to ecma-number from ecma-value + * + * @return the pointer + */ +ecma_number_t* __attribute_pure__ +ecma_get_number_from_value (const ecma_value_t& value) /**< ecma-value */ +{ + JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_NUMBER); + + return ECMA_GET_NON_NULL_POINTER (ecma_number_t, + ecma_get_value_value_field (value)); +} /* ecma_get_number_from_value */ + +/** + * Get pointer to ecma-string from ecma-value + * + * @return the pointer + */ +ecma_string_t* __attribute_pure__ +ecma_get_string_from_value (const ecma_value_t& value) /**< ecma-value */ +{ + JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_STRING); + + return ECMA_GET_NON_NULL_POINTER (ecma_string_t, + ecma_get_value_value_field (value)); +} /* ecma_get_string_from_value */ + +/** + * Get pointer to ecma-object from ecma-value + * + * @return the pointer + */ +ecma_object_t* __attribute_pure__ +ecma_get_object_from_value (const ecma_value_t& value) /**< ecma-value */ +{ + JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT); + + return ECMA_GET_NON_NULL_POINTER (ecma_object_t, + ecma_get_value_value_field (value)); +} /* ecma_get_object_from_value */ + +/** + * Copy ecma-value. + * + * Note: + * Operation algorithm. + * switch (valuetype) + * case simple: + * simply return the value as it was passed; + * case number: + * copy the number + * and return new ecma-value + * pointing to copy of the number; + * case string: + * increase reference counter of the string + * and return the value as it was passed. + * case object; + * increase reference counter of the object if do_ref_if_object is true + * and return the value as it was passed. + * + * @return See note. + */ +void +ecma_copy_value (ecma_value_t &ret, /**< out: ecma-value */ + const ecma_value_t& value, /**< ecma-value */ + bool do_ref_if_object) /**< if the value is object value, + increment reference counter of the object */ +{ + switch (ecma_get_value_type_field (value)) + { + case ECMA_TYPE_SIMPLE: + { + ret = value; + + break; + } + case ECMA_TYPE_NUMBER: + { + ecma_number_t *num_p = ecma_get_number_from_value (value); + + ecma_number_t *number_copy_p = ecma_alloc_number (); + *number_copy_p = *num_p; + + ret = number_copy_p; + + break; + } + case ECMA_TYPE_STRING: + { + ecma_string_t *string_p = ecma_get_string_from_value (value); + + string_p = ecma_copy_or_ref_ecma_string (string_p); + + ret = string_p; + + break; + } + case ECMA_TYPE_OBJECT: + { + ecma_object_t *obj_p = ecma_get_object_from_value (value); + + if (do_ref_if_object) + { + ecma_ref_object (obj_p); + } + + ret = value; + + break; + } + } +} /* ecma_copy_value */ + +/** + * Free the ecma-value + */ +void +ecma_free_value (ecma_value_t& value, /**< value description */ + bool do_deref_if_object) /**< if the value is object value, + decrement reference counter of the object */ +{ + switch (ecma_get_value_type_field (value)) + { + case ECMA_TYPE_SIMPLE: + { + /* doesn't hold additional memory */ + break; + } + + case ECMA_TYPE_NUMBER: + { + ecma_number_t *number_p = ecma_get_number_from_value (value); + ecma_dealloc_number (number_p); + break; + } + + case ECMA_TYPE_STRING: + { + ecma_string_t *string_p = ecma_get_string_from_value (value); + ecma_deref_ecma_string (string_p); + break; + } + + case ECMA_TYPE_OBJECT: + { + if (do_deref_if_object) + { + ecma_deref_object (ecma_get_object_from_value (value)); + } + break; + } + } +} /* ecma_free_value */ + +/** + * Get pointer to label descriptor from completion value + * + * @return pointer to label descriptor + */ +static ecma_label_descriptor_t* __attribute_const__ +ecma_get_completion_value_label_descriptor (ecma_completion_value_t completion_value) /**< completion value */ +{ + return ECMA_GET_NON_NULL_POINTER (ecma_label_descriptor_t, + (uintptr_t) jrt_extract_bit_field (completion_value, + ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS, + ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH)); +} /* ecma_get_completion_value_label_descriptor */ + +/** + * Set label descriptor of completion value + * + * @return completion value with updated field + */ +static ecma_completion_value_t __attribute_const__ +ecma_set_completion_value_label_descriptor (ecma_completion_value_t completion_value, /**< completion value + * to set field in */ + ecma_label_descriptor_t* label_desc_p) /**< pointer to the + * label descriptor */ +{ + uintptr_t label_desc_cp; + ECMA_SET_NON_NULL_POINTER (label_desc_cp, label_desc_p); + + return (ecma_completion_value_t) jrt_set_bit_field_value (completion_value, + label_desc_cp, + ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS, + ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH); +} /* ecma_set_completion_value_label_descriptor */ + +/** + * Break and continue completion values constructor + * + * @return completion value + */ +ecma_completion_value_t __attribute_const__ +ecma_make_label_completion_value (ecma_completion_type_t type, /**< type */ + uint8_t depth_level, /**< depth level (in try constructions, + with blocks, etc.) */ + uint16_t offset) /**< offset to label from end of last block */ +{ + JERRY_ASSERT (type == ECMA_COMPLETION_TYPE_BREAK + || type == ECMA_COMPLETION_TYPE_CONTINUE); + + ecma_label_descriptor_t *label_desc_p = ecma_alloc_label_descriptor (); + label_desc_p->offset = offset; + label_desc_p->depth = depth_level; + + ecma_completion_value_t completion_value = 0; + + completion_value = ecma_set_completion_value_type_field (completion_value, + type); + completion_value = ecma_set_completion_value_label_descriptor (completion_value, + label_desc_p); + + return completion_value; +} /* ecma_make_label_completion_value */ + +/** + * Throw completion value constructor. + * + * @return 'throw' completion value + */ +ecma_completion_value_t __attribute_const__ +ecma_make_throw_obj_completion_value (ecma_object_t *exception_p) /**< an object */ +{ + JERRY_ASSERT(exception_p != NULL + && !ecma_is_lexical_environment (exception_p)); + + ecma_value_t exception (exception_p); + + return ecma_make_throw_completion_value (exception); +} /* ecma_make_throw_obj_completion_value */ + +/** + * Copy ecma-completion value. + * + * @return (source.type, ecma_copy_value (source.value), source.target). + */ +ecma_completion_value_t +ecma_copy_completion_value (ecma_completion_value_t value) /**< completion value */ +{ + const ecma_completion_type_t type = ecma_get_completion_value_type_field (value); + const bool is_type_ok = (type == ECMA_COMPLETION_TYPE_NORMAL +#ifdef CONFIG_ECMA_EXCEPTION_SUPPORT + || type == ECMA_COMPLETION_TYPE_THROW +#endif /* CONFIG_ECMA_EXCEPTION_SUPPORT */ + || type == ECMA_COMPLETION_TYPE_RETURN + || type == ECMA_COMPLETION_TYPE_EXIT); + + JERRY_ASSERT (is_type_ok); + + ecma_value_t v; + ecma_get_completion_value_value_field (v, value); + + ecma_value_t value_copy; + ecma_copy_value (value_copy, v, true); + + return ecma_make_completion_value (type, value_copy); +} /* ecma_copy_completion_value */ + +/** + * Free the completion value. + */ +void +ecma_free_completion_value (ecma_completion_value_t completion_value) /**< completion value */ +{ + switch (ecma_get_completion_value_type_field (completion_value)) + { + case ECMA_COMPLETION_TYPE_NORMAL: +#ifdef CONFIG_ECMA_EXCEPTION_SUPPORT + case ECMA_COMPLETION_TYPE_THROW: +#endif /* CONFIG_ECMA_EXCEPTION_SUPPORT */ + case ECMA_COMPLETION_TYPE_RETURN: + { + ecma_value_t v; + ecma_get_completion_value_value_field (v, completion_value); + + ecma_free_value (v, true); + break; + } + case ECMA_COMPLETION_TYPE_EXIT: + { + ecma_value_t v; + + ecma_get_completion_value_value_field (v, completion_value); + JERRY_ASSERT(ecma_get_value_type_field (v) == ECMA_TYPE_SIMPLE); + + break; + } + case ECMA_COMPLETION_TYPE_CONTINUE: + case ECMA_COMPLETION_TYPE_BREAK: + { + ecma_dealloc_label_descriptor (ecma_get_completion_value_label_descriptor (completion_value)); + break; + } + case ECMA_COMPLETION_TYPE_META: + { + JERRY_UNREACHABLE (); + } + } +} /* ecma_free_completion_value */ + +/** + * Debug assertion that specified value's type is one of ECMA-defined + * script-visible types, i.e.: undefined, null, boolean, number, string, object. + */ +void +ecma_check_value_type_is_spec_defined (const ecma_value_t& value) /**< ecma-value */ +{ + JERRY_ASSERT (ecma_is_value_undefined (value) + || ecma_is_value_null (value) + || ecma_is_value_boolean (value) + || ecma_is_value_number (value) + || ecma_is_value_string (value) + || ecma_is_value_object (value)); +} /* ecma_check_value_type_is_spec_defined */ diff --git a/src/libecmaobjects/ecma-helpers-value.c b/src/libecmaobjects/ecma-value.h similarity index 52% rename from src/libecmaobjects/ecma-helpers-value.c rename to src/libecmaobjects/ecma-value.h index ac136a8ad..20bb2f8da 100644 --- a/src/libecmaobjects/ecma-helpers-value.c +++ b/src/libecmaobjects/ecma-value.h @@ -13,31 +13,213 @@ * limitations under the License. */ +#include "ecma-compressed-pointers.h" +#include "ecma-globals.h" +#include "jrt-bit-fields.h" + +#ifndef ECMA_VALUE_H +#define ECMA_VALUE_H + /** \addtogroup ecma ECMA * @{ * - * \addtogroup ecmahelpers Helpers for operations with ECMA data types + * \addtogroup ecmavalue ECMA value on-stack storage * @{ */ -#include "ecma-alloc.h" -#include "ecma-gc.h" -#include "ecma-globals.h" -#include "ecma-helpers.h" -#include "globals.h" -#include "jrt-bit-fields.h" +/** + * Description of ecma-value on-stack storage + */ +class ecma_value_t +{ + public: + /* Constructors */ + __attribute_always_inline__ + ecma_value_t (ecma_type_t type, /**< ecma-value type */ + uintptr_t value) /**< compressed pointer + * or simple value */ + { + _packed = pack (type, value); + } /* ecma_value_t */ -JERRY_STATIC_ASSERT (sizeof (ecma_value_t) * JERRY_BITSINBYTE == ECMA_VALUE_SIZE); + __attribute_always_inline__ + ecma_value_t (ecma_simple_value_t simple_value) + : ecma_value_t (ECMA_TYPE_SIMPLE, simple_value) { } + + __attribute_always_inline__ + ecma_value_t () : ecma_value_t (ECMA_SIMPLE_VALUE_EMPTY) { } + + __attribute_always_inline__ + explicit ecma_value_t (ecma_number_t *num_p) + { + *this = num_p; + } + + __attribute_always_inline__ + explicit ecma_value_t (ecma_string_t *str_p) + { + *this = str_p; + } + + __attribute_always_inline__ + explicit ecma_value_t (ecma_object_t *obj_p) + { + *this = obj_p; + } + + __attribute_always_inline__ + explicit ecma_value_t (ecma_value_packed_t v) + { + *this = v; + } + + ecma_value_t (const ecma_value_t&) = delete; + ecma_value_t (ecma_value_t&) = delete; + ecma_value_t (ecma_value_t&&) = delete; + ecma_value_t& operator = (ecma_value_t &) = delete; + ecma_value_t& operator = (ecma_value_t &&) = delete; + + /* Extraction of packed representation */ + __attribute_always_inline__ + explicit operator ecma_value_packed_t () const { return _packed; } + + /* Assignment operators */ + __attribute_always_inline__ + ecma_value_t& operator = (ecma_simple_value_t v) + { + _packed = pack (ECMA_TYPE_SIMPLE, v); + + return *this; + } + + ecma_value_t& operator = (ecma_number_t* num_p) + { + JERRY_ASSERT(num_p != NULL); + + uint16_t num_cp; + ECMA_SET_NON_NULL_POINTER (num_cp, num_p); + + _packed = pack (ECMA_TYPE_NUMBER, num_cp); + + return *this; + } + + ecma_value_t& operator = (ecma_string_t* str_p) + { + JERRY_ASSERT(str_p != NULL); + + uint16_t str_cp; + ECMA_SET_NON_NULL_POINTER (str_cp, str_p); + + _packed = pack (ECMA_TYPE_STRING, str_cp); + + return *this; + } + + ecma_value_t& operator = (ecma_object_t *obj_p) + { + JERRY_ASSERT(obj_p != NULL); + + uint16_t obj_cp; + ECMA_SET_NON_NULL_POINTER (obj_cp, obj_p); + + _packed = pack (ECMA_TYPE_OBJECT, obj_cp); + + return *this; + } + + ecma_value_t& operator = (ecma_value_packed_t packed) + { + _packed = packed; + + return *this; + } + + ecma_value_t& operator = (const ecma_value_t &v) + { + this->_packed = v._packed; + + return *this; + } + private: + /** + * Combining type and value fields to packed representation + * + * @return packed ecma-value representation + */ + __attribute_always_inline__ + ecma_value_packed_t pack (ecma_type_t type, + uintptr_t value) + { + ecma_value_packed_t packed; + + packed = (ecma_value_packed_t) jrt_set_bit_field_value (0, + type, + ECMA_VALUE_TYPE_POS, + ECMA_VALUE_TYPE_WIDTH); + + packed = (ecma_value_packed_t) jrt_set_bit_field_value (packed, + value, + ECMA_VALUE_VALUE_POS, + ECMA_VALUE_VALUE_WIDTH); + + return packed; + } + + ecma_value_packed_t _packed; /**< packed value representation */ +}; + +/** + * Description of a block completion value + * + * See also: ECMA-262 v5, 8.9. + * + * value (16) + * Bit-field structure: type (8) | padding (8) < + * label_desc_cp (16) + */ +typedef uint32_t ecma_completion_value_t; + +/** + * Type (ecma_completion_type_t) + */ +#define ECMA_COMPLETION_VALUE_TYPE_POS (0) +#define ECMA_COMPLETION_VALUE_TYPE_WIDTH (8) + +/** + * Padding (1 byte) + */ +#define ECMA_COMPLETION_VALUE_PADDING_WIDTH (8) + +/** + * Value + * + * Used for normal, return, throw and exit completion types. + */ +#define ECMA_COMPLETION_VALUE_VALUE_POS (ECMA_COMPLETION_VALUE_TYPE_POS + \ + ECMA_COMPLETION_VALUE_TYPE_WIDTH + \ + ECMA_COMPLETION_VALUE_PADDING_WIDTH) +#define ECMA_COMPLETION_VALUE_VALUE_WIDTH (ECMA_VALUE_SIZE) + +/** + * Label + * + * Used for break and continue completion types. + */ +#define ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS (ECMA_COMPLETION_VALUE_TYPE_POS + \ + ECMA_COMPLETION_VALUE_TYPE_WIDTH + \ + ECMA_COMPLETION_VALUE_PADDING_WIDTH) +#define ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH (ECMA_POINTER_FIELD_WIDTH) /** * Get type field of ecma-value * * @return type field */ -static ecma_type_t __attribute_pure__ +inline ecma_type_t __attribute_pure__ __attribute_always_inline__ ecma_get_value_type_field (const ecma_value_t& value) /**< ecma-value */ { - return (ecma_type_t) jrt_extract_bit_field (value, + return (ecma_type_t) jrt_extract_bit_field ((ecma_value_packed_t) value, ECMA_VALUE_TYPE_POS, ECMA_VALUE_TYPE_WIDTH); } /* ecma_get_value_type_field */ @@ -47,44 +229,14 @@ ecma_get_value_type_field (const ecma_value_t& value) /**< ecma-value */ * * @return value field */ -static uintptr_t __attribute_pure__ +inline uintptr_t __attribute_pure__ __attribute_always_inline__ ecma_get_value_value_field (const ecma_value_t& value) /**< ecma-value */ { - return (uintptr_t) jrt_extract_bit_field (value, + return (uintptr_t) jrt_extract_bit_field ((ecma_value_packed_t) value, ECMA_VALUE_VALUE_POS, ECMA_VALUE_VALUE_WIDTH); } /* ecma_get_value_value_field */ -/** - * Set type field of ecma-value - * - * @return ecma-value with updated field - */ -static ecma_value_t __attribute_pure__ -ecma_set_value_type_field (const ecma_value_t& value, /**< ecma-value to set field in */ - ecma_type_t type_field) /**< new field value */ -{ - return (ecma_value_t) jrt_set_bit_field_value (value, - type_field, - ECMA_VALUE_TYPE_POS, - ECMA_VALUE_TYPE_WIDTH); -} /* ecma_set_value_type_field */ - -/** - * Set value field of ecma-value - * - * @return ecma-value with updated field - */ -static ecma_value_t __attribute_pure__ -ecma_set_value_value_field (const ecma_value_t& value, /**< ecma-value to set field in */ - uintptr_t value_field) /**< new field value */ -{ - return (ecma_value_t) jrt_set_bit_field_value (value, - value_field, - ECMA_VALUE_VALUE_POS, - ECMA_VALUE_VALUE_WIDTH); -} /* ecma_set_value_value_field */ - /** * Check if the value is empty. * @@ -190,256 +342,18 @@ ecma_is_value_object (const ecma_value_t& value) /**< ecma-value */ return (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT); } /* ecma_is_value_object */ -/** - * Debug assertion that specified value's type is one of ECMA-defined - * script-visible types, i.e.: undefined, null, boolean, number, string, object. - */ -void -ecma_check_value_type_is_spec_defined (const ecma_value_t& value) /**< ecma-value */ -{ - JERRY_ASSERT (ecma_is_value_undefined (value) - || ecma_is_value_null (value) - || ecma_is_value_boolean (value) - || ecma_is_value_number (value) - || ecma_is_value_string (value) - || ecma_is_value_object (value)); -} /* ecma_check_value_type_is_spec_defined */ - -/** - * Simple value constructor - */ -inline ecma_value_t __attribute_const__ __attribute_always_inline__ -ecma_make_simple_value (ecma_simple_value_t value) /**< simple value */ -{ - ecma_value_t ret_value = 0; - - ret_value = ecma_set_value_type_field (ret_value, ECMA_TYPE_SIMPLE); - ret_value = ecma_set_value_value_field (ret_value, value); - - return ret_value; -} /* ecma_make_simple_value */ - -/** - * Number value constructor - */ -ecma_value_t __attribute_const__ -ecma_make_number_value (ecma_number_t* num_p) /**< number to reference in value */ -{ - JERRY_ASSERT(num_p != NULL); - - uint16_t num_cp; - ECMA_SET_NON_NULL_POINTER (num_cp, num_p); - - ecma_value_t ret_value = 0; - - ret_value = ecma_set_value_type_field (ret_value, ECMA_TYPE_NUMBER); - ret_value = ecma_set_value_value_field (ret_value, num_cp); - - return ret_value; -} /* ecma_make_number_value */ - -/** - * String value constructor - */ -ecma_value_t __attribute_const__ -ecma_make_string_value (ecma_string_t* ecma_string_p) /**< string to reference in value */ -{ - JERRY_ASSERT(ecma_string_p != NULL); - - uint16_t string_cp; - ECMA_SET_NON_NULL_POINTER (string_cp, ecma_string_p); - - ecma_value_t ret_value = 0; - - ret_value = ecma_set_value_type_field (ret_value, ECMA_TYPE_STRING); - ret_value = ecma_set_value_value_field (ret_value, string_cp); - - return ret_value; -} /* ecma_make_string_value */ - -/** - * object value constructor - */ -ecma_value_t __attribute_const__ -ecma_make_object_value (ecma_object_t* object_p) /**< object to reference in value */ -{ - JERRY_ASSERT(object_p != NULL); - - uint16_t object_cp; - ECMA_SET_NON_NULL_POINTER (object_cp, object_p); - - ecma_value_t ret_value = 0; - - ret_value = ecma_set_value_type_field (ret_value, ECMA_TYPE_OBJECT); - ret_value = ecma_set_value_value_field (ret_value, object_cp); - - return ret_value; -} /* ecma_make_object_value */ - -/** - * Get pointer to ecma-number from ecma-value - * - * @return the pointer - */ -ecma_number_t* __attribute_pure__ -ecma_get_number_from_value (const ecma_value_t& value) /**< ecma-value */ -{ - JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_NUMBER); - - return ECMA_GET_NON_NULL_POINTER (ecma_number_t, - ecma_get_value_value_field (value)); -} /* ecma_get_number_from_value */ - -/** - * Get pointer to ecma-string from ecma-value - * - * @return the pointer - */ -ecma_string_t* __attribute_pure__ -ecma_get_string_from_value (const ecma_value_t& value) /**< ecma-value */ -{ - JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_STRING); - - return ECMA_GET_NON_NULL_POINTER (ecma_string_t, - ecma_get_value_value_field (value)); -} /* ecma_get_string_from_value */ - -/** - * Get pointer to ecma-object from ecma-value - * - * @return the pointer - */ -ecma_object_t* __attribute_pure__ -ecma_get_object_from_value (const ecma_value_t& value) /**< ecma-value */ -{ - JERRY_ASSERT (ecma_get_value_type_field (value) == ECMA_TYPE_OBJECT); - - return ECMA_GET_NON_NULL_POINTER (ecma_object_t, - ecma_get_value_value_field (value)); -} /* ecma_get_object_from_value */ - -/** - * Copy ecma-value. - * - * Note: - * Operation algorithm. - * switch (valuetype) - * case simple: - * simply return the value as it was passed; - * case number: - * copy the number - * and return new ecma-value - * pointing to copy of the number; - * case string: - * increase reference counter of the string - * and return the value as it was passed. - * case object; - * increase reference counter of the object if do_ref_if_object is true - * and return the value as it was passed. - * - * @return See note. - */ -ecma_value_t -ecma_copy_value (const ecma_value_t& value, /**< ecma-value */ - bool do_ref_if_object) /**< if the value is object value, - increment reference counter of the object */ -{ - ecma_value_t value_copy = 0; - - switch (ecma_get_value_type_field (value)) - { - case ECMA_TYPE_SIMPLE: - { - value_copy = value; - - break; - } - case ECMA_TYPE_NUMBER: - { - ecma_number_t *num_p = ecma_get_number_from_value (value); - - ecma_number_t *number_copy_p = ecma_alloc_number (); - *number_copy_p = *num_p; - - value_copy = ecma_make_number_value (number_copy_p); - - break; - } - case ECMA_TYPE_STRING: - { - ecma_string_t *string_p = ecma_get_string_from_value (value); - - string_p = ecma_copy_or_ref_ecma_string (string_p); - - value_copy = ecma_make_string_value (string_p); - - break; - } - case ECMA_TYPE_OBJECT: - { - ecma_object_t *obj_p = ecma_get_object_from_value (value); - - if (do_ref_if_object) - { - ecma_ref_object (obj_p); - } - - value_copy = value; - - break; - } - } - - return value_copy; -} /* ecma_copy_value */ - -/** - * Free the ecma-value - */ -void -ecma_free_value (ecma_value_t& value, /**< value description */ - bool do_deref_if_object) /**< if the value is object value, - decrement reference counter of the object */ -{ - switch (ecma_get_value_type_field (value)) - { - case ECMA_TYPE_SIMPLE: - { - /* doesn't hold additional memory */ - break; - } - - case ECMA_TYPE_NUMBER: - { - ecma_number_t *number_p = ecma_get_number_from_value (value); - ecma_dealloc_number (number_p); - break; - } - - case ECMA_TYPE_STRING: - { - ecma_string_t *string_p = ecma_get_string_from_value (value); - ecma_deref_ecma_string (string_p); - break; - } - - case ECMA_TYPE_OBJECT: - { - if (do_deref_if_object) - { - ecma_deref_object (ecma_get_object_from_value (value)); - } - break; - } - } -} /* ecma_free_value */ +extern ecma_number_t* __attribute_pure__ ecma_get_number_from_value (const ecma_value_t& value); +extern ecma_string_t* __attribute_pure__ ecma_get_string_from_value (const ecma_value_t& value); +extern ecma_object_t* __attribute_pure__ ecma_get_object_from_value (const ecma_value_t& value); +extern void ecma_copy_value (ecma_value_t &ret, const ecma_value_t& value, bool do_ref_if_object); +extern void ecma_free_value (ecma_value_t& value, bool do_deref_if_object); /** * Get type field of completion value * * @return type field */ -static ecma_completion_type_t __attribute_const__ +inline ecma_completion_type_t __attribute_const__ __attribute_always_inline__ ecma_get_completion_value_type_field (ecma_completion_value_t completion_value) /**< completion value */ { return (ecma_completion_type_t) jrt_extract_bit_field (completion_value, @@ -452,34 +366,21 @@ ecma_get_completion_value_type_field (ecma_completion_value_t completion_value) * * @return value field */ -static ecma_value_t __attribute_const__ -ecma_get_completion_value_value_field (ecma_completion_value_t completion_value) /**< completion value */ +inline void __attribute_always_inline__ +ecma_get_completion_value_value_field (ecma_value_t &ret, /**< out: ecma-value */ + ecma_completion_value_t completion_value) /**< completion value */ { - return (ecma_value_t) jrt_extract_bit_field (completion_value, - ECMA_COMPLETION_VALUE_VALUE_POS, - ECMA_COMPLETION_VALUE_VALUE_WIDTH); + ret = (ecma_value_packed_t) jrt_extract_bit_field (completion_value, + ECMA_COMPLETION_VALUE_VALUE_POS, + ECMA_COMPLETION_VALUE_VALUE_WIDTH); } /* ecma_get_completion_value_value_field */ -/** - * Get pointer to label descriptor from completion value - * - * @return pointer to label descriptor - */ -static ecma_label_descriptor_t* __attribute_const__ -ecma_get_completion_value_label_descriptor (ecma_completion_value_t completion_value) /**< completion value */ -{ - return ECMA_GET_NON_NULL_POINTER (ecma_label_descriptor_t, - (uintptr_t) jrt_extract_bit_field (completion_value, - ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS, - ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH)); -} /* ecma_get_completion_value_label_descriptor */ - /** * Set type field of completion value * * @return completion value with updated field */ -static ecma_completion_value_t __attribute_const__ +inline ecma_completion_value_t __attribute_const__ __attribute_always_inline__ ecma_set_completion_value_type_field (ecma_completion_value_t completion_value, /**< completion value * to set field in */ ecma_completion_type_t type_field) /**< new field value */ @@ -495,37 +396,17 @@ ecma_set_completion_value_type_field (ecma_completion_value_t completion_value, * * @return completion value with updated field */ -static ecma_completion_value_t __attribute_pure__ +inline ecma_completion_value_t __attribute_pure__ __attribute_always_inline__ ecma_set_completion_value_value_field (ecma_completion_value_t completion_value, /**< completion value * to set field in */ const ecma_value_t& value_field) /**< new field value */ { return (ecma_completion_value_t) jrt_set_bit_field_value (completion_value, - value_field, + (ecma_value_packed_t) value_field, ECMA_COMPLETION_VALUE_VALUE_POS, ECMA_COMPLETION_VALUE_VALUE_WIDTH); } /* ecma_set_completion_value_value_field */ -/** - * Set label descriptor of completion value - * - * @return completion value with updated field - */ -static ecma_completion_value_t __attribute_const__ -ecma_set_completion_value_label_descriptor (ecma_completion_value_t completion_value, /**< completion value - * to set field in */ - ecma_label_descriptor_t* label_desc_p) /**< pointer to the - * label descriptor */ -{ - uintptr_t label_desc_cp; - ECMA_SET_NON_NULL_POINTER (label_desc_cp, label_desc_p); - - return (ecma_completion_value_t) jrt_set_bit_field_value (completion_value, - label_desc_cp, - ECMA_COMPLETION_VALUE_LABEL_DESC_CP_POS, - ECMA_COMPLETION_VALUE_LABEL_DESC_CP_WIDTH); -} /* ecma_set_completion_value_label_descriptor */ - /** * Normal, throw, return, exit and meta completion values constructor * @@ -556,34 +437,9 @@ ecma_make_completion_value (ecma_completion_type_t type, /**< type */ return completion_value; } /* ecma_make_completion_value */ -/** - * Break and continue completion values constructor - * - * @return completion value - */ -ecma_completion_value_t __attribute_const__ -ecma_make_label_completion_value (ecma_completion_type_t type, /**< type */ - uint8_t depth_level, /**< depth level (in try constructions, - with blocks, etc.) */ - uint16_t offset) /**< offset to label from end of last block */ -{ - JERRY_ASSERT (type == ECMA_COMPLETION_TYPE_BREAK - || type == ECMA_COMPLETION_TYPE_CONTINUE); - - ecma_label_descriptor_t *label_desc_p = ecma_alloc_label_descriptor (); - label_desc_p->offset = offset; - label_desc_p->depth = depth_level; - - ecma_completion_value_t completion_value = 0; - - completion_value = ecma_set_completion_value_type_field (completion_value, - type); - completion_value = ecma_set_completion_value_label_descriptor (completion_value, - label_desc_p); - - return completion_value; -} /* ecma_make_label_completion_value */ - +extern ecma_completion_value_t ecma_make_label_completion_value (ecma_completion_type_t type, + uint8_t depth_level, + uint16_t offset); /** * Simple normal completion value constructor * @@ -598,7 +454,7 @@ ecma_make_simple_completion_value (ecma_simple_value_t simple_value) /**< simple || simple_value == ECMA_SIMPLE_VALUE_TRUE); return ecma_make_completion_value (ECMA_COMPLETION_TYPE_NORMAL, - ecma_make_simple_value (simple_value)); + ecma_value_t (simple_value)); } /* ecma_make_simple_completion_value */ /** @@ -629,21 +485,7 @@ ecma_make_throw_completion_value (const ecma_value_t& value) /**< value */ #endif /* !CONFIG_ECMA_EXCEPTION_SUPPORT */ } /* ecma_make_throw_completion_value */ -/** - * Throw completion value constructor. - * - * @return 'throw' completion value - */ -ecma_completion_value_t __attribute_const__ -ecma_make_throw_obj_completion_value (ecma_object_t *exception_p) /**< an object */ -{ - JERRY_ASSERT(exception_p != NULL - && !ecma_is_lexical_environment (exception_p)); - - ecma_value_t exception = ecma_make_object_value (exception_p); - - return ecma_make_throw_completion_value (exception); -} /* ecma_make_throw_obj_completion_value */ +extern ecma_completion_value_t ecma_make_throw_obj_completion_value (ecma_object_t *exception_p); /** * Empty completion value constructor. @@ -654,7 +496,7 @@ inline ecma_completion_value_t __attribute_const__ __attribute_always_inline__ ecma_make_empty_completion_value (void) { return ecma_make_completion_value (ECMA_COMPLETION_TYPE_NORMAL, - ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY)); + ecma_value_t ()); } /* ecma_make_empty_completion_value */ /** @@ -679,8 +521,8 @@ ecma_make_exit_completion_value (bool is_successful) /**< does completion value of script execution (true) or not (false) */ { return ecma_make_completion_value (ECMA_COMPLETION_TYPE_EXIT, - ecma_make_simple_value (is_successful ? ECMA_SIMPLE_VALUE_TRUE - : ECMA_SIMPLE_VALUE_FALSE)); + ecma_value_t (is_successful ? ECMA_SIMPLE_VALUE_TRUE + : ECMA_SIMPLE_VALUE_FALSE)); } /* ecma_make_exit_completion_value */ /** @@ -692,7 +534,7 @@ inline ecma_completion_value_t __attribute_const__ __attribute_always_inline__ ecma_make_meta_completion_value (void) { return ecma_make_completion_value (ECMA_COMPLETION_TYPE_META, - ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY)); + ecma_value_t (ECMA_SIMPLE_VALUE_EMPTY)); } /* ecma_make_meta_completion_value */ /** @@ -700,8 +542,9 @@ ecma_make_meta_completion_value (void) * * @return ecma-value */ -inline ecma_value_t __attribute_const__ __attribute_always_inline__ -ecma_get_completion_value_value (ecma_completion_value_t completion_value) /**< completion value */ +inline void __attribute_always_inline__ +ecma_get_completion_value_value (ecma_value_t &ret, /**< out: ecma-value */ + ecma_completion_value_t completion_value) /**< completion value */ { const ecma_completion_type_t type = ecma_get_completion_value_type_field (completion_value); @@ -714,101 +557,11 @@ ecma_get_completion_value_value (ecma_completion_value_t completion_value) /**< JERRY_ASSERT (is_type_ok); - return ecma_get_completion_value_value_field (completion_value); + ecma_get_completion_value_value_field (ret, completion_value); } /* ecma_get_completion_value_value */ -/** - * Get pointer to ecma-number from completion value - * - * @return pointer - */ -ecma_number_t* __attribute_const__ -ecma_get_number_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */ -{ - return ecma_get_number_from_value (ecma_get_completion_value_value (completion_value)); -} /* ecma_get_number_from_completion_value */ - -/** - * Get pointer to ecma-string from completion value - * - * @return pointer - */ -ecma_string_t* __attribute_const__ -ecma_get_string_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */ -{ - return ecma_get_string_from_value (ecma_get_completion_value_value (completion_value)); -} /* ecma_get_string_from_completion_value */ - -/** - * Get pointer to ecma-object from completion value - * - * @return pointer - */ -ecma_object_t* __attribute_const__ -ecma_get_object_from_completion_value (ecma_completion_value_t completion_value) /**< completion value */ -{ - return ecma_get_object_from_value (ecma_get_completion_value_value (completion_value)); -} /* ecma_get_object_from_completion_value */ - -/** - * Copy ecma-completion value. - * - * @return (source.type, ecma_copy_value (source.value), source.target). - */ -ecma_completion_value_t -ecma_copy_completion_value (ecma_completion_value_t value) /**< completion value */ -{ - const ecma_completion_type_t type = ecma_get_completion_value_type_field (value); - const bool is_type_ok = (type == ECMA_COMPLETION_TYPE_NORMAL -#ifdef CONFIG_ECMA_EXCEPTION_SUPPORT - || type == ECMA_COMPLETION_TYPE_THROW -#endif /* CONFIG_ECMA_EXCEPTION_SUPPORT */ - || type == ECMA_COMPLETION_TYPE_RETURN - || type == ECMA_COMPLETION_TYPE_EXIT); - - JERRY_ASSERT (is_type_ok); - - return ecma_make_completion_value (type, - ecma_copy_value (ecma_get_completion_value_value_field (value), - true)); -} /* ecma_copy_completion_value */ - -/** - * Free the completion value. - */ -void -ecma_free_completion_value (ecma_completion_value_t completion_value) /**< completion value */ -{ - switch (ecma_get_completion_value_type_field (completion_value)) - { - case ECMA_COMPLETION_TYPE_NORMAL: -#ifdef CONFIG_ECMA_EXCEPTION_SUPPORT - case ECMA_COMPLETION_TYPE_THROW: -#endif /* CONFIG_ECMA_EXCEPTION_SUPPORT */ - case ECMA_COMPLETION_TYPE_RETURN: - { - ecma_value_t v = ecma_get_completion_value_value_field (completion_value); - ecma_free_value (v, true); - break; - } - case ECMA_COMPLETION_TYPE_EXIT: - { - ecma_value_t v = ecma_get_completion_value_value_field (completion_value); - JERRY_ASSERT(ecma_get_value_type_field (v) == ECMA_TYPE_SIMPLE); - break; - } - case ECMA_COMPLETION_TYPE_CONTINUE: - case ECMA_COMPLETION_TYPE_BREAK: - { - ecma_dealloc_label_descriptor (ecma_get_completion_value_label_descriptor (completion_value)); - break; - } - case ECMA_COMPLETION_TYPE_META: - { - JERRY_UNREACHABLE (); - } - } -} /* ecma_free_completion_value */ +extern ecma_completion_value_t ecma_copy_completion_value (ecma_completion_value_t value); +extern void ecma_free_completion_value (ecma_completion_value_t completion_value); /** * Check if the completion value is normal value. @@ -863,7 +616,13 @@ ecma_is_completion_value_exit (ecma_completion_value_t value) /**< completion va { if (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_EXIT) { - JERRY_ASSERT (ecma_is_value_boolean (ecma_get_completion_value_value_field (value))); +#ifndef JERRY_NDEBUG + ecma_value_t v; + + ecma_get_completion_value_value_field (v, value); + + JERRY_ASSERT (ecma_is_value_boolean (v)); +#endif /* !JERRY_NDEBUG */ return true; } @@ -884,7 +643,13 @@ ecma_is_completion_value_meta (ecma_completion_value_t value) /**< completion va { if (ecma_get_completion_value_type_field (value) == ECMA_COMPLETION_TYPE_META) { - JERRY_ASSERT (ecma_is_value_empty (ecma_get_completion_value_value_field (value))); +#ifndef JERRY_NDEBUG + ecma_value_t v; + + ecma_get_completion_value_value_field (v, value); + + JERRY_ASSERT (ecma_is_value_empty (v)); +#endif /* !JERRY_NDEBUG */ return true; } @@ -969,11 +734,25 @@ ecma_is_completion_value_normal_false (ecma_completion_value_t value) /**< compl inline bool __attribute_const__ __attribute_always_inline__ ecma_is_completion_value_empty (ecma_completion_value_t value) /**< completion value */ { - return (ecma_is_completion_value_normal (value) - && ecma_is_value_empty (ecma_get_completion_value_value_field (value))); + if (ecma_is_completion_value_normal (value)) + { + ecma_value_t v; + + ecma_get_completion_value_value_field (v, value); + + return ecma_is_value_empty (v); + } + else + { + return false; + } } /* ecma_is_completion_value_empty */ +extern void ecma_check_value_type_is_spec_defined (const ecma_value_t& value); + /** * @} * @} */ + +#endif /* !ECMA_VALUE_H */ diff --git a/src/libecmaoperations/ecma-array-object.c b/src/libecmaoperations/ecma-array-object.c index a53c14f56..7492a3613 100644 --- a/src/libecmaoperations/ecma-array-object.c +++ b/src/libecmaoperations/ecma-array-object.c @@ -120,7 +120,7 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of ecma_property_t *length_prop_p = ecma_create_named_data_property (obj_p, length_magic_string_p, true, false, false); - ecma_set_named_data_property_value (length_prop_p, ecma_make_number_value (length_num_p)); + ecma_set_named_data_property_value (length_prop_p, ecma_value_t (length_num_p)); ecma_deref_ecma_string (length_magic_string_p); @@ -133,7 +133,7 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of ecma_property_descriptor_t item_prop_desc = ecma_make_empty_property_descriptor (); { item_prop_desc.is_value_defined = true; - item_prop_desc.value = array_items_p [index]; + item_prop_desc.value = (ecma_value_packed_t) array_items_p [index]; item_prop_desc.is_writable_defined = true; item_prop_desc.is_writable = true; @@ -153,7 +153,7 @@ ecma_op_create_array_object (const ecma_value_t *arguments_list_p, /**< list of ecma_deref_ecma_string (item_name_string_p); } - return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); + return ecma_make_normal_completion_value (ecma_value_t (obj_p)); } /* ecma_op_create_array_object */ /** @@ -181,7 +181,8 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o JERRY_ASSERT (len_prop_p != NULL && len_prop_p->type == ECMA_PROPERTY_NAMEDDATA); // 2. - ecma_value_t old_len_value = ecma_get_named_data_property_value (len_prop_p); + ecma_value_t old_len_value; + ecma_get_named_data_property_value (old_len_value, len_prop_p); ecma_number_t *num_p = ecma_get_number_from_value (old_len_value); uint32_t old_len_uint32 = ecma_number_to_uint32 (*num_p); @@ -204,18 +205,20 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o ecma_number_t new_len_num; // c. - ecma_completion_value_t completion = ecma_op_to_number (property_desc_p->value); - if (ecma_is_completion_value_throw (completion)) + ecma_completion_value_t prop_val_to_num_completion = ecma_op_to_number (ecma_value_t (property_desc_p->value)); + if (ecma_is_completion_value_throw (prop_val_to_num_completion)) { - return completion; + return prop_val_to_num_completion; } - JERRY_ASSERT (ecma_is_completion_value_normal (completion) - && ecma_is_value_number (ecma_get_completion_value_value (completion))); + JERRY_ASSERT (ecma_is_completion_value_normal (prop_val_to_num_completion)); - new_len_num = *ecma_get_number_from_completion_value (completion); + ecma_value_t new_len_value; + ecma_get_completion_value_value (new_len_value, prop_val_to_num_completion); - ecma_free_completion_value (completion); + new_len_num = *ecma_get_number_from_value (new_len_value); + + ecma_free_completion_value (prop_val_to_num_completion); uint32_t new_len_uint32 = ecma_number_to_uint32 (new_len_num); @@ -231,7 +234,7 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o *new_len_num_p = new_len_num; ecma_property_descriptor_t new_len_property_desc = *property_desc_p; - new_len_property_desc.value = ecma_make_number_value (new_len_num_p); + new_len_property_desc.value = (ecma_value_packed_t) ecma_value_t (new_len_num_p); ecma_completion_value_t ret_value; @@ -311,9 +314,10 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o // iii if (ecma_is_completion_value_normal_false (delete_succeeded)) { - JERRY_ASSERT (ecma_is_value_number (new_len_property_desc.value)); + ecma_value_t new_len_value (new_len_property_desc.value); + JERRY_ASSERT (ecma_is_value_number (new_len_value)); - ecma_number_t *new_len_num_p = ecma_get_number_from_value (new_len_property_desc.value); + ecma_number_t *new_len_num_p = ecma_get_number_from_value (new_len_value); // 1. *new_len_num_p = ecma_uint32_to_number (old_len_uint32 + 1); @@ -444,7 +448,7 @@ ecma_op_array_object_define_own_property (ecma_object_t *obj_p, /**< the array o ecma_number_t *num_p = ecma_alloc_number (); *num_p = ecma_number_add (ecma_uint32_to_number (index), ECMA_NUMBER_ONE); - ecma_named_data_property_assign_value (obj_p, len_prop_p, ecma_make_number_value (num_p)); + ecma_named_data_property_assign_value (obj_p, len_prop_p, ecma_value_t (num_p)); ecma_dealloc_number (num_p); } diff --git a/src/libecmaoperations/ecma-array-object.h b/src/libecmaoperations/ecma-array-object.h index 2566edf13..d04191aaa 100644 --- a/src/libecmaoperations/ecma-array-object.h +++ b/src/libecmaoperations/ecma-array-object.h @@ -17,6 +17,7 @@ #define ECMA_ARRAY_OBJECT_H #include "ecma-globals.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/libecmaoperations/ecma-boolean-object.c b/src/libecmaoperations/ecma-boolean-object.c index bde3f9b1b..ef6e8e85c 100644 --- a/src/libecmaoperations/ecma-boolean-object.c +++ b/src/libecmaoperations/ecma-boolean-object.c @@ -48,7 +48,7 @@ ecma_op_create_boolean_object (const ecma_value_t& arg) /**< argument passed to return conv_to_boolean_completion; } - ecma_simple_value_t bool_value = (ecma_is_value_true (ecma_get_completion_value_value (conv_to_boolean_completion)) ? + ecma_simple_value_t bool_value = (ecma_is_completion_value_normal_true (conv_to_boolean_completion) ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE); #ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_BOOLEAN_BUILTIN @@ -69,5 +69,5 @@ ecma_op_create_boolean_object (const ecma_value_t& arg) /**< argument passed to ECMA_INTERNAL_PROPERTY_PRIMITIVE_BOOLEAN_VALUE); prim_value_prop_p->u.internal_property.value = bool_value; - return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); + return ecma_make_normal_completion_value (ecma_value_t (obj_p)); } /* ecma_op_create_boolean_object */ diff --git a/src/libecmaoperations/ecma-boolean-object.h b/src/libecmaoperations/ecma-boolean-object.h index f3a58eb37..3cd8b112e 100644 --- a/src/libecmaoperations/ecma-boolean-object.h +++ b/src/libecmaoperations/ecma-boolean-object.h @@ -17,6 +17,7 @@ #define ECMA_BOOLEAN_OBJECT_H #include "ecma-globals.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/libecmaoperations/ecma-comparison.h b/src/libecmaoperations/ecma-comparison.h index eba9e1733..ae4213d04 100644 --- a/src/libecmaoperations/ecma-comparison.h +++ b/src/libecmaoperations/ecma-comparison.h @@ -18,6 +18,7 @@ #include "ecma-globals.h" #include "ecma-helpers.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/libecmaoperations/ecma-conversion.c b/src/libecmaoperations/ecma-conversion.c index b2a327930..36df7d1b0 100644 --- a/src/libecmaoperations/ecma-conversion.c +++ b/src/libecmaoperations/ecma-conversion.c @@ -170,7 +170,10 @@ ecma_op_to_primitive (const ecma_value_t& value, /**< ecma-value */ } else { - return ecma_make_normal_completion_value (ecma_copy_value (value, true)); + ecma_value_t value_copy; + ecma_copy_value (value_copy, value, true); + + return ecma_make_normal_completion_value (value_copy); } } /* ecma_op_to_primitive */ @@ -254,7 +257,10 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */ if (ecma_is_value_number (value)) { - return ecma_make_normal_completion_value (ecma_copy_value (value, true)); + ecma_value_t value_copy; + ecma_copy_value (value_copy, value, true); + + return ecma_make_normal_completion_value (value_copy); } else if (ecma_is_value_string (value)) { @@ -263,7 +269,7 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */ ecma_number_t *num_p = ecma_alloc_number (); *num_p = ecma_string_to_number (str_p); - return ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + return ecma_make_normal_completion_value (ecma_value_t (num_p)); } else if (ecma_is_value_object (value)) { @@ -305,7 +311,7 @@ ecma_op_to_number (const ecma_value_t& value) /**< ecma-value */ } } - return ecma_make_normal_completion_value (ecma_make_number_value (num_p)); + return ecma_make_normal_completion_value (ecma_value_t (num_p)); } } /* ecma_op_to_number */ @@ -373,7 +379,7 @@ ecma_op_to_string (const ecma_value_t& value) /**< ecma-value */ } } - return ecma_make_normal_completion_value (ecma_make_string_value (res_p)); + return ecma_make_normal_completion_value (ecma_value_t (res_p)); } } /* ecma_op_to_string */ @@ -401,7 +407,10 @@ ecma_op_to_object (const ecma_value_t& value) /**< ecma-value */ } else if (ecma_is_value_object (value)) { - return ecma_make_normal_completion_value (ecma_copy_value (value, true)); + ecma_value_t value_copy; + ecma_copy_value (value_copy, value, true); + + return ecma_make_normal_completion_value (value_copy); } else { @@ -467,7 +476,7 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des // b. const bool is_writable = (src_prop_desc_p->is_writable); - prop_desc.value = ecma_make_simple_value (is_writable ? ECMA_SIMPLE_VALUE_TRUE + prop_desc.value = (ecma_value_packed_t) ecma_value_t (is_writable ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE); ecma_string_t *writable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_WRITABLE); @@ -486,11 +495,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des // a. if (src_prop_desc_p->get_p == NULL) { - prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED); } else { - prop_desc.value = ecma_make_object_value (src_prop_desc_p->get_p); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (src_prop_desc_p->get_p); } ecma_string_t *get_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_GET); @@ -504,11 +513,11 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des // b. if (src_prop_desc_p->set_p == NULL) { - prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED); } else { - prop_desc.value = ecma_make_object_value (src_prop_desc_p->set_p); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (src_prop_desc_p->set_p); } ecma_string_t *set_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_SET); @@ -521,8 +530,8 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des } const bool is_enumerable = src_prop_desc_p->is_enumerable; - prop_desc.value = ecma_make_simple_value (is_enumerable ? ECMA_SIMPLE_VALUE_TRUE - : ECMA_SIMPLE_VALUE_FALSE); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (is_enumerable ? ECMA_SIMPLE_VALUE_TRUE + : ECMA_SIMPLE_VALUE_FALSE); ecma_string_t *enumerable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_ENUMERABLE); completion = ecma_op_object_define_own_property (obj_p, @@ -533,8 +542,8 @@ ecma_op_from_property_descriptor (const ecma_property_descriptor_t* src_prop_des JERRY_ASSERT (ecma_is_completion_value_normal_true (completion)); const bool is_configurable = src_prop_desc_p->is_configurable; - prop_desc.value = ecma_make_simple_value (is_configurable ? ECMA_SIMPLE_VALUE_TRUE - : ECMA_SIMPLE_VALUE_FALSE); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (is_configurable ? ECMA_SIMPLE_VALUE_TRUE + : ECMA_SIMPLE_VALUE_FALSE); ecma_string_t *configurable_magic_string_p = ecma_get_magic_string (ECMA_MAGIC_STRING_CONFIGURABLE); completion = ecma_op_object_define_own_property (obj_p, @@ -654,8 +663,11 @@ ecma_op_to_property_descriptor (const ecma_value_t& obj_value, /**< object value ecma_op_object_get (obj_p, value_magic_string_p), ret_value); + ecma_value_t value_copy; + ecma_copy_value (value_copy, value_prop_value, true); + prop_desc.is_value_defined = true; - prop_desc.value = ecma_copy_value (value_prop_value, true); + prop_desc.value = (ecma_value_packed_t) value_copy; ECMA_FINALIZE (value_prop_value); } diff --git a/src/libecmaoperations/ecma-conversion.h b/src/libecmaoperations/ecma-conversion.h index 9ce911c51..d03ce6a75 100644 --- a/src/libecmaoperations/ecma-conversion.h +++ b/src/libecmaoperations/ecma-conversion.h @@ -18,6 +18,7 @@ #include "ecma-globals.h" #include "ecma-helpers.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/libecmaoperations/ecma-exceptions.c b/src/libecmaoperations/ecma-exceptions.c index cf6d1d68a..3f86bc4bf 100644 --- a/src/libecmaoperations/ecma-exceptions.c +++ b/src/libecmaoperations/ecma-exceptions.c @@ -1,4 +1,4 @@ -/* Copyright 2014 Samsung Electronics Co., Ltd. +/* Copyright 2014-2015 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -124,7 +124,7 @@ ecma_new_standard_error_with_message (ecma_standard_error_t error_type, /**< nat true, false, true); ecma_set_named_data_property_value (prop_p, - ecma_make_string_value (ecma_copy_or_ref_ecma_string (message_string_p))); + ecma_value_t (ecma_copy_or_ref_ecma_string (message_string_p))); ecma_deref_ecma_string (message_magic_string_p); return new_error_obj_p; diff --git a/src/libecmaoperations/ecma-function-object.c b/src/libecmaoperations/ecma-function-object.c index 39d059d46..6a5f9402d 100644 --- a/src/libecmaoperations/ecma-function-object.c +++ b/src/libecmaoperations/ecma-function-object.c @@ -190,7 +190,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f // 15. ecma_property_descriptor_t length_prop_desc = ecma_make_empty_property_descriptor (); length_prop_desc.is_value_defined = true; - length_prop_desc.value = ecma_make_number_value (len_p); + length_prop_desc.value = (ecma_value_packed_t) ecma_value_t (len_p); ecma_string_t* magic_string_length_p = ecma_get_magic_string (ECMA_MAGIC_STRING_LENGTH); ecma_completion_value_t completion = ecma_op_object_define_own_property (f, @@ -212,7 +212,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor (); { prop_desc.is_value_defined = true; - prop_desc.value = ecma_make_object_value (f); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (f); prop_desc.is_writable_defined = true; prop_desc.is_writable = true; @@ -232,7 +232,7 @@ ecma_op_create_function_object (ecma_string_t* formal_parameter_list_p[], /**< f ecma_deref_ecma_string (magic_string_constructor_p); // 18. - prop_desc.value = ecma_make_object_value (proto_p); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (proto_p); prop_desc.is_configurable = false; ecma_string_t *magic_string_prototype_p = ecma_get_magic_string (ECMA_MAGIC_STRING_PROTOTYPE); ecma_op_object_define_own_property (f, @@ -319,12 +319,8 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio n < formal_parameters_count; n++) { - ecma_value_t v; - if (n >= arguments_list_len) - { - v = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); - } - else + ecma_value_t v (ECMA_SIMPLE_VALUE_UNDEFINED); + if (n < arguments_list_len) { v = arguments_list_p[n]; } @@ -332,7 +328,7 @@ ecma_function_call_setup_args_variables (ecma_object_t *func_obj_p, /**< Functio bool is_moved = ecma_collection_iterator_next (&formal_params_iterator); JERRY_ASSERT (is_moved); - ecma_value_t formal_parameter_name_value = *formal_params_iterator.current_value_p; + ecma_value_t formal_parameter_name_value (*formal_params_iterator.current_value_p); ecma_string_t *formal_parameter_name_string_p = ecma_get_string_from_value (formal_parameter_name_value); bool arg_already_declared = ecma_op_has_binding (env_p, formal_parameter_name_string_p); @@ -463,7 +459,7 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */ { JERRY_ASSERT(func_obj_p != NULL && !ecma_is_lexical_environment (func_obj_p)); - JERRY_ASSERT(ecma_op_is_callable (ecma_make_object_value (func_obj_p))); + JERRY_ASSERT(ecma_op_is_callable (ecma_value_t (func_obj_p))); JERRY_ASSERT(arguments_list_len == 0 || arguments_list_p != NULL); if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION) @@ -492,21 +488,21 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */ // 1. if (is_strict) { - this_binding = ecma_copy_value (this_arg_value, true); + ecma_copy_value (this_binding, this_arg_value, true); } else if (ecma_is_value_undefined (this_arg_value) || ecma_is_value_null (this_arg_value)) { // 2. - this_binding = ecma_make_object_value (ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL)); + this_binding = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL); } else { // 3., 4. - ecma_completion_value_t completion = ecma_op_to_object (this_arg_value); - JERRY_ASSERT (ecma_is_completion_value_normal (completion)); + ecma_completion_value_t to_obj_completion = ecma_op_to_object (this_arg_value); + JERRY_ASSERT (ecma_is_completion_value_normal (to_obj_completion)); - this_binding = ecma_get_completion_value_value (completion); + ecma_get_completion_value_value (this_binding, to_obj_completion); } // 5. @@ -521,18 +517,21 @@ ecma_op_function_call (ecma_object_t *func_obj_p, /**< Function object */ is_strict), ret_value); - ecma_completion_value_t completion = run_int_from_pos (code_first_opcode_idx, - this_binding, - local_env_p, - is_strict, - false); - if (ecma_is_completion_value_return (completion)) + ecma_completion_value_t run_completion = run_int_from_pos (code_first_opcode_idx, + this_binding, + local_env_p, + is_strict, + false); + if (ecma_is_completion_value_return (run_completion)) { - ret_value = ecma_make_normal_completion_value (ecma_get_completion_value_value (completion)); + ecma_value_t value_to_ret; + ecma_get_completion_value_value (value_to_ret, run_completion); + + ret_value = ecma_make_normal_completion_value (value_to_ret); } else { - ret_value = completion; + ret_value = run_completion; } ECMA_FINALIZE (args_var_declaration_ret); @@ -569,7 +568,7 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */ { JERRY_ASSERT(func_obj_p != NULL && !ecma_is_lexical_environment (func_obj_p)); - JERRY_ASSERT(ecma_is_constructor (ecma_make_object_value (func_obj_p))); + JERRY_ASSERT(ecma_is_constructor (ecma_value_t (func_obj_p))); JERRY_ASSERT(arguments_list_len == 0 || arguments_list_p != NULL); if (ecma_get_object_type (func_obj_p) == ECMA_OBJECT_TYPE_FUNCTION) @@ -614,7 +613,7 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */ // 8. ECMA_TRY_CATCH (call_completion, ecma_op_function_call (func_obj_p, - ecma_make_object_value (obj_p), + ecma_value_t (obj_p), arguments_list_p, arguments_list_len), ret_value); @@ -626,12 +625,12 @@ ecma_op_function_construct (ecma_object_t *func_obj_p, /**< Function object */ { ecma_deref_object (obj_p); - obj_value = ecma_copy_value (call_completion, true); + ecma_copy_value (obj_value, call_completion, true); } else { // 10. - obj_value = ecma_make_object_value (obj_p); + obj_value = obj_p; } ret_value = ecma_make_normal_completion_value (obj_value); @@ -701,7 +700,7 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment ecma_property_descriptor_t property_desc = ecma_make_empty_property_descriptor (); { property_desc.is_value_defined = true; - property_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); + property_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED); property_desc.is_writable_defined = true; property_desc.is_writable = true; @@ -749,7 +748,7 @@ ecma_op_function_declaration (ecma_object_t *lex_env_p, /**< lexical environment // f. ret_value = ecma_op_set_mutable_binding (lex_env_p, function_name_p, - ecma_make_object_value (func_obj_p), + ecma_value_t (func_obj_p), is_strict); } diff --git a/src/libecmaoperations/ecma-function-object.h b/src/libecmaoperations/ecma-function-object.h index 6885a48b2..a2131ac6b 100644 --- a/src/libecmaoperations/ecma-function-object.h +++ b/src/libecmaoperations/ecma-function-object.h @@ -17,6 +17,7 @@ #define ECMA_FUNCTION_OBJECT_H #include "ecma-globals.h" +#include "ecma-value.h" #include "interpreter.h" /** \addtogroup ecma ECMA diff --git a/src/libecmaoperations/ecma-get-put-value.c b/src/libecmaoperations/ecma-get-put-value.c index 460872c85..67debcedb 100644 --- a/src/libecmaoperations/ecma-get-put-value.c +++ b/src/libecmaoperations/ecma-get-put-value.c @@ -75,9 +75,9 @@ ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, /**< referenc * Returned value must be freed with ecma_free_completion_value. */ ecma_completion_value_t -ecma_op_get_value_object_base (ecma_reference_t ref) /**< ECMA-reference */ +ecma_op_get_value_object_base (const ecma_reference_t& ref) /**< ECMA-reference */ { - const ecma_value_t base = ref.base; + const ecma_value_t& base = ref.base; const bool is_unresolvable_reference = ecma_is_value_undefined (base); const bool has_primitive_base = (ecma_is_value_boolean (base) || ecma_is_value_number (base) @@ -203,10 +203,10 @@ ecma_reject_put (bool is_throw) /**< Throw flag */ * Returned value must be freed with ecma_free_completion_value. */ ecma_completion_value_t -ecma_op_put_value_object_base (ecma_reference_t ref, /**< ECMA-reference */ +ecma_op_put_value_object_base (const ecma_reference_t& ref, /**< ECMA-reference */ const ecma_value_t& value) /**< ECMA-value */ { - const ecma_value_t base = ref.base; + const ecma_value_t& base = ref.base; const bool is_unresolvable_reference = ecma_is_value_undefined (base); const bool has_primitive_base = (ecma_is_value_boolean (base) || ecma_is_value_number (base) diff --git a/src/libecmaoperations/ecma-lex-env.c b/src/libecmaoperations/ecma-lex-env.c index c51bba6b5..415eaf095 100644 --- a/src/libecmaoperations/ecma-lex-env.c +++ b/src/libecmaoperations/ecma-lex-env.c @@ -93,7 +93,7 @@ ecma_op_create_mutable_binding (ecma_object_t *lex_env_p, /**< lexical environme ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor (); { prop_desc.is_value_defined = true; - prop_desc.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED); prop_desc.is_writable_defined = true; prop_desc.is_writable = true; @@ -241,7 +241,8 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */ ecma_property_t *property_p = ecma_get_named_data_property (lex_env_p, name_p); - ecma_value_t prop_value = ecma_get_named_data_property_value (property_p); + ecma_value_t prop_value; + ecma_get_named_data_property_value (prop_value, property_p); /* is the binding mutable? */ if (!ecma_is_property_writable (property_p) @@ -258,7 +259,10 @@ ecma_op_get_binding_value (ecma_object_t *lex_env_p, /**< lexical environment */ } } - return ecma_make_normal_completion_value (ecma_copy_value (prop_value, true)); + ecma_value_t prop_value_copy; + ecma_copy_value (prop_value_copy, prop_value, true); + + return ecma_make_normal_completion_value (prop_value_copy); } else { @@ -364,7 +368,7 @@ ecma_op_implicit_this_value (ecma_object_t *lex_env_p) /**< lexical environment ecma_object_t *binding_obj_p = ecma_get_lex_env_binding_object (lex_env_p); ecma_ref_object (binding_obj_p); - return ecma_make_normal_completion_value (ecma_make_object_value (binding_obj_p)); + return ecma_make_normal_completion_value (ecma_value_t (binding_obj_p)); } else { @@ -394,10 +398,15 @@ ecma_op_create_immutable_binding (ecma_object_t *lex_env_p, /**< lexical environ name_p, false, false, false); - JERRY_ASSERT(ecma_is_value_undefined (ecma_get_named_data_property_value (prop_p))); +#ifndef JERRY_NDEBUG + ecma_value_t prop_value; + ecma_get_named_data_property_value (prop_value, prop_p); + + JERRY_ASSERT(ecma_is_value_undefined (prop_value)); +#endif /* !JERRY_NDEBUG */ ecma_set_named_data_property_value (prop_p, - ecma_make_simple_value (ECMA_SIMPLE_VALUE_EMPTY)); + ecma_value_t (ECMA_SIMPLE_VALUE_EMPTY)); } /* ecma_op_create_immutable_binding */ /** @@ -416,9 +425,12 @@ ecma_op_initialize_immutable_binding (ecma_object_t *lex_env_p, /**< lexical env ecma_property_t *prop_p = ecma_get_named_data_property (lex_env_p, name_p); + ecma_value_t prop_value; + ecma_get_named_data_property_value (prop_value, prop_p); + /* The binding must be unitialized immutable binding */ - JERRY_ASSERT(!ecma_is_property_writable (prop_p) - && ecma_is_value_empty (ecma_get_named_data_property_value (prop_p))); + JERRY_ASSERT (!ecma_is_property_writable (prop_p) + && ecma_is_value_empty (prop_value)); ecma_named_data_property_assign_value (lex_env_p, prop_p, value); } /* ecma_op_initialize_immutable_binding */ diff --git a/src/libecmaoperations/ecma-lex-env.h b/src/libecmaoperations/ecma-lex-env.h index 3828c83a8..dd5c19037 100644 --- a/src/libecmaoperations/ecma-lex-env.h +++ b/src/libecmaoperations/ecma-lex-env.h @@ -18,6 +18,7 @@ #include "ecma-globals.h" #include "ecma-reference.h" +#include "ecma-value.h" #include "globals.h" /** \addtogroup ecma ECMA @@ -33,12 +34,12 @@ extern ecma_completion_value_t ecma_op_get_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, ecma_string_t *var_name_string_p, bool is_strict); -extern ecma_completion_value_t ecma_op_get_value_object_base (ecma_reference_t ref); +extern ecma_completion_value_t ecma_op_get_value_object_base (const ecma_reference_t& ref); extern ecma_completion_value_t ecma_op_put_value_lex_env_base (ecma_object_t *ref_base_lex_env_p, ecma_string_t *var_name_string_p, bool is_strict, const ecma_value_t& value); -extern ecma_completion_value_t ecma_op_put_value_object_base (ecma_reference_t ref, +extern ecma_completion_value_t ecma_op_put_value_object_base (const ecma_reference_t& ref, const ecma_value_t& value); /* ECMA-262 v5, Table 17. Abstract methods of Environment Records */ diff --git a/src/libecmaoperations/ecma-number-object.c b/src/libecmaoperations/ecma-number-object.c index 3c9c4baec..6be4462d9 100644 --- a/src/libecmaoperations/ecma-number-object.c +++ b/src/libecmaoperations/ecma-number-object.c @@ -41,14 +41,17 @@ ecma_completion_value_t ecma_op_create_number_object (const ecma_value_t& arg) /**< argument passed to the Number constructor */ { - ecma_completion_value_t conv_to_num_completion = ecma_op_to_number (arg); + ecma_completion_value_t to_num_completion = ecma_op_to_number (arg); - if (!ecma_is_completion_value_normal (conv_to_num_completion)) + if (!ecma_is_completion_value_normal (to_num_completion)) { - return conv_to_num_completion; + return to_num_completion; } - ecma_number_t *prim_value_p = ecma_get_number_from_completion_value (conv_to_num_completion); + ecma_value_t num_value; + ecma_get_completion_value_value (num_value, to_num_completion); + + ecma_number_t *prim_value_p = ecma_get_number_from_value (num_value); #ifndef CONFIG_ECMA_COMPACT_PROFILE_DISABLE_NUMBER_BUILTIN ecma_object_t *prototype_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_NUMBER_PROTOTYPE); @@ -68,5 +71,5 @@ ecma_op_create_number_object (const ecma_value_t& arg) /**< argument passed to t ECMA_INTERNAL_PROPERTY_PRIMITIVE_NUMBER_VALUE); ECMA_SET_POINTER (prim_value_prop_p->u.internal_property.value, prim_value_p); - return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); + return ecma_make_normal_completion_value (ecma_value_t (obj_p)); } /* ecma_op_create_number_object */ diff --git a/src/libecmaoperations/ecma-number-object.h b/src/libecmaoperations/ecma-number-object.h index c1960e498..bf43ff6c0 100644 --- a/src/libecmaoperations/ecma-number-object.h +++ b/src/libecmaoperations/ecma-number-object.h @@ -17,6 +17,7 @@ #define ECMA_NUMBER_OBJECT_H #include "ecma-globals.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/libecmaoperations/ecma-objects-arguments.c b/src/libecmaoperations/ecma-objects-arguments.c index 808feecfa..5cf9ef3b1 100644 --- a/src/libecmaoperations/ecma-objects-arguments.c +++ b/src/libecmaoperations/ecma-objects-arguments.c @@ -69,7 +69,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */ ecma_property_descriptor_t prop_desc = ecma_make_empty_property_descriptor (); { prop_desc.is_value_defined = true; - prop_desc.value = ecma_make_number_value (len_p); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (len_p); prop_desc.is_writable_defined = true; prop_desc.is_writable = true; @@ -98,7 +98,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */ prop_desc = ecma_make_empty_property_descriptor (); { prop_desc.is_value_defined = true; - prop_desc.value = arguments_list_p[indx]; + prop_desc.value = (ecma_value_packed_t) arguments_list_p[indx]; prop_desc.is_writable_defined = true; prop_desc.is_writable = true; @@ -141,8 +141,9 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */ JERRY_ASSERT (formal_params_iter_p->current_value_p != NULL); JERRY_ASSERT (param_index < formal_params_number); - JERRY_ASSERT (ecma_is_value_string (*formal_params_iter_p->current_value_p)); - formal_params[param_index] = ecma_get_string_from_value (*formal_params_iter_p->current_value_p); + ecma_value_t string_value (*formal_params_iter_p->current_value_p); + JERRY_ASSERT (ecma_is_value_string (string_value)); + formal_params[param_index] = ecma_get_string_from_value (string_value); } JERRY_ASSERT (param_index == formal_params_number); @@ -172,7 +173,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */ prop_desc = ecma_make_empty_property_descriptor (); { prop_desc.is_value_defined = true; - prop_desc.value = ecma_make_string_value (name_p); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (name_p); } completion = ecma_op_object_define_own_property (map_p, @@ -209,7 +210,7 @@ ecma_create_arguments_object (ecma_object_t *func_obj_p, /**< callee function */ prop_desc = ecma_make_empty_property_descriptor (); { prop_desc.is_value_defined = true; - prop_desc.value = ecma_make_object_value (func_obj_p); + prop_desc.value = (ecma_value_packed_t) ecma_value_t (func_obj_p); prop_desc.is_writable_defined = true; prop_desc.is_writable = true; @@ -286,7 +287,8 @@ ecma_arguments_get_mapped_arg_value (ecma_object_t *map_p, /**< [[ParametersMap] JERRY_ASSERT(lex_env_p != NULL && ecma_is_lexical_environment (lex_env_p)); - ecma_value_t arg_name_prop_value = ecma_get_named_data_property_value (arg_name_prop_p); + ecma_value_t arg_name_prop_value; + ecma_get_named_data_property_value (arg_name_prop_value, arg_name_prop_p); ecma_string_t *arg_name_p = ecma_get_string_from_value (arg_name_prop_value); @@ -370,11 +372,14 @@ ecma_op_arguments_object_get_own_property (ecma_object_t *obj_p, /**< the object if (mapped_prop_p != NULL) { // a. - ecma_completion_value_t completion = ecma_arguments_get_mapped_arg_value (map_p, mapped_prop_p); + ecma_completion_value_t get_mapped_arg_completion = ecma_arguments_get_mapped_arg_value (map_p, mapped_prop_p); - ecma_named_data_property_assign_value (obj_p, desc_p, ecma_get_completion_value_value (completion)); + ecma_value_t value_to_assign; + ecma_get_completion_value_value (value_to_assign, get_mapped_arg_completion); - ecma_free_completion_value (completion); + ecma_named_data_property_assign_value (obj_p, desc_p, value_to_assign); + + ecma_free_completion_value (get_mapped_arg_completion); } // 6. @@ -441,7 +446,7 @@ ecma_op_arguments_object_define_own_property (ecma_object_t *obj_p, /**< the obj { completion = ecma_op_object_put (map_p, property_name_p, - property_desc_p->value, + ecma_value_t (property_desc_p->value), is_throw); } diff --git a/src/libecmaoperations/ecma-objects-arguments.h b/src/libecmaoperations/ecma-objects-arguments.h index ebe558aa4..6d4789eae 100644 --- a/src/libecmaoperations/ecma-objects-arguments.h +++ b/src/libecmaoperations/ecma-objects-arguments.h @@ -18,6 +18,7 @@ #include "ecma-globals.h" #include "ecma-helpers.h" +#include "ecma-value.h" extern ecma_object_t* ecma_create_arguments_object (ecma_object_t *func_obj_p, diff --git a/src/libecmaoperations/ecma-objects-general.c b/src/libecmaoperations/ecma-objects-general.c index a4d2aaef9..6c8b611d6 100644 --- a/src/libecmaoperations/ecma-objects-general.c +++ b/src/libecmaoperations/ecma-objects-general.c @@ -100,7 +100,7 @@ ecma_op_create_object_object_arg (const ecma_value_t& value) /**< argument of co ecma_object_t *obj_p = ecma_op_create_object_object_noarg (); - return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); + return ecma_make_normal_completion_value (ecma_value_t (obj_p)); } } /* ecma_op_create_object_object_arg */ @@ -134,8 +134,13 @@ ecma_op_general_object_get (ecma_object_t *obj_p, /**< the object */ // 3. if (prop_p->type == ECMA_PROPERTY_NAMEDDATA) { - return ecma_make_normal_completion_value (ecma_copy_value (ecma_get_named_data_property_value (prop_p), - true)); + ecma_value_t prop_value; + ecma_get_named_data_property_value (prop_value, prop_p); + + ecma_value_t prop_value_copy; + ecma_copy_value (prop_value_copy, prop_value, true); + + return ecma_make_normal_completion_value (prop_value_copy); } else { @@ -151,7 +156,7 @@ ecma_op_general_object_get (ecma_object_t *obj_p, /**< the object */ else { return ecma_op_function_call (getter_p, - ecma_make_object_value (obj_p), + ecma_value_t (obj_p), NULL, 0); } @@ -268,7 +273,7 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */ ecma_property_descriptor_t value_desc = ecma_make_empty_property_descriptor (); { value_desc.is_value_defined = true; - value_desc.value = value; + value_desc.value = (ecma_value_packed_t) value; } // b., c. @@ -294,7 +299,7 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */ ECMA_TRY_CATCH (call_ret, ecma_op_function_call (setter_p, - ecma_make_object_value (obj_p), + ecma_value_t (obj_p), &value, 1), ret_value); @@ -313,7 +318,7 @@ ecma_op_general_object_put (ecma_object_t *obj_p, /**< the object */ ecma_property_descriptor_t new_desc = ecma_make_empty_property_descriptor (); { new_desc.is_value_defined = true; - new_desc.value = value; + new_desc.value = (ecma_value_packed_t) value; new_desc.is_writable_defined = true; new_desc.is_writable = true; @@ -548,12 +553,15 @@ ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */ ecma_completion_value_t call_completion = ecma_make_empty_completion_value (); - if (ecma_op_is_callable (ecma_get_completion_value_value (function_value_get_completion))) + ecma_value_t function_value_get; + ecma_get_completion_value_value (function_value_get, function_value_get_completion); + + if (ecma_op_is_callable (function_value_get)) { - ecma_object_t *func_obj_p = ecma_get_object_from_completion_value (function_value_get_completion); + ecma_object_t *func_obj_p = ecma_get_object_from_value (function_value_get); call_completion = ecma_op_function_call (func_obj_p, - ecma_make_object_value (obj_p), + ecma_value_t (obj_p), NULL, 0); } @@ -564,10 +572,15 @@ ecma_op_general_object_default_value (ecma_object_t *obj_p, /**< the object */ return call_completion; } - if (!ecma_is_completion_value_empty (call_completion) - && !ecma_is_value_object (ecma_get_completion_value_value (call_completion))) + if (!ecma_is_completion_value_empty (call_completion)) { - return call_completion; + ecma_value_t call_ret_value; + ecma_get_completion_value_value (call_ret_value, call_completion); + + if (!ecma_is_value_object (call_ret_value)) + { + return call_completion; + } } ecma_free_completion_value (call_completion); @@ -632,7 +645,7 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec property_desc_p->is_enumerable, property_desc_p->is_configurable); - ecma_named_data_property_assign_value (obj_p, new_prop_p, property_desc_p->value); + ecma_named_data_property_assign_value (obj_p, new_prop_p, ecma_value_t (property_desc_p->value)); } else { @@ -668,9 +681,12 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec bool is_every_field_in_desc_also_occurs_in_current_desc_with_same_value = true; if (property_desc_p->is_value_defined) { + ecma_value_t prop_value; + ecma_get_named_data_property_value (prop_value, current_p); + if (!is_current_data_descriptor - || !ecma_op_same_value (property_desc_p->value, - ecma_get_named_data_property_value (current_p))) + || !ecma_op_same_value (ecma_value_t (property_desc_p->value), + prop_value)) { is_every_field_in_desc_also_occurs_in_current_desc_with_same_value = false; } @@ -791,9 +807,12 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec } // ii. + ecma_value_t prop_value; + ecma_get_named_data_property_value (prop_value, current_p); + if (property_desc_p->is_value_defined - && !ecma_op_same_value (property_desc_p->value, - ecma_get_named_data_property_value (current_p))) + && !ecma_op_same_value (ecma_value_t (property_desc_p->value), + prop_value)) { return ecma_reject (is_throw); } @@ -828,7 +847,7 @@ ecma_op_general_object_define_own_property (ecma_object_t *obj_p, /**< the objec { JERRY_ASSERT(is_current_data_descriptor); - ecma_named_data_property_assign_value (obj_p, current_p, property_desc_p->value); + ecma_named_data_property_assign_value (obj_p, current_p, ecma_value_t (property_desc_p->value)); } if (property_desc_p->is_writable_defined) diff --git a/src/libecmaoperations/ecma-objects-general.h b/src/libecmaoperations/ecma-objects-general.h index a3cf38b3a..72ca74979 100644 --- a/src/libecmaoperations/ecma-objects-general.h +++ b/src/libecmaoperations/ecma-objects-general.h @@ -18,6 +18,7 @@ #include "ecma-conversion.h" #include "ecma-globals.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/libecmaoperations/ecma-objects.h b/src/libecmaoperations/ecma-objects.h index 776b4fdc5..2b225889f 100644 --- a/src/libecmaoperations/ecma-objects.h +++ b/src/libecmaoperations/ecma-objects.h @@ -18,6 +18,7 @@ #include "ecma-conversion.h" #include "ecma-globals.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/libecmaoperations/ecma-reference.c b/src/libecmaoperations/ecma-reference.c index 3bf249354..926801789 100644 --- a/src/libecmaoperations/ecma-reference.c +++ b/src/libecmaoperations/ecma-reference.c @@ -63,8 +63,9 @@ ecma_op_resolve_reference_base (ecma_object_t *lex_env_p, /**< starting lexical * @return ECMA-reference * Returned value must be freed through ecma_free_reference. */ -ecma_reference_t -ecma_op_get_identifier_reference (ecma_object_t *lex_env_p, /**< lexical environment */ +void +ecma_op_get_identifier_reference (ecma_reference_t &ret, /**< out: reference */ + ecma_object_t *lex_env_p, /**< lexical environment */ ecma_string_t *name_p, /**< identifier's name */ bool is_strict) /**< strict reference flag */ { @@ -74,15 +75,17 @@ ecma_op_get_identifier_reference (ecma_object_t *lex_env_p, /**< lexical environ if (base_lex_env_p != NULL) { - return ecma_make_reference (ecma_make_object_value (base_lex_env_p), - name_p, - is_strict); + ecma_make_reference (ret, + ecma_value_t (base_lex_env_p), + name_p, + is_strict); } else { - return ecma_make_reference (ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED), - name_p, - is_strict); + ecma_make_reference (ret, + ecma_value_t (ECMA_SIMPLE_VALUE_UNDEFINED), + name_p, + is_strict); } } /* ecma_op_get_identifier_reference */ @@ -92,20 +95,18 @@ ecma_op_get_identifier_reference (ecma_object_t *lex_env_p, /**< lexical environ * @return ECMA-reference * Returned value must be freed through ecma_free_reference. */ -ecma_reference_t -ecma_make_reference (const ecma_value_t& base, /**< base value */ +void +ecma_make_reference (ecma_reference_t &ret, /**< out: reference */ + const ecma_value_t& base, /**< base value */ ecma_string_t *name_p, /**< referenced name */ bool is_strict) /**< strict reference flag */ { name_p = ecma_copy_or_ref_ecma_string (name_p); - ecma_reference_t ref; - ref.base = ecma_copy_value (base, true); - ref.is_strict = is_strict; + ecma_copy_value (ret.base, base, true); + ret.is_strict = is_strict; - ECMA_SET_POINTER (ref.referenced_name_cp, name_p); - - return ref; + ECMA_SET_POINTER (ret.referenced_name_cp, name_p); } /* ecma_make_reference */ /** @@ -115,7 +116,7 @@ ecma_make_reference (const ecma_value_t& base, /**< base value */ * freeing invalidates all copies of the reference. */ void -ecma_free_reference (ecma_reference_t ref) /**< reference */ +ecma_free_reference (ecma_reference_t& ref) /**< reference */ { ecma_free_value (ref.base, true); ecma_deref_ecma_string (ECMA_GET_NON_NULL_POINTER (ecma_string_t, diff --git a/src/libecmaoperations/ecma-reference.h b/src/libecmaoperations/ecma-reference.h index edb431c6e..7daa90c3e 100644 --- a/src/libecmaoperations/ecma-reference.h +++ b/src/libecmaoperations/ecma-reference.h @@ -17,6 +17,7 @@ #define ECMA_REFERENCE_H #include "ecma-globals.h" +#include "ecma-value.h" #include "globals.h" /** \addtogroup ecma ECMA @@ -31,8 +32,12 @@ /** * ECMA-reference (see also: ECMA-262 v5, 8.7). */ -typedef struct +typedef struct ecma_reference_t { + ecma_reference_t () : base (), referenced_name_cp (ECMA_NULL_POINTER), is_strict (false) + { + } + /** base value */ ecma_value_t base; @@ -46,13 +51,15 @@ typedef struct extern ecma_object_t* ecma_op_resolve_reference_base (ecma_object_t *lex_env_p, ecma_string_t *name_p); -extern ecma_reference_t ecma_op_get_identifier_reference (ecma_object_t *lex_env_p, - ecma_string_t *name_p, - bool is_strict); -extern ecma_reference_t ecma_make_reference (const ecma_value_t& base, - ecma_string_t *name_p, - bool is_strict); -extern void ecma_free_reference (ecma_reference_t ref); +extern void ecma_op_get_identifier_reference (ecma_reference_t &ret, + ecma_object_t *lex_env_p, + ecma_string_t *name_p, + bool is_strict); +extern void ecma_make_reference (ecma_reference_t &ret, + const ecma_value_t& base, + ecma_string_t *name_p, + bool is_strict); +extern void ecma_free_reference (ecma_reference_t& ref); /** * @} diff --git a/src/libecmaoperations/ecma-string-object.c b/src/libecmaoperations/ecma-string-object.c index 3706fefe1..3884fae83 100644 --- a/src/libecmaoperations/ecma-string-object.c +++ b/src/libecmaoperations/ecma-string-object.c @@ -57,18 +57,21 @@ ecma_op_create_string_object (const ecma_value_t *arguments_list_p, /**< list of } else { - ecma_completion_value_t to_str_arg_value = ecma_op_to_string (arguments_list_p [0]); + ecma_completion_value_t to_str_arg_completion = ecma_op_to_string (arguments_list_p [0]); - if (ecma_is_completion_value_throw (to_str_arg_value)) + if (ecma_is_completion_value_throw (to_str_arg_completion)) { - return to_str_arg_value; + return to_str_arg_completion; } else { - JERRY_ASSERT (ecma_is_completion_value_normal (to_str_arg_value)); + JERRY_ASSERT (ecma_is_completion_value_normal (to_str_arg_completion)); - JERRY_ASSERT (ecma_is_value_string (ecma_get_completion_value_value (to_str_arg_value))); - prim_prop_str_value_p = ecma_get_string_from_completion_value (to_str_arg_value); + ecma_value_t to_str_arg_value; + ecma_get_completion_value_value (to_str_arg_value, to_str_arg_completion); + + JERRY_ASSERT (ecma_is_value_string (to_str_arg_value)); + prim_prop_str_value_p = ecma_get_string_from_value (to_str_arg_value); int32_t string_len = ecma_string_get_length (prim_prop_str_value_p); JERRY_ASSERT (string_len >= 0); @@ -102,10 +105,10 @@ ecma_op_create_string_object (const ecma_value_t *arguments_list_p, /**< list of false, false, false); ecma_number_t *length_prop_value_p = ecma_alloc_number (); *length_prop_value_p = length_value; - ecma_set_named_data_property_value (length_prop_p, ecma_make_number_value (length_prop_value_p)); + ecma_set_named_data_property_value (length_prop_p, ecma_value_t (length_prop_value_p)); ecma_deref_ecma_string (length_magic_string_p); - return ecma_make_normal_completion_value (ecma_make_object_value (obj_p)); + return ecma_make_normal_completion_value (ecma_value_t (obj_p)); } /* ecma_op_create_string_object */ /** @@ -195,7 +198,7 @@ ecma_op_string_object_get_own_property (ecma_object_t *obj_p, /**< the array obj false, true, false); ecma_set_named_data_property_value (new_prop_p, - ecma_make_string_value (new_prop_str_value_p)); + ecma_value_t (new_prop_str_value_p)); } ecma_deref_ecma_string (new_prop_name_p); diff --git a/src/libecmaoperations/ecma-string-object.h b/src/libecmaoperations/ecma-string-object.h index 377464e5e..939b8c006 100644 --- a/src/libecmaoperations/ecma-string-object.h +++ b/src/libecmaoperations/ecma-string-object.h @@ -17,6 +17,7 @@ #define ECMA_STRING_OBJECT_H #include "ecma-globals.h" +#include "ecma-value.h" /** \addtogroup ecma ECMA * @{ diff --git a/src/libecmaoperations/ecma-try-catch-macro.h b/src/libecmaoperations/ecma-try-catch-macro.h index 620119726..c6f0d9c8c 100644 --- a/src/libecmaoperations/ecma-try-catch-macro.h +++ b/src/libecmaoperations/ecma-try-catch-macro.h @@ -39,7 +39,8 @@ { \ JERRY_ASSERT(ecma_is_completion_value_normal (var ## _completion)); \ \ - ecma_value_t var __unused = ecma_get_completion_value_value (var ## _completion) + ecma_value_t var; \ + ecma_get_completion_value_value (var, var ## _completion) /** * The macro marks end of code block that is defined by corresponding