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:
committed by
Robert Fancsik
parent
b7aa21ebc7
commit
4b352758c1
@@ -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 */
|
||||
|
||||
/**
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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. */
|
||||
|
||||
Reference in New Issue
Block a user