Remove duplicate is_object check when calling ecma_op_to_primtive (#3899)

JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu
This commit is contained in:
Szilagyi Adam 2020-06-30 13:18:40 +02:00 committed by GitHub
parent 034b3b63f5
commit c0b594fa69
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 104 additions and 89 deletions

View File

@ -16,6 +16,7 @@
#include "ecma-comparison.h"
#include "ecma-conversion.h"
#include "ecma-globals.h"
#include "ecma-objects.h"
#include "ecma-try-catch-macro.h"
#include "jrt.h"
@ -150,33 +151,6 @@ ecma_op_abstract_equality_compare (ecma_value_t x, /**< first operand */
return ecma_op_abstract_equality_compare (x, ecma_make_integer_value (ecma_is_value_true (y) ? 1 : 0));
}
if (ecma_is_value_object (x))
{
if (ecma_is_value_string (y)
#if ENABLED (JERRY_ESNEXT)
|| ecma_is_value_symbol (y)
#endif /* ENABLED (JERRY_ESNEXT) */
|| ecma_is_value_number (y))
{
/* 9. */
ecma_value_t x_prim_value = ecma_op_to_primitive (x, ECMA_PREFERRED_TYPE_NO);
if (ECMA_IS_VALUE_ERROR (x_prim_value))
{
return x_prim_value;
}
ecma_value_t compare_result = ecma_op_abstract_equality_compare (x_prim_value, y);
ecma_free_value (x_prim_value);
return compare_result;
}
/* 1., f. */
/* Note: the (x == y) comparison captures the true case. */
return ECMA_VALUE_FALSE;
}
if (ecma_is_value_boolean (x))
{
/* 6. */
@ -193,6 +167,31 @@ ecma_op_abstract_equality_compare (ecma_value_t x, /**< first operand */
return ecma_make_boolean_value (is_equal);
}
JERRY_ASSERT (ecma_is_value_object (x));
if (ecma_is_value_string (y)
#if ENABLED (JERRY_ESNEXT)
|| ecma_is_value_symbol (y)
#endif /* ENABLED (JERRY_ESNEXT) */
|| ecma_is_value_number (y))
{
/* 9. */
ecma_object_t *obj_p = ecma_get_object_from_value (x);
ecma_value_t def_value = ecma_op_object_default_value (obj_p, ECMA_PREFERRED_TYPE_NO);
if (ECMA_IS_VALUE_ERROR (def_value))
{
return def_value;
}
ecma_value_t compare_result = ecma_op_abstract_equality_compare (def_value, y);
ecma_free_value (def_value);
return compare_result;
}
return ECMA_VALUE_FALSE;
} /* ecma_op_abstract_equality_compare */

View File

@ -287,39 +287,37 @@ ecma_op_to_number (ecma_value_t value) /**< ecma value */
}
#endif /* ENABLED (JERRY_ESNEXT) */
if (ecma_is_value_object (value))
{
ecma_value_t primitive_value = ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_NUMBER);
if (ECMA_IS_VALUE_ERROR (primitive_value))
{
return primitive_value;
}
ecma_value_t ret_value = ecma_op_to_number (primitive_value);
ecma_fast_free_value (primitive_value);
return ret_value;
}
if (ecma_is_value_undefined (value))
{
return ecma_make_nan_value ();
}
ecma_integer_value_t num = 0;
if (ecma_is_value_null (value))
{
num = 0;
return ecma_make_integer_value (0);
}
else
if (ecma_is_value_boolean (value))
{
JERRY_ASSERT (ecma_is_value_boolean (value));
num = ecma_is_value_true (value) ? 1 : 0;
return ecma_make_integer_value (ecma_is_value_true (value) ? 1 : 0);
}
return ecma_make_integer_value (num);
JERRY_ASSERT (ecma_is_value_object (value));
ecma_object_t *obj_p = ecma_get_object_from_value (value);
ecma_value_t def_value = ecma_op_object_default_value (obj_p, ECMA_PREFERRED_TYPE_NUMBER);
if (ECMA_IS_VALUE_ERROR (def_value))
{
return def_value;
}
ecma_value_t ret_value = ecma_op_to_number (def_value);
ecma_fast_free_value (def_value);
return ret_value;
} /* ecma_op_to_number */
/**
@ -355,20 +353,6 @@ ecma_get_number (ecma_value_t value, /**< ecma value*/
return ECMA_VALUE_EMPTY;
}
if (ecma_is_value_object (value))
{
ecma_value_t primitive_value = ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_NUMBER);
if (ECMA_IS_VALUE_ERROR (primitive_value))
{
return primitive_value;
}
ecma_value_t ret_value = ecma_get_number (primitive_value, number_p);
ecma_fast_free_value (primitive_value);
return ret_value;
}
if (ecma_is_value_undefined (value))
{
*number_p = ecma_number_make_nan ();
@ -388,10 +372,34 @@ ecma_get_number (ecma_value_t value, /**< ecma value*/
}
#endif /* ENABLED (JERRY_ESNEXT) */
JERRY_ASSERT (ecma_is_value_boolean (value));
if (ecma_is_value_true (value))
{
*number_p = 1;
return ECMA_VALUE_EMPTY;
}
*number_p = ecma_is_value_true (value) ? 1 : 0;
return ECMA_VALUE_EMPTY;
if (ecma_is_value_false (value))
{
*number_p = 0;
return ECMA_VALUE_EMPTY;
}
JERRY_ASSERT (ecma_is_value_object (value));
ecma_object_t *obj_p = ecma_get_object_from_value (value);
ecma_value_t def_value = ecma_op_object_default_value (obj_p, ECMA_PREFERRED_TYPE_NUMBER);
if (ECMA_IS_VALUE_ERROR (def_value))
{
return def_value;
}
ecma_value_t ret_value = ecma_get_number (def_value, number_p);
ecma_fast_free_value (def_value);
return ret_value;
} /* ecma_get_number */
/**
@ -408,29 +416,14 @@ ecma_op_to_string (ecma_value_t value) /**< ecma value */
{
ecma_check_value_type_is_spec_defined (value);
if (JERRY_UNLIKELY (ecma_is_value_object (value)))
{
ecma_value_t prim_value = ecma_op_to_primitive (value, ECMA_PREFERRED_TYPE_STRING);
if (ECMA_IS_VALUE_ERROR (prim_value))
{
return NULL;
}
ecma_string_t *ret_string_p = ecma_op_to_string (prim_value);
ecma_free_value (prim_value);
return ret_string_p;
}
if (ecma_is_value_string (value))
{
ecma_string_t *res_p = ecma_get_string_from_value (value);
ecma_ref_ecma_string (res_p);
return res_p;
}
else if (ecma_is_value_integer_number (value))
if (ecma_is_value_integer_number (value))
{
ecma_integer_value_t num = ecma_get_integer_from_value (value);
@ -443,34 +436,57 @@ ecma_op_to_string (ecma_value_t value) /**< ecma value */
return ecma_new_ecma_string_from_uint32 ((uint32_t) num);
}
}
else if (ecma_is_value_float_number (value))
if (ecma_is_value_float_number (value))
{
ecma_number_t num = ecma_get_float_from_value (value);
return ecma_new_ecma_string_from_number (num);
}
else if (ecma_is_value_undefined (value))
if (ecma_is_value_undefined (value))
{
return ecma_get_magic_string (LIT_MAGIC_STRING_UNDEFINED);
}
else if (ecma_is_value_null (value))
if (ecma_is_value_null (value))
{
return ecma_get_magic_string (LIT_MAGIC_STRING_NULL);
}
#if ENABLED (JERRY_ESNEXT)
else if (ecma_is_value_symbol (value))
if (ecma_is_value_symbol (value))
{
ecma_raise_type_error (ECMA_ERR_MSG ("Cannot convert a Symbol value to a string."));
return NULL;
}
#endif /* ENABLED (JERRY_ESNEXT) */
JERRY_ASSERT (ecma_is_value_boolean (value));
if (ecma_is_value_true (value))
{
return ecma_get_magic_string (LIT_MAGIC_STRING_TRUE);
}
return ecma_get_magic_string (LIT_MAGIC_STRING_FALSE);
if (ecma_is_value_false (value))
{
return ecma_get_magic_string (LIT_MAGIC_STRING_FALSE);
}
JERRY_ASSERT (ecma_is_value_object (value));
ecma_object_t *obj_p = ecma_get_object_from_value (value);
ecma_value_t def_value = ecma_op_object_default_value (obj_p, ECMA_PREFERRED_TYPE_STRING);
if (ECMA_IS_VALUE_ERROR (def_value))
{
return NULL;
}
ecma_string_t *ret_string_p = ecma_op_to_string (def_value);
ecma_free_value (def_value);
return ret_string_p;
} /* ecma_op_to_string */
/**