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 (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 (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 ret_value = set_variable_value (int_data, dst_var_idx, compare_result.u.value);
: ECMA_SIMPLE_VALUE_FALSE));
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value); ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_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 (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 (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 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_SIMPLE_VALUE_TRUE));
ECMA_FINALIZE (compare_result);
ECMA_FINALIZE (right_value); ECMA_FINALIZE (right_value);
ECMA_FINALIZE (left_value); ECMA_FINALIZE (left_value);

View File

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