Introducing ecma_get_[type]_from_value, ecma_get_[type]_from_completion_value and ecma_get_completion_value_value interfaces.
This commit is contained in:
+87
-61
@@ -141,9 +141,10 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_completion_value_normal (get_value_completion));
|
||||
|
||||
ecma_value_t value_to_assign = ecma_get_completion_value_value (get_value_completion);
|
||||
ecma_completion_value_t assignment_completion_value = set_variable_value (int_data,
|
||||
dst_var_idx,
|
||||
get_value_completion.u.value);
|
||||
value_to_assign);
|
||||
|
||||
ecma_free_completion_value (get_value_completion);
|
||||
|
||||
@@ -172,12 +173,12 @@ opfunc_pre_incr (opcode_t opdata, /**< operation data */
|
||||
|
||||
// 1., 2., 3.
|
||||
ECMA_TRY_CATCH (old_value, get_variable_value (int_data, incr_var_idx, true), ret_value);
|
||||
ECMA_TRY_CATCH (old_num_value, ecma_op_to_number (old_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (old_num_value, ecma_op_to_number (ecma_get_completion_value_value (old_value)), ret_value);
|
||||
|
||||
// 4.
|
||||
ecma_number_t* new_num_p = ecma_alloc_number ();
|
||||
|
||||
ecma_number_t* old_num_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (old_num_value.u.value.value);
|
||||
ecma_number_t* old_num_p = ecma_get_number_from_completion_value (old_num_value);
|
||||
*new_num_p = ecma_number_add (*old_num_p, ECMA_NUMBER_ONE);
|
||||
|
||||
ecma_value_t new_num_value = ecma_make_number_value (new_num_p);
|
||||
@@ -222,12 +223,12 @@ opfunc_pre_decr (opcode_t opdata, /**< operation data */
|
||||
|
||||
// 1., 2., 3.
|
||||
ECMA_TRY_CATCH (old_value, get_variable_value (int_data, decr_var_idx, true), ret_value);
|
||||
ECMA_TRY_CATCH (old_num_value, ecma_op_to_number (old_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (old_num_value, ecma_op_to_number (ecma_get_completion_value_value (old_value)), ret_value);
|
||||
|
||||
// 4.
|
||||
ecma_number_t* new_num_p = ecma_alloc_number ();
|
||||
|
||||
ecma_number_t* old_num_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (old_num_value.u.value.value);
|
||||
ecma_number_t* old_num_p = ecma_get_number_from_completion_value (old_num_value);
|
||||
*new_num_p = ecma_number_substract (*old_num_p, ECMA_NUMBER_ONE);
|
||||
|
||||
ecma_value_t new_num_value = ecma_make_number_value (new_num_p);
|
||||
@@ -272,12 +273,12 @@ opfunc_post_incr (opcode_t opdata, /**< operation data */
|
||||
|
||||
// 1., 2., 3.
|
||||
ECMA_TRY_CATCH (old_value, get_variable_value (int_data, incr_var_idx, true), ret_value);
|
||||
ECMA_TRY_CATCH (old_num_value, ecma_op_to_number (old_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (old_num_value, ecma_op_to_number (ecma_get_completion_value_value (old_value)), ret_value);
|
||||
|
||||
// 4.
|
||||
ecma_number_t* new_num_p = ecma_alloc_number ();
|
||||
|
||||
ecma_number_t* old_num_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (old_num_value.u.value.value);
|
||||
ecma_number_t* old_num_p = ecma_get_number_from_completion_value (old_num_value);
|
||||
*new_num_p = ecma_number_add (*old_num_p, ECMA_NUMBER_ONE);
|
||||
|
||||
// 5.
|
||||
@@ -290,7 +291,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,
|
||||
dst_var_idx,
|
||||
old_num_value.u.value);
|
||||
ecma_get_completion_value_value (old_num_value));
|
||||
JERRY_ASSERT (ecma_is_completion_value_empty (reg_assignment_res));
|
||||
|
||||
ECMA_FINALIZE (old_num_value);
|
||||
@@ -320,12 +321,12 @@ opfunc_post_decr (opcode_t opdata, /**< operation data */
|
||||
|
||||
// 1., 2., 3.
|
||||
ECMA_TRY_CATCH (old_value, get_variable_value (int_data, decr_var_idx, true), ret_value);
|
||||
ECMA_TRY_CATCH (old_num_value, ecma_op_to_number (old_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (old_num_value, ecma_op_to_number (ecma_get_completion_value_value (old_value)), ret_value);
|
||||
|
||||
// 4.
|
||||
ecma_number_t* new_num_p = ecma_alloc_number ();
|
||||
|
||||
ecma_number_t* old_num_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (old_num_value.u.value.value);
|
||||
ecma_number_t* old_num_p = ecma_get_number_from_completion_value (old_num_value);
|
||||
*new_num_p = ecma_number_substract (*old_num_p, ECMA_NUMBER_ONE);
|
||||
|
||||
// 5.
|
||||
@@ -338,7 +339,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,
|
||||
dst_var_idx,
|
||||
old_num_value.u.value);
|
||||
ecma_get_completion_value_value (old_num_value));
|
||||
JERRY_ASSERT (ecma_is_completion_value_empty (reg_assignment_res));
|
||||
|
||||
ECMA_FINALIZE (old_num_value);
|
||||
@@ -629,19 +630,24 @@ opfunc_call_n (opcode_t opdata, /**< operation data */
|
||||
}
|
||||
JERRY_ASSERT (ecma_is_completion_value_normal (this_value));
|
||||
|
||||
if (!ecma_op_is_callable (func_value.u.value))
|
||||
if (!ecma_op_is_callable (ecma_get_completion_value_value (func_value)))
|
||||
{
|
||||
ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
}
|
||||
else
|
||||
{
|
||||
ecma_object_t *func_obj_p = ECMA_GET_NON_NULL_POINTER (func_value.u.value.value);
|
||||
ecma_object_t *func_obj_p = ecma_get_object_from_completion_value (func_value);
|
||||
|
||||
ECMA_TRY_CATCH (call_completion,
|
||||
ecma_op_function_call (func_obj_p, this_value.u.value, arg_values, args_number),
|
||||
ecma_op_function_call (func_obj_p,
|
||||
ecma_get_completion_value_value (this_value),
|
||||
arg_values,
|
||||
args_number),
|
||||
ret_value);
|
||||
|
||||
ret_value = set_variable_value (int_data, lhs_var_idx, call_completion.u.value);
|
||||
ret_value = set_variable_value (int_data,
|
||||
lhs_var_idx,
|
||||
ecma_get_completion_value_value (call_completion));
|
||||
|
||||
ECMA_FINALIZE (call_completion);
|
||||
|
||||
@@ -701,13 +707,13 @@ opfunc_construct_n (opcode_t opdata, /**< operation data */
|
||||
{
|
||||
JERRY_ASSERT (args_read == args_number);
|
||||
|
||||
if (!ecma_is_constructor (constructor_value.u.value))
|
||||
if (!ecma_is_constructor (ecma_get_completion_value_value (constructor_value)))
|
||||
{
|
||||
ret_value = ecma_make_throw_obj_completion_value (ecma_new_standard_error (ECMA_ERROR_TYPE));
|
||||
}
|
||||
else
|
||||
{
|
||||
ecma_object_t *constructor_obj_p = ECMA_GET_NON_NULL_POINTER (constructor_value.u.value.value);
|
||||
ecma_object_t *constructor_obj_p = ecma_get_object_from_completion_value (constructor_value);
|
||||
|
||||
ECMA_TRY_CATCH (construction_completion,
|
||||
ecma_op_function_construct (constructor_obj_p,
|
||||
@@ -715,7 +721,7 @@ opfunc_construct_n (opcode_t opdata, /**< operation data */
|
||||
args_number),
|
||||
ret_value);
|
||||
|
||||
ret_value = set_variable_value (int_data, lhs_var_idx, construction_completion.u.value);
|
||||
ret_value = set_variable_value (int_data, lhs_var_idx, ecma_get_completion_value_value (construction_completion));
|
||||
|
||||
ECMA_FINALIZE (construction_completion);
|
||||
}
|
||||
@@ -778,7 +784,7 @@ opfunc_array_decl (opcode_t opdata, /**< operation data */
|
||||
|
||||
ret_value = set_variable_value (int_data,
|
||||
lhs_var_idx,
|
||||
array_obj_value.u.value);
|
||||
ecma_get_completion_value_value (array_obj_value));
|
||||
|
||||
ECMA_FINALIZE (array_obj_value);
|
||||
}
|
||||
@@ -856,12 +862,12 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
|
||||
false),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_str_value,
|
||||
ecma_op_to_string (prop_name_value.u.value),
|
||||
ecma_op_to_string (ecma_get_completion_value_value (prop_name_value)),
|
||||
ret_value);
|
||||
|
||||
bool is_throw_syntax_error = false;
|
||||
|
||||
ecma_string_t *prop_name_string_p = ECMA_GET_NON_NULL_POINTER (prop_name_str_value.u.value.value);
|
||||
ecma_string_t *prop_name_string_p = ecma_get_string_from_completion_value (prop_name_str_value);
|
||||
ecma_property_t *previous_p = ecma_op_object_get_own_property (obj_p, prop_name_string_p);
|
||||
|
||||
const bool is_previous_undefined = (previous_p == NULL);
|
||||
@@ -883,7 +889,7 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
|
||||
if (type == OPCODE_META_TYPE_VARG_PROP_DATA)
|
||||
{
|
||||
prop_desc.is_value_defined = true;
|
||||
prop_desc.value = value_for_prop_desc.u.value;
|
||||
prop_desc.value = ecma_get_completion_value_value (value_for_prop_desc);
|
||||
|
||||
prop_desc.is_writable_defined = true;
|
||||
prop_desc.writable = ECMA_PROPERTY_WRITABLE;
|
||||
@@ -898,10 +904,8 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
|
||||
}
|
||||
else if (type == OPCODE_META_TYPE_VARG_PROP_GETTER)
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_object (value_for_prop_desc.u.value));
|
||||
|
||||
prop_desc.is_get_defined = true;
|
||||
prop_desc.get_p = ECMA_GET_NON_NULL_POINTER (value_for_prop_desc.u.value.value);
|
||||
prop_desc.get_p = ecma_get_object_from_completion_value (value_for_prop_desc);
|
||||
|
||||
if (!is_previous_undefined
|
||||
&& is_previous_data_desc)
|
||||
@@ -911,10 +915,8 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
|
||||
}
|
||||
else
|
||||
{
|
||||
JERRY_ASSERT (ecma_is_value_object (value_for_prop_desc.u.value));
|
||||
|
||||
prop_desc.is_set_defined = true;
|
||||
prop_desc.set_p = ECMA_GET_NON_NULL_POINTER (value_for_prop_desc.u.value.value);
|
||||
prop_desc.set_p = ecma_get_object_from_completion_value (value_for_prop_desc);
|
||||
|
||||
if (!is_previous_undefined
|
||||
&& is_previous_data_desc)
|
||||
@@ -1003,7 +1005,7 @@ 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.u.value, true));
|
||||
ret_value = ecma_make_return_completion_value (ecma_copy_value (ecma_get_completion_value_value (expr_val), true));
|
||||
|
||||
ECMA_FINALIZE (expr_val);
|
||||
|
||||
@@ -1031,19 +1033,27 @@ opfunc_prop_getter (opcode_t opdata __unused, /**< operation data */
|
||||
|
||||
ecma_completion_value_t ret_value;
|
||||
|
||||
ECMA_TRY_CATCH (base_value, get_variable_value (int_data, base_var_idx, false), ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_value, get_variable_value (int_data, prop_name_var_idx, false), ret_value);
|
||||
ECMA_TRY_CATCH (check_coercible_ret, ecma_op_check_object_coercible (base_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_str_value, ecma_op_to_string (prop_name_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (base_value,
|
||||
get_variable_value (int_data, base_var_idx, false),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_value,
|
||||
get_variable_value (int_data, prop_name_var_idx, false),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (check_coercible_ret,
|
||||
ecma_op_check_object_coercible (ecma_get_completion_value_value (base_value)),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_str_value,
|
||||
ecma_op_to_string (ecma_get_completion_value_value (prop_name_value)),
|
||||
ret_value);
|
||||
|
||||
ecma_string_t *prop_name_string_p = ECMA_GET_NON_NULL_POINTER (prop_name_str_value.u.value.value);
|
||||
ecma_reference_t ref = ecma_make_reference (base_value.u.value,
|
||||
ecma_string_t *prop_name_string_p = ecma_get_string_from_completion_value (prop_name_str_value);
|
||||
ecma_reference_t ref = ecma_make_reference (ecma_get_completion_value_value (base_value),
|
||||
prop_name_string_p,
|
||||
int_data->is_strict);
|
||||
|
||||
ECMA_TRY_CATCH (prop_value, ecma_op_get_value_object_base (ref), ret_value);
|
||||
|
||||
ret_value = set_variable_value (int_data, lhs_var_idx, prop_value.u.value);
|
||||
ret_value = set_variable_value (int_data, lhs_var_idx, ecma_get_completion_value_value (prop_value));
|
||||
|
||||
ECMA_FINALIZE (prop_value);
|
||||
|
||||
@@ -1078,18 +1088,26 @@ opfunc_prop_setter (opcode_t opdata __unused, /**< operation data */
|
||||
|
||||
ecma_completion_value_t ret_value;
|
||||
|
||||
ECMA_TRY_CATCH (base_value, get_variable_value (int_data, base_var_idx, false), ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_value, get_variable_value (int_data, prop_name_var_idx, false), ret_value);
|
||||
ECMA_TRY_CATCH (check_coercible_ret, ecma_op_check_object_coercible (base_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_str_value, ecma_op_to_string (prop_name_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (base_value,
|
||||
get_variable_value (int_data, base_var_idx, false),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_value,
|
||||
get_variable_value (int_data, prop_name_var_idx, false),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (check_coercible_ret,
|
||||
ecma_op_check_object_coercible (ecma_get_completion_value_value (base_value)),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (prop_name_str_value,
|
||||
ecma_op_to_string (ecma_get_completion_value_value (prop_name_value)),
|
||||
ret_value);
|
||||
|
||||
ecma_string_t *prop_name_string_p = ECMA_GET_NON_NULL_POINTER (prop_name_str_value.u.value.value);
|
||||
ecma_reference_t ref = ecma_make_reference (base_value.u.value,
|
||||
ecma_string_t *prop_name_string_p = ecma_get_string_from_completion_value (prop_name_str_value);
|
||||
ecma_reference_t ref = ecma_make_reference (ecma_get_completion_value_value (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.u.value);
|
||||
ret_value = ecma_op_put_value_object_base (ref, ecma_get_completion_value_value (rhs_value));
|
||||
ECMA_FINALIZE (rhs_value);
|
||||
|
||||
ecma_free_reference (ref);
|
||||
@@ -1147,9 +1165,9 @@ opfunc_logical_not (opcode_t opdata, /**< operation data */
|
||||
ECMA_TRY_CATCH (right_value, get_variable_value (int_data, right_var_idx, false), ret_value);
|
||||
|
||||
ecma_simple_value_t old_value = ECMA_SIMPLE_VALUE_TRUE;
|
||||
ecma_completion_value_t to_bool_value = ecma_op_to_boolean (right_value.u.value);
|
||||
ecma_completion_value_t to_bool_value = ecma_op_to_boolean (ecma_get_completion_value_value (right_value));
|
||||
|
||||
if (ecma_is_value_true (to_bool_value.u.value))
|
||||
if (ecma_is_value_true (ecma_get_completion_value_value (to_bool_value)))
|
||||
{
|
||||
old_value = ECMA_SIMPLE_VALUE_FALSE;
|
||||
}
|
||||
@@ -1212,10 +1230,10 @@ opfunc_with (opcode_t opdata, /**< operation data */
|
||||
false),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (obj_expr_value,
|
||||
ecma_op_to_object (expr_value.u.value),
|
||||
ecma_op_to_object (ecma_get_completion_value_value (expr_value)),
|
||||
ret_value);
|
||||
|
||||
ecma_object_t *obj_p = ECMA_GET_NON_NULL_POINTER (obj_expr_value.u.value.value);
|
||||
ecma_object_t *obj_p = ecma_get_object_from_completion_value (obj_expr_value);
|
||||
|
||||
ecma_object_t *old_env_p = int_data->lex_env_p;
|
||||
ecma_object_t *new_env_p = ecma_create_object_lex_env (old_env_p,
|
||||
@@ -1276,7 +1294,7 @@ opfunc_throw (opcode_t opdata, /**< operation data */
|
||||
false),
|
||||
ret_value);
|
||||
|
||||
ret_value = ecma_make_throw_completion_value (ecma_copy_value (var_value.u.value, true));
|
||||
ret_value = ecma_make_throw_completion_value (ecma_copy_value (ecma_get_completion_value_value (var_value), true));
|
||||
|
||||
ECMA_FINALIZE (var_value);
|
||||
|
||||
@@ -1352,7 +1370,7 @@ opfunc_typeof (opcode_t opdata, /**< operation data */
|
||||
obj_var_idx),
|
||||
ret_value);
|
||||
|
||||
ecma_value_t typeof_arg = typeof_evaluate_arg_completion.u.value;
|
||||
ecma_value_t typeof_arg = ecma_get_completion_value_value (typeof_evaluate_arg_completion);
|
||||
|
||||
ecma_string_t *type_str_p = NULL;
|
||||
|
||||
@@ -1450,7 +1468,7 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */
|
||||
ECMA_GET_NON_NULL_POINTER (ref.referenced_name_cp)),
|
||||
ret_value);
|
||||
|
||||
ret_value = set_variable_value (int_data, dst_var_idx, delete_completion.u.value);
|
||||
ret_value = set_variable_value (int_data, dst_var_idx, ecma_get_completion_value_value (delete_completion));
|
||||
|
||||
ECMA_FINALIZE (delete_completion);
|
||||
}
|
||||
@@ -1484,15 +1502,23 @@ opfunc_delete_prop (opcode_t opdata, /**< operation data */
|
||||
|
||||
ecma_completion_value_t ret_value;
|
||||
|
||||
ECMA_TRY_CATCH (base_value, get_variable_value (int_data, base_var_idx, false), ret_value);
|
||||
ECMA_TRY_CATCH (name_value, get_variable_value (int_data, name_var_idx, false), ret_value);
|
||||
ECMA_TRY_CATCH (check_coercible_ret, ecma_op_check_object_coercible (base_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (str_name_value, ecma_op_to_string (name_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (base_value,
|
||||
get_variable_value (int_data, base_var_idx, false),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (name_value,
|
||||
get_variable_value (int_data, name_var_idx, false),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (check_coercible_ret,
|
||||
ecma_op_check_object_coercible (ecma_get_completion_value_value (base_value)),
|
||||
ret_value);
|
||||
ECMA_TRY_CATCH (str_name_value,
|
||||
ecma_op_to_string (ecma_get_completion_value_value (name_value)),
|
||||
ret_value);
|
||||
|
||||
JERRY_ASSERT (ecma_is_value_string (str_name_value.u.value));
|
||||
ecma_string_t *name_string_p = ECMA_GET_NON_NULL_POINTER (str_name_value.u.value.value);
|
||||
JERRY_ASSERT (ecma_is_value_string (ecma_get_completion_value_value (str_name_value)));
|
||||
ecma_string_t *name_string_p = ecma_get_string_from_completion_value (str_name_value);
|
||||
|
||||
if (ecma_is_value_undefined (base_value.u.value))
|
||||
if (ecma_is_value_undefined (ecma_get_completion_value_value (base_value)))
|
||||
{
|
||||
if (int_data->is_strict)
|
||||
{
|
||||
@@ -1506,17 +1532,17 @@ opfunc_delete_prop (opcode_t opdata, /**< operation data */
|
||||
}
|
||||
else
|
||||
{
|
||||
ECMA_TRY_CATCH (obj_value, ecma_op_to_object (base_value.u.value), ret_value);
|
||||
ECMA_TRY_CATCH (obj_value, ecma_op_to_object (ecma_get_completion_value_value (base_value)), ret_value);
|
||||
|
||||
JERRY_ASSERT (ecma_is_value_object (obj_value.u.value));
|
||||
ecma_object_t *obj_p = ECMA_GET_NON_NULL_POINTER (obj_value.u.value.value);
|
||||
JERRY_ASSERT (ecma_is_value_object (ecma_get_completion_value_value (obj_value)));
|
||||
ecma_object_t *obj_p = ecma_get_object_from_completion_value (obj_value);
|
||||
JERRY_ASSERT (!ecma_is_lexical_environment (obj_p));
|
||||
|
||||
ECMA_TRY_CATCH (delete_op_completion,
|
||||
ecma_op_object_delete (obj_p, name_string_p, int_data->is_strict),
|
||||
ret_value);
|
||||
|
||||
ret_value = set_variable_value (int_data, dst_var_idx, delete_op_completion.u.value);
|
||||
ret_value = set_variable_value (int_data, dst_var_idx, ecma_get_completion_value_value (delete_op_completion));
|
||||
|
||||
ECMA_FINALIZE (delete_op_completion);
|
||||
ECMA_FINALIZE (obj_value);
|
||||
|
||||
Reference in New Issue
Block a user