Introducing ecma_get_[type]_from_value, ecma_get_[type]_from_completion_value and ecma_get_completion_value_value interfaces.

This commit is contained in:
Ruben Ayrapetyan
2014-11-27 14:19:53 +03:00
parent 22e1941050
commit 815309c7e9
35 changed files with 370 additions and 240 deletions
+30 -24
View File
@@ -54,8 +54,8 @@ do_number_arithmetic (int_data_t *int_data, /**< interpreter context */
ECMA_TRY_CATCH (num_right_value, ecma_op_to_number (right_value), ret_value);
ecma_number_t *left_p, *right_p, *res_p;
left_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (num_left_value.u.value.value);
right_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (num_right_value.u.value.value);
left_p = ecma_get_number_from_completion_value (num_left_value);
right_p = ecma_get_number_from_completion_value (num_right_value);
res_p = ecma_alloc_number ();
@@ -122,17 +122,23 @@ opfunc_addition (opcode_t opdata, /**< operation data */
ECMA_TRY_CATCH (left_value, get_variable_value (int_data, left_var_idx, false), ret_value);
ECMA_TRY_CATCH (right_value, get_variable_value (int_data, right_var_idx, false), ret_value);
ECMA_TRY_CATCH (prim_left_value, ecma_op_to_primitive (left_value.u.value, ECMA_PREFERRED_TYPE_NO), ret_value);
ECMA_TRY_CATCH (prim_right_value, ecma_op_to_primitive (right_value.u.value, ECMA_PREFERRED_TYPE_NO), ret_value);
ECMA_TRY_CATCH (prim_left_value,
ecma_op_to_primitive (ecma_get_completion_value_value (left_value),
ECMA_PREFERRED_TYPE_NO),
ret_value);
ECMA_TRY_CATCH (prim_right_value,
ecma_op_to_primitive (ecma_get_completion_value_value (right_value),
ECMA_PREFERRED_TYPE_NO),
ret_value);
if (ecma_is_value_string (prim_left_value.u.value)
|| ecma_is_value_string (prim_right_value.u.value))
if (ecma_is_value_string (ecma_get_completion_value_value (prim_left_value))
|| ecma_is_value_string (ecma_get_completion_value_value (prim_right_value)))
{
ECMA_TRY_CATCH (str_left_value, ecma_op_to_string (prim_left_value.u.value), ret_value);
ECMA_TRY_CATCH (str_right_value, ecma_op_to_string (prim_right_value.u.value), ret_value);
ECMA_TRY_CATCH (str_left_value, ecma_op_to_string (ecma_get_completion_value_value (prim_left_value)), ret_value);
ECMA_TRY_CATCH (str_right_value, ecma_op_to_string (ecma_get_completion_value_value (prim_right_value)), ret_value);
ecma_string_t *string1_p = ECMA_GET_NON_NULL_POINTER (str_left_value.u.value.value);
ecma_string_t *string2_p = ECMA_GET_NON_NULL_POINTER (str_right_value.u.value.value);
ecma_string_t *string1_p = ecma_get_string_from_completion_value (str_left_value);
ecma_string_t *string2_p = ecma_get_string_from_completion_value (str_right_value);
ecma_string_t *concat_str_p = ecma_concat_ecma_strings (string1_p, string2_p);
@@ -148,8 +154,8 @@ opfunc_addition (opcode_t opdata, /**< operation data */
ret_value = do_number_arithmetic (int_data,
dst_var_idx,
number_arithmetic_addition,
prim_left_value.u.value,
prim_right_value.u.value);
ecma_get_completion_value_value (prim_left_value),
ecma_get_completion_value_value (prim_right_value));
}
ECMA_FINALIZE (prim_right_value);
@@ -186,8 +192,8 @@ opfunc_substraction (opcode_t opdata, /**< operation data */
ret_value = do_number_arithmetic (int_data,
dst_var_idx,
number_arithmetic_substraction,
left_value.u.value,
right_value.u.value);
ecma_get_completion_value_value (left_value),
ecma_get_completion_value_value (right_value));
ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_value);
@@ -221,8 +227,8 @@ opfunc_multiplication (opcode_t opdata, /**< operation data */
ret_value = do_number_arithmetic (int_data,
dst_var_idx,
number_arithmetic_multiplication,
left_value.u.value,
right_value.u.value);
ecma_get_completion_value_value (left_value),
ecma_get_completion_value_value (right_value));
ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_value);
@@ -256,8 +262,8 @@ opfunc_division (opcode_t opdata, /**< operation data */
ret_value = do_number_arithmetic (int_data,
dst_var_idx,
number_arithmetic_division,
left_value.u.value,
right_value.u.value);
ecma_get_completion_value_value (left_value),
ecma_get_completion_value_value (right_value));
ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_value);
@@ -291,8 +297,8 @@ opfunc_remainder (opcode_t opdata, /**< operation data */
ret_value = do_number_arithmetic (int_data,
dst_var_idx,
number_arithmetic_remainder,
left_value.u.value,
right_value.u.value);
ecma_get_completion_value_value (left_value),
ecma_get_completion_value_value (right_value));
ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_value);
@@ -320,9 +326,9 @@ opfunc_unary_plus (opcode_t opdata, /**< operation data */
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (var_value, get_variable_value (int_data, var_idx, false), ret_value);
ECMA_TRY_CATCH (num_value, ecma_op_to_number (var_value.u.value), ret_value);
ECMA_TRY_CATCH (num_value, ecma_op_to_number (ecma_get_completion_value_value (var_value)), ret_value);
ecma_number_t *var_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (num_value.u.value.value);
ecma_number_t *var_p = ecma_get_number_from_completion_value (num_value);
ret_value = set_variable_value (int_data,
dst_var_idx,
ecma_make_number_value (var_p));
@@ -353,10 +359,10 @@ opfunc_unary_minus (opcode_t opdata, /**< operation data */
ecma_completion_value_t ret_value;
ECMA_TRY_CATCH (var_value, get_variable_value (int_data, var_idx, false), ret_value);
ECMA_TRY_CATCH (num_value, ecma_op_to_number (var_value.u.value), ret_value);
ECMA_TRY_CATCH (num_value, ecma_op_to_number (ecma_get_completion_value_value (var_value)), ret_value);
ecma_number_t *var_p, *res_p;
var_p = (ecma_number_t*) ECMA_GET_NON_NULL_POINTER (num_value.u.value.value);
var_p = ecma_get_number_from_completion_value (num_value);
res_p = ecma_alloc_number ();
*res_p = ecma_number_negate (*var_p);