diff --git a/src/libcoreint/opcodes-ecma-equality.c b/src/libcoreint/opcodes-ecma-equality.c index 7ac94a33e..33cfce797 100644 --- a/src/libcoreint/opcodes-ecma-equality.c +++ b/src/libcoreint/opcodes-ecma-equality.c @@ -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_SIMPLE_VALUE_TRUE)); + ECMA_FINALIZE (compare_result); ECMA_FINALIZE (right_value); ECMA_FINALIZE (left_value); diff --git a/src/libecmaoperations/ecma-comparison.c b/src/libecmaoperations/ecma-comparison.c index 748b5afb6..ce46f2ca9 100644 --- a/src/libecmaoperations/ecma-comparison.c +++ b/src/libecmaoperations/ecma-comparison.c @@ -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)) + || (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 */ /** diff --git a/src/libecmaoperations/ecma-comparison.h b/src/libecmaoperations/ecma-comparison.h index daffc5603..9331b61bf 100644 --- a/src/libecmaoperations/ecma-comparison.h +++ b/src/libecmaoperations/ecma-comparison.h @@ -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);