1425bb815Sopenharmony_ci/* Copyright JS Foundation and other contributors, http://js.foundation 2425bb815Sopenharmony_ci * 3425bb815Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4425bb815Sopenharmony_ci * you may not use this file except in compliance with the License. 5425bb815Sopenharmony_ci * You may obtain a copy of the License at 6425bb815Sopenharmony_ci * 7425bb815Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8425bb815Sopenharmony_ci * 9425bb815Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10425bb815Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS 11425bb815Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12425bb815Sopenharmony_ci * See the License for the specific language governing permissions and 13425bb815Sopenharmony_ci * limitations under the License. 14425bb815Sopenharmony_ci */ 15425bb815Sopenharmony_ci 16425bb815Sopenharmony_ci#include "ecma-comparison.h" 17425bb815Sopenharmony_ci#include "ecma-conversion.h" 18425bb815Sopenharmony_ci#include "ecma-globals.h" 19425bb815Sopenharmony_ci#include "ecma-try-catch-macro.h" 20425bb815Sopenharmony_ci#include "jrt.h" 21425bb815Sopenharmony_ci 22425bb815Sopenharmony_ci/** \addtogroup ecma ECMA 23425bb815Sopenharmony_ci * @{ 24425bb815Sopenharmony_ci * 25425bb815Sopenharmony_ci * \addtogroup ecmacomparison ECMA comparison 26425bb815Sopenharmony_ci * @{ 27425bb815Sopenharmony_ci */ 28425bb815Sopenharmony_ci 29425bb815Sopenharmony_ci/** 30425bb815Sopenharmony_ci * ECMA abstract equality comparison routine. 31425bb815Sopenharmony_ci * 32425bb815Sopenharmony_ci * See also: ECMA-262 v5, 11.9.3 33425bb815Sopenharmony_ci * 34425bb815Sopenharmony_ci * Note: 35425bb815Sopenharmony_ci * This function might raise an exception, so the 36425bb815Sopenharmony_ci * returned value must be freed with ecma_free_value. 37425bb815Sopenharmony_ci * 38425bb815Sopenharmony_ci * @return true - if values are equal, 39425bb815Sopenharmony_ci * false - otherwise 40425bb815Sopenharmony_ci * error - in case of any problems 41425bb815Sopenharmony_ci */ 42425bb815Sopenharmony_ciecma_value_t 43425bb815Sopenharmony_ciecma_op_abstract_equality_compare (ecma_value_t x, /**< first operand */ 44425bb815Sopenharmony_ci ecma_value_t y) /**< second operand */ 45425bb815Sopenharmony_ci{ 46425bb815Sopenharmony_ci if (x == y) 47425bb815Sopenharmony_ci { 48425bb815Sopenharmony_ci return ECMA_VALUE_TRUE; 49425bb815Sopenharmony_ci } 50425bb815Sopenharmony_ci 51425bb815Sopenharmony_ci if (ecma_are_values_integer_numbers (x, y)) 52425bb815Sopenharmony_ci { 53425bb815Sopenharmony_ci /* Note: the (x == y) comparison captures the true case. */ 54425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 55425bb815Sopenharmony_ci } 56425bb815Sopenharmony_ci 57425bb815Sopenharmony_ci if (ecma_is_value_number (x)) 58425bb815Sopenharmony_ci { 59425bb815Sopenharmony_ci if (ecma_is_value_number (y)) 60425bb815Sopenharmony_ci { 61425bb815Sopenharmony_ci /* 1.c */ 62425bb815Sopenharmony_ci ecma_number_t x_num = ecma_get_number_from_value (x); 63425bb815Sopenharmony_ci ecma_number_t y_num = ecma_get_number_from_value (y); 64425bb815Sopenharmony_ci 65425bb815Sopenharmony_ci bool is_x_equal_to_y = (x_num == y_num); 66425bb815Sopenharmony_ci 67425bb815Sopenharmony_ci#ifndef JERRY_NDEBUG 68425bb815Sopenharmony_ci bool is_x_equal_to_y_check; 69425bb815Sopenharmony_ci 70425bb815Sopenharmony_ci if (ecma_number_is_nan (x_num) 71425bb815Sopenharmony_ci || ecma_number_is_nan (y_num)) 72425bb815Sopenharmony_ci { 73425bb815Sopenharmony_ci is_x_equal_to_y_check = false; 74425bb815Sopenharmony_ci } 75425bb815Sopenharmony_ci else if (x_num == y_num 76425bb815Sopenharmony_ci || (ecma_number_is_zero (x_num) 77425bb815Sopenharmony_ci && ecma_number_is_zero (y_num))) 78425bb815Sopenharmony_ci { 79425bb815Sopenharmony_ci is_x_equal_to_y_check = true; 80425bb815Sopenharmony_ci } 81425bb815Sopenharmony_ci else 82425bb815Sopenharmony_ci { 83425bb815Sopenharmony_ci is_x_equal_to_y_check = false; 84425bb815Sopenharmony_ci } 85425bb815Sopenharmony_ci 86425bb815Sopenharmony_ci JERRY_ASSERT (is_x_equal_to_y == is_x_equal_to_y_check); 87425bb815Sopenharmony_ci#endif /* !JERRY_NDEBUG */ 88425bb815Sopenharmony_ci 89425bb815Sopenharmony_ci return ecma_make_boolean_value (is_x_equal_to_y); 90425bb815Sopenharmony_ci } 91425bb815Sopenharmony_ci 92425bb815Sopenharmony_ci /* Swap values. */ 93425bb815Sopenharmony_ci ecma_value_t tmp = x; 94425bb815Sopenharmony_ci x = y; 95425bb815Sopenharmony_ci y = tmp; 96425bb815Sopenharmony_ci } 97425bb815Sopenharmony_ci 98425bb815Sopenharmony_ci if (ecma_is_value_string (x)) 99425bb815Sopenharmony_ci { 100425bb815Sopenharmony_ci if (ecma_is_value_string (y)) 101425bb815Sopenharmony_ci { 102425bb815Sopenharmony_ci /* 1., d. */ 103425bb815Sopenharmony_ci ecma_string_t *x_str_p = ecma_get_string_from_value (x); 104425bb815Sopenharmony_ci ecma_string_t *y_str_p = ecma_get_string_from_value (y); 105425bb815Sopenharmony_ci 106425bb815Sopenharmony_ci bool is_equal = ecma_compare_ecma_strings (x_str_p, y_str_p); 107425bb815Sopenharmony_ci 108425bb815Sopenharmony_ci return ecma_make_boolean_value (is_equal); 109425bb815Sopenharmony_ci } 110425bb815Sopenharmony_ci 111425bb815Sopenharmony_ci if (ecma_is_value_number (y)) 112425bb815Sopenharmony_ci { 113425bb815Sopenharmony_ci /* 4. */ 114425bb815Sopenharmony_ci ecma_value_t x_num_value = ecma_op_to_number (x); 115425bb815Sopenharmony_ci 116425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (x_num_value)) 117425bb815Sopenharmony_ci { 118425bb815Sopenharmony_ci return x_num_value; 119425bb815Sopenharmony_ci } 120425bb815Sopenharmony_ci 121425bb815Sopenharmony_ci ecma_value_t compare_result = ecma_op_abstract_equality_compare (x_num_value, y); 122425bb815Sopenharmony_ci 123425bb815Sopenharmony_ci ecma_free_value (x_num_value); 124425bb815Sopenharmony_ci return compare_result; 125425bb815Sopenharmony_ci } 126425bb815Sopenharmony_ci 127425bb815Sopenharmony_ci /* Swap values. */ 128425bb815Sopenharmony_ci ecma_value_t tmp = x; 129425bb815Sopenharmony_ci x = y; 130425bb815Sopenharmony_ci y = tmp; 131425bb815Sopenharmony_ci } 132425bb815Sopenharmony_ci 133425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 134425bb815Sopenharmony_ci if (ecma_is_value_symbol (x)) 135425bb815Sopenharmony_ci { 136425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 137425bb815Sopenharmony_ci } 138425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 139425bb815Sopenharmony_ci 140425bb815Sopenharmony_ci if (ecma_is_value_boolean (y)) 141425bb815Sopenharmony_ci { 142425bb815Sopenharmony_ci if (ecma_is_value_boolean (x)) 143425bb815Sopenharmony_ci { 144425bb815Sopenharmony_ci /* 1., e. */ 145425bb815Sopenharmony_ci /* Note: the (x == y) comparison captures the true case. */ 146425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 147425bb815Sopenharmony_ci } 148425bb815Sopenharmony_ci 149425bb815Sopenharmony_ci /* 7. */ 150425bb815Sopenharmony_ci return ecma_op_abstract_equality_compare (x, ecma_make_integer_value (ecma_is_value_true (y) ? 1 : 0)); 151425bb815Sopenharmony_ci } 152425bb815Sopenharmony_ci 153425bb815Sopenharmony_ci if (ecma_is_value_object (x)) 154425bb815Sopenharmony_ci { 155425bb815Sopenharmony_ci if (ecma_is_value_string (y) 156425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 157425bb815Sopenharmony_ci || ecma_is_value_symbol (y) 158425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 159425bb815Sopenharmony_ci || ecma_is_value_number (y)) 160425bb815Sopenharmony_ci { 161425bb815Sopenharmony_ci /* 9. */ 162425bb815Sopenharmony_ci ecma_value_t x_prim_value = ecma_op_to_primitive (x, ECMA_PREFERRED_TYPE_NO); 163425bb815Sopenharmony_ci 164425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (x_prim_value)) 165425bb815Sopenharmony_ci { 166425bb815Sopenharmony_ci return x_prim_value; 167425bb815Sopenharmony_ci } 168425bb815Sopenharmony_ci 169425bb815Sopenharmony_ci ecma_value_t compare_result = ecma_op_abstract_equality_compare (x_prim_value, y); 170425bb815Sopenharmony_ci 171425bb815Sopenharmony_ci ecma_free_value (x_prim_value); 172425bb815Sopenharmony_ci return compare_result; 173425bb815Sopenharmony_ci } 174425bb815Sopenharmony_ci 175425bb815Sopenharmony_ci /* 1., f. */ 176425bb815Sopenharmony_ci /* Note: the (x == y) comparison captures the true case. */ 177425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 178425bb815Sopenharmony_ci } 179425bb815Sopenharmony_ci 180425bb815Sopenharmony_ci if (ecma_is_value_boolean (x)) 181425bb815Sopenharmony_ci { 182425bb815Sopenharmony_ci /* 6. */ 183425bb815Sopenharmony_ci return ecma_op_abstract_equality_compare (ecma_make_integer_value (ecma_is_value_true (x) ? 1 : 0), y); 184425bb815Sopenharmony_ci } 185425bb815Sopenharmony_ci 186425bb815Sopenharmony_ci if (ecma_is_value_undefined (x) 187425bb815Sopenharmony_ci || ecma_is_value_null (x)) 188425bb815Sopenharmony_ci { 189425bb815Sopenharmony_ci /* 1. a., b. */ 190425bb815Sopenharmony_ci /* 2., 3. */ 191425bb815Sopenharmony_ci bool is_equal = ecma_is_value_undefined (y) || ecma_is_value_null (y); 192425bb815Sopenharmony_ci 193425bb815Sopenharmony_ci return ecma_make_boolean_value (is_equal); 194425bb815Sopenharmony_ci } 195425bb815Sopenharmony_ci 196425bb815Sopenharmony_ci return ECMA_VALUE_FALSE; 197425bb815Sopenharmony_ci} /* ecma_op_abstract_equality_compare */ 198425bb815Sopenharmony_ci 199425bb815Sopenharmony_ci/** 200425bb815Sopenharmony_ci * ECMA strict equality comparison routine. 201425bb815Sopenharmony_ci * 202425bb815Sopenharmony_ci * See also: ECMA-262 v5, 11.9.6 203425bb815Sopenharmony_ci * 204425bb815Sopenharmony_ci * @return true - if values are strict equal, 205425bb815Sopenharmony_ci * false - otherwise 206425bb815Sopenharmony_ci */ 207425bb815Sopenharmony_cibool 208425bb815Sopenharmony_ciecma_op_strict_equality_compare (ecma_value_t x, /**< first operand */ 209425bb815Sopenharmony_ci ecma_value_t y) /**< second operand */ 210425bb815Sopenharmony_ci{ 211425bb815Sopenharmony_ci if (ecma_is_value_direct (x) 212425bb815Sopenharmony_ci || ecma_is_value_direct (y) 213425bb815Sopenharmony_ci#if ENABLED (JERRY_ES2015) 214425bb815Sopenharmony_ci || ecma_is_value_symbol (x) 215425bb815Sopenharmony_ci || ecma_is_value_symbol (y) 216425bb815Sopenharmony_ci#endif /* ENABLED (JERRY_ES2015) */ 217425bb815Sopenharmony_ci || ecma_is_value_object (x) 218425bb815Sopenharmony_ci || ecma_is_value_object (y)) 219425bb815Sopenharmony_ci { 220425bb815Sopenharmony_ci JERRY_ASSERT (!ecma_is_value_direct (x) 221425bb815Sopenharmony_ci || ecma_is_value_undefined (x) 222425bb815Sopenharmony_ci || ecma_is_value_null (x) 223425bb815Sopenharmony_ci || ecma_is_value_boolean (x) 224425bb815Sopenharmony_ci || ecma_is_value_integer_number (x)); 225425bb815Sopenharmony_ci 226425bb815Sopenharmony_ci JERRY_ASSERT (!ecma_is_value_direct (y) 227425bb815Sopenharmony_ci || ecma_is_value_undefined (y) 228425bb815Sopenharmony_ci || ecma_is_value_null (y) 229425bb815Sopenharmony_ci || ecma_is_value_boolean (y) 230425bb815Sopenharmony_ci || ecma_is_value_integer_number (y)); 231425bb815Sopenharmony_ci 232425bb815Sopenharmony_ci if ((x != ecma_make_integer_value (0) || !ecma_is_value_float_number (y)) 233425bb815Sopenharmony_ci && (y != ecma_make_integer_value (0) || !ecma_is_value_float_number (x))) 234425bb815Sopenharmony_ci { 235425bb815Sopenharmony_ci return (x == y); 236425bb815Sopenharmony_ci } 237425bb815Sopenharmony_ci 238425bb815Sopenharmony_ci /* The +0 === -0 case handled below. */ 239425bb815Sopenharmony_ci } 240425bb815Sopenharmony_ci 241425bb815Sopenharmony_ci JERRY_ASSERT (ecma_is_value_number (x) || ecma_is_value_string (x)); 242425bb815Sopenharmony_ci JERRY_ASSERT (ecma_is_value_number (y) || ecma_is_value_string (y)); 243425bb815Sopenharmony_ci 244425bb815Sopenharmony_ci if (ecma_is_value_string (x)) 245425bb815Sopenharmony_ci { 246425bb815Sopenharmony_ci if (!ecma_is_value_string (y)) 247425bb815Sopenharmony_ci { 248425bb815Sopenharmony_ci return false; 249425bb815Sopenharmony_ci } 250425bb815Sopenharmony_ci 251425bb815Sopenharmony_ci ecma_string_t *x_str_p = ecma_get_string_from_value (x); 252425bb815Sopenharmony_ci ecma_string_t *y_str_p = ecma_get_string_from_value (y); 253425bb815Sopenharmony_ci 254425bb815Sopenharmony_ci return ecma_compare_ecma_strings (x_str_p, y_str_p); 255425bb815Sopenharmony_ci } 256425bb815Sopenharmony_ci 257425bb815Sopenharmony_ci if (!ecma_is_value_number (y)) 258425bb815Sopenharmony_ci { 259425bb815Sopenharmony_ci return false; 260425bb815Sopenharmony_ci } 261425bb815Sopenharmony_ci 262425bb815Sopenharmony_ci ecma_number_t x_num = ecma_get_number_from_value (x); 263425bb815Sopenharmony_ci ecma_number_t y_num = ecma_get_number_from_value (y); 264425bb815Sopenharmony_ci 265425bb815Sopenharmony_ci bool is_x_equal_to_y = (x_num == y_num); 266425bb815Sopenharmony_ci 267425bb815Sopenharmony_ci#ifndef JERRY_NDEBUG 268425bb815Sopenharmony_ci bool is_x_equal_to_y_check; 269425bb815Sopenharmony_ci 270425bb815Sopenharmony_ci if (ecma_number_is_nan (x_num) 271425bb815Sopenharmony_ci || ecma_number_is_nan (y_num)) 272425bb815Sopenharmony_ci { 273425bb815Sopenharmony_ci is_x_equal_to_y_check = false; 274425bb815Sopenharmony_ci } 275425bb815Sopenharmony_ci else if (x_num == y_num 276425bb815Sopenharmony_ci || (ecma_number_is_zero (x_num) 277425bb815Sopenharmony_ci && ecma_number_is_zero (y_num))) 278425bb815Sopenharmony_ci { 279425bb815Sopenharmony_ci is_x_equal_to_y_check = true; 280425bb815Sopenharmony_ci } 281425bb815Sopenharmony_ci else 282425bb815Sopenharmony_ci { 283425bb815Sopenharmony_ci is_x_equal_to_y_check = false; 284425bb815Sopenharmony_ci } 285425bb815Sopenharmony_ci 286425bb815Sopenharmony_ci JERRY_ASSERT (is_x_equal_to_y == is_x_equal_to_y_check); 287425bb815Sopenharmony_ci#endif /* !JERRY_NDEBUG */ 288425bb815Sopenharmony_ci 289425bb815Sopenharmony_ci return is_x_equal_to_y; 290425bb815Sopenharmony_ci} /* ecma_op_strict_equality_compare */ 291425bb815Sopenharmony_ci 292425bb815Sopenharmony_ci/** 293425bb815Sopenharmony_ci * ECMA abstract relational comparison routine. 294425bb815Sopenharmony_ci * 295425bb815Sopenharmony_ci * See also: ECMA-262 v5, 11.8.5 296425bb815Sopenharmony_ci * 297425bb815Sopenharmony_ci * @return ecma value 298425bb815Sopenharmony_ci * Returned value must be freed with ecma_free_value 299425bb815Sopenharmony_ci */ 300425bb815Sopenharmony_ciecma_value_t 301425bb815Sopenharmony_ciecma_op_abstract_relational_compare (ecma_value_t x, /**< first operand */ 302425bb815Sopenharmony_ci ecma_value_t y, /**< second operand */ 303425bb815Sopenharmony_ci bool left_first) /**< 'LeftFirst' flag */ 304425bb815Sopenharmony_ci{ 305425bb815Sopenharmony_ci ecma_value_t ret_value = ECMA_VALUE_EMPTY; 306425bb815Sopenharmony_ci 307425bb815Sopenharmony_ci /* 1., 2. */ 308425bb815Sopenharmony_ci ecma_value_t prim_first_converted_value = ecma_op_to_primitive (x, ECMA_PREFERRED_TYPE_NUMBER); 309425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (prim_first_converted_value)) 310425bb815Sopenharmony_ci { 311425bb815Sopenharmony_ci return prim_first_converted_value; 312425bb815Sopenharmony_ci } 313425bb815Sopenharmony_ci 314425bb815Sopenharmony_ci ecma_value_t prim_second_converted_value = ecma_op_to_primitive (y, ECMA_PREFERRED_TYPE_NUMBER); 315425bb815Sopenharmony_ci if (ECMA_IS_VALUE_ERROR (prim_second_converted_value)) 316425bb815Sopenharmony_ci { 317425bb815Sopenharmony_ci ecma_free_value (prim_first_converted_value); 318425bb815Sopenharmony_ci return prim_second_converted_value; 319425bb815Sopenharmony_ci } 320425bb815Sopenharmony_ci 321425bb815Sopenharmony_ci const ecma_value_t px = left_first ? prim_first_converted_value : prim_second_converted_value; 322425bb815Sopenharmony_ci const ecma_value_t py = left_first ? prim_second_converted_value : prim_first_converted_value; 323425bb815Sopenharmony_ci 324425bb815Sopenharmony_ci const bool is_px_string = ecma_is_value_string (px); 325425bb815Sopenharmony_ci const bool is_py_string = ecma_is_value_string (py); 326425bb815Sopenharmony_ci 327425bb815Sopenharmony_ci if (!(is_px_string && is_py_string)) 328425bb815Sopenharmony_ci { 329425bb815Sopenharmony_ci /* 3. */ 330425bb815Sopenharmony_ci 331425bb815Sopenharmony_ci /* a. */ 332425bb815Sopenharmony_ci ECMA_OP_TO_NUMBER_TRY_CATCH (nx, px, ret_value); 333425bb815Sopenharmony_ci ECMA_OP_TO_NUMBER_TRY_CATCH (ny, py, ret_value); 334425bb815Sopenharmony_ci 335425bb815Sopenharmony_ci /* b. */ 336425bb815Sopenharmony_ci if (ecma_number_is_nan (nx) 337425bb815Sopenharmony_ci || ecma_number_is_nan (ny)) 338425bb815Sopenharmony_ci { 339425bb815Sopenharmony_ci /* c., d. */ 340425bb815Sopenharmony_ci ret_value = ECMA_VALUE_UNDEFINED; 341425bb815Sopenharmony_ci } 342425bb815Sopenharmony_ci else 343425bb815Sopenharmony_ci { 344425bb815Sopenharmony_ci bool is_x_less_than_y = (nx < ny); 345425bb815Sopenharmony_ci 346425bb815Sopenharmony_ci#ifndef JERRY_NDEBUG 347425bb815Sopenharmony_ci bool is_x_less_than_y_check; 348425bb815Sopenharmony_ci 349425bb815Sopenharmony_ci if (nx == ny 350425bb815Sopenharmony_ci || (ecma_number_is_zero (nx) 351425bb815Sopenharmony_ci && ecma_number_is_zero (ny))) 352425bb815Sopenharmony_ci { 353425bb815Sopenharmony_ci /* e., f., g. */ 354425bb815Sopenharmony_ci is_x_less_than_y_check = false; 355425bb815Sopenharmony_ci } 356425bb815Sopenharmony_ci else if (ecma_number_is_infinity (nx) 357425bb815Sopenharmony_ci && !ecma_number_is_negative (nx)) 358425bb815Sopenharmony_ci { 359425bb815Sopenharmony_ci /* h. */ 360425bb815Sopenharmony_ci is_x_less_than_y_check = false; 361425bb815Sopenharmony_ci } 362425bb815Sopenharmony_ci else if (ecma_number_is_infinity (ny) 363425bb815Sopenharmony_ci && !ecma_number_is_negative (ny)) 364425bb815Sopenharmony_ci { 365425bb815Sopenharmony_ci /* i. */ 366425bb815Sopenharmony_ci is_x_less_than_y_check = true; 367425bb815Sopenharmony_ci } 368425bb815Sopenharmony_ci else if (ecma_number_is_infinity (ny) 369425bb815Sopenharmony_ci && ecma_number_is_negative (ny)) 370425bb815Sopenharmony_ci { 371425bb815Sopenharmony_ci /* j. */ 372425bb815Sopenharmony_ci is_x_less_than_y_check = false; 373425bb815Sopenharmony_ci } 374425bb815Sopenharmony_ci else if (ecma_number_is_infinity (nx) 375425bb815Sopenharmony_ci && ecma_number_is_negative (nx)) 376425bb815Sopenharmony_ci { 377425bb815Sopenharmony_ci /* k. */ 378425bb815Sopenharmony_ci is_x_less_than_y_check = true; 379425bb815Sopenharmony_ci } 380425bb815Sopenharmony_ci else 381425bb815Sopenharmony_ci { 382425bb815Sopenharmony_ci /* l. */ 383425bb815Sopenharmony_ci JERRY_ASSERT (!ecma_number_is_nan (nx) 384425bb815Sopenharmony_ci && !ecma_number_is_infinity (nx)); 385425bb815Sopenharmony_ci JERRY_ASSERT (!ecma_number_is_nan (ny) 386425bb815Sopenharmony_ci && !ecma_number_is_infinity (ny)); 387425bb815Sopenharmony_ci JERRY_ASSERT (!(ecma_number_is_zero (nx) 388425bb815Sopenharmony_ci && ecma_number_is_zero (ny))); 389425bb815Sopenharmony_ci 390425bb815Sopenharmony_ci if (nx < ny) 391425bb815Sopenharmony_ci { 392425bb815Sopenharmony_ci is_x_less_than_y_check = true; 393425bb815Sopenharmony_ci } 394425bb815Sopenharmony_ci else 395425bb815Sopenharmony_ci { 396425bb815Sopenharmony_ci is_x_less_than_y_check = false; 397425bb815Sopenharmony_ci } 398425bb815Sopenharmony_ci } 399425bb815Sopenharmony_ci 400425bb815Sopenharmony_ci JERRY_ASSERT (is_x_less_than_y_check == is_x_less_than_y); 401425bb815Sopenharmony_ci#endif /* !JERRY_NDEBUG */ 402425bb815Sopenharmony_ci 403425bb815Sopenharmony_ci ret_value = ecma_make_boolean_value (is_x_less_than_y); 404425bb815Sopenharmony_ci } 405425bb815Sopenharmony_ci 406425bb815Sopenharmony_ci ECMA_OP_TO_NUMBER_FINALIZE (ny); 407425bb815Sopenharmony_ci ECMA_OP_TO_NUMBER_FINALIZE (nx); 408425bb815Sopenharmony_ci } 409425bb815Sopenharmony_ci else 410425bb815Sopenharmony_ci { /* 4. */ 411425bb815Sopenharmony_ci JERRY_ASSERT (is_px_string && is_py_string); 412425bb815Sopenharmony_ci 413425bb815Sopenharmony_ci ecma_string_t *str_x_p = ecma_get_string_from_value (px); 414425bb815Sopenharmony_ci ecma_string_t *str_y_p = ecma_get_string_from_value (py); 415425bb815Sopenharmony_ci 416425bb815Sopenharmony_ci bool is_px_less = ecma_compare_ecma_strings_relational (str_x_p, str_y_p); 417425bb815Sopenharmony_ci 418425bb815Sopenharmony_ci ret_value = ecma_make_boolean_value (is_px_less); 419425bb815Sopenharmony_ci } 420425bb815Sopenharmony_ci 421425bb815Sopenharmony_ci ecma_free_value (prim_second_converted_value); 422425bb815Sopenharmony_ci ecma_free_value (prim_first_converted_value); 423425bb815Sopenharmony_ci 424425bb815Sopenharmony_ci return ret_value; 425425bb815Sopenharmony_ci} /* ecma_op_abstract_relational_compare */ 426425bb815Sopenharmony_ci 427425bb815Sopenharmony_ci/** 428425bb815Sopenharmony_ci * @} 429425bb815Sopenharmony_ci * @} 430425bb815Sopenharmony_ci */ 431