Changing return value of ecma_op_abstract_equality_compare to ecma_completion_value_t.

This commit is contained in:
Ruben Ayrapetyan 2014-09-02 19:07:43 +04:00
parent c9f954ec2e
commit c581f10b94
3 changed files with 37 additions and 15 deletions

View File

@ -38,12 +38,16 @@ opfunc_equal_value (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 (compare_result,
ecma_op_abstract_equality_compare (left_value.u.value, right_value.u.value),
ret_value);
bool is_equal = ecma_op_abstract_equality_compare (left_value.u.value, right_value.u.value);
JERRY_ASSERT (ecma_is_completion_value_normal_true (compare_result)
|| ecma_is_completion_value_normal_false (compare_result));
ret_value = set_variable_value (int_data, dst_var_idx, ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE
: ECMA_SIMPLE_VALUE_FALSE));
ret_value = set_variable_value (int_data, dst_var_idx, compare_result.u.value);
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_value);
@ -72,13 +76,19 @@ opfunc_not_equal_value (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 (compare_result,
ecma_op_abstract_equality_compare (left_value.u.value, right_value.u.value),
ret_value);
bool is_equal = ecma_op_abstract_equality_compare (left_value.u.value, right_value.u.value);
JERRY_ASSERT (ecma_is_completion_value_normal_true (compare_result)
|| ecma_is_completion_value_normal_false (compare_result));
bool is_equal = ecma_is_completion_value_normal_true (compare_result);
ret_value = set_variable_value (int_data, dst_var_idx, ecma_make_simple_value (is_equal ? ECMA_SIMPLE_VALUE_FALSE
: ECMA_SIMPLE_VALUE_TRUE));
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_value);

View File

@ -34,10 +34,12 @@
* @return true - if values are equal,
* false - otherwise.
*/
bool
ecma_completion_value_t
ecma_op_abstract_equality_compare (ecma_value_t x, /**< first operand */
ecma_value_t y) /**< second operand */
{
ecma_completion_value_t ret_value;
const bool is_x_undefined = ecma_is_value_undefined (x);
const bool is_x_null = ecma_is_value_null (x);
const bool is_x_boolean = ecma_is_value_boolean (x);
@ -67,7 +69,7 @@ ecma_op_abstract_equality_compare (ecma_value_t x, /**< first operand */
|| is_x_null)
{
// a., b.
return true;
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
}
else if (is_x_number)
{ // c.
@ -76,35 +78,45 @@ ecma_op_abstract_equality_compare (ecma_value_t x, /**< first operand */
TODO(Implement according to ECMA);
return (x_num == y_num);
bool is_equal = (x_num == y_num);
ret_value = ecma_make_simple_completion_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
else if (is_x_string)
{ // d.
ecma_string_t* x_str_p = ECMA_GET_POINTER(x.value);
ecma_string_t* y_str_p = ECMA_GET_POINTER(y.value);
return ecma_compare_ecma_string_to_ecma_string (x_str_p, y_str_p);
bool is_equal = ecma_compare_ecma_string_to_ecma_string (x_str_p, y_str_p);
ret_value = ecma_make_simple_completion_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
else if (is_x_boolean)
{ // e.
return (x.value == y.value);
bool is_equal = (x.value == y.value);
ret_value = ecma_make_simple_completion_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
else
{ // f.
JERRY_ASSERT(is_x_object);
return (x.value == y.value);
bool is_equal = (x.value == y.value);
ret_value = ecma_make_simple_completion_value (is_equal ? ECMA_SIMPLE_VALUE_TRUE : ECMA_SIMPLE_VALUE_FALSE);
}
}
else if ((is_x_null && is_y_undefined)
|| (is_x_undefined && is_y_null))
{ // 2., 3.
return true;
ret_value = ecma_make_simple_completion_value (ECMA_SIMPLE_VALUE_TRUE);
}
else
{
JERRY_UNIMPLEMENTED();
}
return ret_value;
} /* ecma_op_abstract_equality_compare */
/**

View File

@ -26,7 +26,7 @@
* @{
*/
extern bool ecma_op_abstract_equality_compare (ecma_value_t x, ecma_value_t y);
extern ecma_completion_value_t ecma_op_abstract_equality_compare (ecma_value_t x, ecma_value_t y);
extern bool ecma_op_strict_equality_compare (ecma_value_t x, ecma_value_t y);
extern ecma_completion_value_t ecma_op_abstract_relational_compare (ecma_value_t x, ecma_value_t y, bool left_first);