Refactor ecma_op_to_string (#3171)

Similar to the ecma_op_to_object rework, in this new method we
return directly with the pointer to the ecma string, and we don't
wrap the result into an ecma_value_t

JerryScript-DCO-1.0-Signed-off-by: Adam Szilagyi aszilagy@inf.u-szeged.hu
This commit is contained in:
Szilagyi Adam
2019-10-25 15:58:47 +02:00
committed by Robert Fancsik
parent b7aa21ebc7
commit 4b352758c1
25 changed files with 391 additions and 427 deletions
+6 -31
View File
@@ -430,16 +430,16 @@ ecma_get_number (ecma_value_t value, /**< ecma value*/
} /* ecma_get_number */
/**
* ToString operation helper function.
* ToString operation.
*
* See also:
* ECMA-262 v5, 9.8
*
* @return NULL - if the conversion fails
* ecma-string - otherwise
* pointer to the string descriptor - otherwise
*/
static ecma_string_t *
ecma_to_op_string_helper (ecma_value_t value) /**< ecma value */
ecma_string_t *
ecma_op_to_string (ecma_value_t value) /**< ecma value */
{
ecma_check_value_type_is_spec_defined (value);
@@ -452,7 +452,7 @@ ecma_to_op_string_helper (ecma_value_t value) /**< ecma value */
return NULL;
}
ecma_string_t *ret_string_p = ecma_to_op_string_helper (prim_value);
ecma_string_t *ret_string_p = ecma_op_to_string (prim_value);
ecma_free_value (prim_value);
@@ -506,31 +506,6 @@ ecma_to_op_string_helper (ecma_value_t value) /**< ecma value */
}
return ecma_get_magic_string (LIT_MAGIC_STRING_FALSE);
} /* ecma_to_op_string_helper */
/**
* ToString operation.
*
* See also:
* ECMA-262 v5, 9.8
*
* @return ecma value
* Returned value must be freed with ecma_free_value
*/
ecma_value_t
ecma_op_to_string (ecma_value_t value) /**< ecma value */
{
ecma_check_value_type_is_spec_defined (value);
ecma_string_t *string_p = ecma_to_op_string_helper (value);
if (JERRY_UNLIKELY (string_p == NULL))
{
/* Note: At this point the error has already been thrown. */
return ECMA_VALUE_ERROR;
}
return ecma_make_string_value (string_p);
} /* ecma_op_to_string */
/**
@@ -553,7 +528,7 @@ ecma_op_to_prop_name (ecma_value_t value) /**< ecma value */
}
#endif /* ENABLED (JERRY_ES2015) */
return ecma_to_op_string_helper (value);
return ecma_op_to_string (value);
} /* ecma_op_to_prop_name */
/**
+1 -1
View File
@@ -46,7 +46,7 @@ ecma_value_t ecma_op_to_primitive (ecma_value_t value, ecma_preferred_type_hint_
bool ecma_op_to_boolean (ecma_value_t value);
ecma_value_t ecma_op_to_number (ecma_value_t value);
ecma_value_t ecma_get_number (ecma_value_t value, ecma_number_t *number_p);
ecma_value_t ecma_op_to_string (ecma_value_t value);
ecma_string_t *ecma_op_to_string (ecma_value_t value);
ecma_string_t *ecma_op_to_prop_name (ecma_value_t value);
ecma_value_t ecma_op_to_object (ecma_value_t value);
ecma_value_t ecma_op_to_integer (ecma_value_t value, ecma_number_t *number_p);
+2 -2
View File
@@ -302,8 +302,8 @@ ecma_raise_standard_error_with_format (ecma_standard_error_t error_type, /**< er
#endif /* ENABLED (JERRY_ES2015) */
else
{
ecma_value_t str_val = ecma_op_to_string (arg_val);
arg_string_p = ecma_get_string_from_value (str_val);
arg_string_p = ecma_op_to_string (arg_val);
JERRY_ASSERT (arg_string_p != NULL);
}
/* Concat argument. */
@@ -1324,32 +1324,19 @@ cleanup_string:
* @return empty value if success, error value otherwise
* Returned value must be freed with ecma_free_value.
*/
ecma_value_t
ecma_regexp_read_pattern_str_helper (ecma_value_t pattern_arg, /**< the RegExp pattern */
ecma_string_t **pattern_string_p) /**< [out] ptr to the pattern string ptr */
ecma_string_t *
ecma_regexp_read_pattern_str_helper (ecma_value_t pattern_arg) /**< the RegExp pattern */
{
if (!ecma_is_value_undefined (pattern_arg))
{
ecma_value_t regexp_str_value = ecma_op_to_string (pattern_arg);
if (ECMA_IS_VALUE_ERROR (regexp_str_value))
ecma_string_t *pattern_string_p = ecma_op_to_string (pattern_arg);
if (JERRY_UNLIKELY (pattern_string_p == NULL) || !ecma_string_is_empty (pattern_string_p))
{
return regexp_str_value;
return pattern_string_p;
}
*pattern_string_p = ecma_get_string_from_value (regexp_str_value);
if (!ecma_string_is_empty (*pattern_string_p))
{
ecma_ref_ecma_string (*pattern_string_p);
}
ecma_free_value (regexp_str_value); // must be freed *after* ecma_ref_ecma_string
}
if (!*pattern_string_p || ecma_string_is_empty (*pattern_string_p))
{
*pattern_string_p = ecma_get_magic_string (LIT_MAGIC_STRING_EMPTY_NON_CAPTURE_GROUP);
}
return ECMA_VALUE_EMPTY;
return ecma_get_magic_string (LIT_MAGIC_STRING_EMPTY_NON_CAPTURE_GROUP);
} /* ecma_regexp_read_pattern_str_helper */
/**
@@ -90,7 +90,7 @@ typedef struct
ecma_value_t ecma_op_create_regexp_object_from_bytecode (re_compiled_code_t *bytecode_p);
ecma_value_t ecma_op_create_regexp_object (ecma_string_t *pattern_p, uint16_t flags);
ecma_value_t ecma_regexp_exec_helper (ecma_value_t regexp_value, ecma_value_t input_string, bool ignore_global);
ecma_value_t ecma_regexp_read_pattern_str_helper (ecma_value_t pattern_arg, ecma_string_t **pattern_string_p);
ecma_string_t *ecma_regexp_read_pattern_str_helper (ecma_value_t pattern_arg);
ecma_char_t ecma_regexp_canonicalize (ecma_char_t ch, bool is_ignorecase);
ecma_char_t ecma_regexp_canonicalize_char (ecma_char_t ch);
ecma_value_t ecma_regexp_parse_flags (ecma_string_t *flags_str_p, uint16_t *flags_p);
@@ -50,14 +50,14 @@ ecma_op_create_string_object (const ecma_value_t *arguments_list_p, /**< list of
if (arguments_list_len > 0)
{
prim_value = ecma_op_to_string (arguments_list_p[0]);
ecma_string_t *str_p = ecma_op_to_string (arguments_list_p[0]);
if (ECMA_IS_VALUE_ERROR (prim_value))
if (JERRY_UNLIKELY (str_p == NULL))
{
return prim_value;
return ECMA_VALUE_ERROR;
}
JERRY_ASSERT (ecma_is_value_string (prim_value));
prim_value = ecma_make_string_value (str_p);
}
#if ENABLED (JERRY_BUILTIN_STRING)
@@ -55,15 +55,15 @@ ecma_op_create_symbol (const ecma_value_t *arguments_list_p, /**< list of argume
}
else
{
string_desc = ecma_op_to_string (arguments_list_p[0]);
ecma_string_t *str_p = ecma_op_to_string (arguments_list_p[0]);
/* 4. */
if (ECMA_IS_VALUE_ERROR (string_desc))
if (JERRY_UNLIKELY (str_p == NULL))
{
return string_desc;
return ECMA_VALUE_ERROR;
}
JERRY_ASSERT (ecma_is_value_string (string_desc));
string_desc = ecma_make_string_value (str_p);
}
/* 5. */