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