Remove string copy
Changed 'ecma_copy_or_ref_ecma_string' to 'ecma_ref_ecma_string'. It does not copy the string if the maximum number of reference counter is reached, but bails out with an error like the 'ecma_ref_object' function does. JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com
This commit is contained in:
@@ -167,7 +167,7 @@ ecma_init_gc_info (ecma_object_t *object_p) /**< object */
|
||||
void
|
||||
ecma_ref_object (ecma_object_t *object_p) /**< object */
|
||||
{
|
||||
if (object_p->type_flags_refs < ECMA_OBJECT_MAX_REF)
|
||||
if (likely (object_p->type_flags_refs < ECMA_OBJECT_MAX_REF))
|
||||
{
|
||||
object_p->type_flags_refs = (uint16_t) (object_p->type_flags_refs + ECMA_OBJECT_REF_ONE);
|
||||
}
|
||||
|
||||
@@ -384,11 +384,11 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */
|
||||
|
||||
if (str1_size == 0)
|
||||
{
|
||||
return ecma_copy_or_ref_ecma_string (string2_p);
|
||||
return ecma_ref_ecma_string (string2_p);
|
||||
}
|
||||
else if (str2_size == 0)
|
||||
{
|
||||
return ecma_copy_or_ref_ecma_string (string1_p);
|
||||
return ecma_ref_ecma_string (string1_p);
|
||||
}
|
||||
|
||||
const lit_utf8_size_t new_size = str1_size + str2_size;
|
||||
@@ -442,83 +442,6 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */
|
||||
return string_desc_p;
|
||||
} /* ecma_concat_ecma_strings */
|
||||
|
||||
/**
|
||||
* Copy ecma-string
|
||||
*
|
||||
* @return pointer to copy of ecma-string with reference counter set to 1
|
||||
*/
|
||||
static ecma_string_t *
|
||||
ecma_copy_ecma_string (ecma_string_t *string_desc_p) /**< string descriptor */
|
||||
{
|
||||
JERRY_ASSERT (string_desc_p != NULL);
|
||||
JERRY_ASSERT (string_desc_p->refs_and_container >= ECMA_STRING_REF_ONE);
|
||||
|
||||
ecma_string_t *new_str_p;
|
||||
|
||||
switch (ECMA_STRING_GET_CONTAINER (string_desc_p))
|
||||
{
|
||||
case ECMA_STRING_CONTAINER_LIT_TABLE:
|
||||
case ECMA_STRING_CONTAINER_UINT32_IN_DESC:
|
||||
case ECMA_STRING_CONTAINER_MAGIC_STRING:
|
||||
case ECMA_STRING_CONTAINER_MAGIC_STRING_EX:
|
||||
{
|
||||
new_str_p = ecma_alloc_string ();
|
||||
|
||||
*new_str_p = *string_desc_p;
|
||||
|
||||
new_str_p->refs_and_container = ECMA_STRING_SET_REF_TO_ONE (new_str_p->refs_and_container);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ECMA_STRING_CONTAINER_HEAP_UTF8_STRING:
|
||||
{
|
||||
new_str_p = ecma_alloc_string ();
|
||||
*new_str_p = *string_desc_p;
|
||||
new_str_p->refs_and_container = ECMA_STRING_SET_REF_TO_ONE (new_str_p->refs_and_container);
|
||||
|
||||
const ecma_string_heap_header_t *data_p = ECMA_GET_NON_NULL_POINTER (ecma_string_heap_header_t,
|
||||
string_desc_p->u.utf8_collection_cp);
|
||||
JERRY_ASSERT (data_p != NULL);
|
||||
const size_t data_size = data_p->size + sizeof (ecma_string_heap_header_t);
|
||||
ecma_string_heap_header_t *new_data_p = (ecma_string_heap_header_t *) jmem_heap_alloc_block (data_size);
|
||||
memcpy (new_data_p, data_p, data_size);
|
||||
|
||||
ECMA_SET_NON_NULL_POINTER (new_str_p->u.utf8_collection_cp, new_data_p);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ECMA_STRING_CONTAINER_HEAP_ASCII_STRING:
|
||||
{
|
||||
new_str_p = ecma_alloc_string ();
|
||||
*new_str_p = *string_desc_p;
|
||||
new_str_p->refs_and_container = ECMA_STRING_SET_REF_TO_ONE (new_str_p->refs_and_container);
|
||||
|
||||
const lit_utf8_byte_t *data_p = ECMA_GET_NON_NULL_POINTER (lit_utf8_byte_t,
|
||||
string_desc_p->u.ascii_string.ascii_collection_cp);
|
||||
|
||||
JERRY_ASSERT (data_p != NULL);
|
||||
const size_t data_size = string_desc_p->u.ascii_string.size;
|
||||
lit_utf8_byte_t *new_data_p = (lit_utf8_byte_t *) jmem_heap_alloc_block (data_size);
|
||||
memcpy (new_data_p, data_p, data_size);
|
||||
|
||||
ECMA_SET_NON_NULL_POINTER (new_str_p->u.ascii_string.ascii_collection_cp, new_data_p);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
JERRY_UNREACHABLE ();
|
||||
}
|
||||
}
|
||||
|
||||
JERRY_ASSERT (ecma_compare_ecma_strings (string_desc_p, new_str_p));
|
||||
|
||||
return new_str_p;
|
||||
} /* ecma_copy_ecma_string */
|
||||
|
||||
/**
|
||||
* Increase reference counter of ecma-string.
|
||||
*
|
||||
@@ -526,27 +449,23 @@ ecma_copy_ecma_string (ecma_string_t *string_desc_p) /**< string descriptor */
|
||||
* or the ecma-string's copy with reference counter set to 1
|
||||
*/
|
||||
ecma_string_t *
|
||||
ecma_copy_or_ref_ecma_string (ecma_string_t *string_p) /**< string descriptor */
|
||||
ecma_ref_ecma_string (ecma_string_t *string_p) /**< string descriptor */
|
||||
{
|
||||
JERRY_ASSERT (string_p != NULL);
|
||||
JERRY_ASSERT (string_p->refs_and_container >= ECMA_STRING_REF_ONE);
|
||||
|
||||
if (unlikely (string_p->refs_and_container >= ECMA_STRING_MAX_REF))
|
||||
if (likely (string_p->refs_and_container < ECMA_STRING_MAX_REF))
|
||||
{
|
||||
/* First trying to free unreachable objects that maybe refer to the string */
|
||||
ecma_gc_run ();
|
||||
|
||||
if (string_p->refs_and_container >= ECMA_STRING_MAX_REF)
|
||||
{
|
||||
/* reference counter was not changed during GC, copying string */
|
||||
return ecma_copy_ecma_string (string_p);
|
||||
}
|
||||
/* Increase reference counter. */
|
||||
string_p->refs_and_container = (uint16_t) (string_p->refs_and_container + ECMA_STRING_REF_ONE);
|
||||
}
|
||||
else
|
||||
{
|
||||
jerry_fatal (ERR_REF_COUNT_LIMIT);
|
||||
}
|
||||
|
||||
/* Increase reference counter. */
|
||||
string_p->refs_and_container = (uint16_t) (string_p->refs_and_container + ECMA_STRING_REF_ONE);
|
||||
return string_p;
|
||||
} /* ecma_copy_or_ref_ecma_string */
|
||||
} /* ecma_ref_ecma_string */
|
||||
|
||||
/**
|
||||
* Decrease reference counter and deallocate ecma-string
|
||||
|
||||
@@ -637,7 +637,7 @@ ecma_copy_value (ecma_value_t value) /**< value description */
|
||||
}
|
||||
case ECMA_TYPE_STRING:
|
||||
{
|
||||
return ecma_make_string_value (ecma_copy_or_ref_ecma_string (ecma_get_string_from_value (value)));
|
||||
return ecma_make_string_value (ecma_ref_ecma_string (ecma_get_string_from_value (value)));
|
||||
}
|
||||
case ECMA_TYPE_OBJECT:
|
||||
{
|
||||
|
||||
@@ -584,7 +584,7 @@ ecma_create_named_data_property (ecma_object_t *object_p, /**< object */
|
||||
|
||||
uint8_t type_and_flags = ECMA_PROPERTY_TYPE_NAMEDDATA | prop_attributes;
|
||||
|
||||
name_p = ecma_copy_or_ref_ecma_string (name_p);
|
||||
name_p = ecma_ref_ecma_string (name_p);
|
||||
|
||||
ecma_property_value_t value;
|
||||
value.value = ecma_make_simple_value (ECMA_SIMPLE_VALUE_UNDEFINED);
|
||||
@@ -610,7 +610,7 @@ ecma_create_named_accessor_property (ecma_object_t *object_p, /**< object */
|
||||
|
||||
uint8_t type_and_flags = ECMA_PROPERTY_TYPE_NAMEDACCESSOR | prop_attributes;
|
||||
|
||||
name_p = ecma_copy_or_ref_ecma_string (name_p);
|
||||
name_p = ecma_ref_ecma_string (name_p);
|
||||
|
||||
ecma_property_value_t value;
|
||||
ECMA_SET_POINTER (value.getter_setter_pair.getter_p, get_p);
|
||||
|
||||
@@ -169,7 +169,7 @@ extern ecma_string_t *ecma_new_ecma_string_from_lit_cp (lit_cpointer_t);
|
||||
extern ecma_string_t *ecma_new_ecma_string_from_magic_string_id (lit_magic_string_id_t);
|
||||
extern ecma_string_t *ecma_new_ecma_string_from_magic_string_ex_id (lit_magic_string_ex_id_t);
|
||||
extern ecma_string_t *ecma_concat_ecma_strings (ecma_string_t *, ecma_string_t *);
|
||||
extern ecma_string_t *ecma_copy_or_ref_ecma_string (ecma_string_t *);
|
||||
extern ecma_string_t *ecma_ref_ecma_string (ecma_string_t *);
|
||||
extern void ecma_deref_ecma_string (ecma_string_t *);
|
||||
extern ecma_number_t ecma_string_to_number (const ecma_string_t *);
|
||||
extern bool ecma_string_get_array_index (const ecma_string_t *, uint32_t *);
|
||||
|
||||
@@ -175,7 +175,7 @@ ecma_builtin_array_prototype_object_to_locale_string (const ecma_value_t this_ar
|
||||
ecma_builtin_helper_get_to_locale_string_at_index (obj_p, 0),
|
||||
ret_value);
|
||||
|
||||
ecma_string_t *return_string_p = ecma_copy_or_ref_ecma_string (ecma_get_string_from_value (first_value));
|
||||
ecma_string_t *return_string_p = ecma_ref_ecma_string (ecma_get_string_from_value (first_value));
|
||||
|
||||
/* 9-10. */
|
||||
for (uint32_t k = 1; ecma_is_value_empty (ret_value) && (k < length); k++)
|
||||
@@ -402,7 +402,7 @@ ecma_builtin_array_prototype_join (const ecma_value_t this_arg, /**< this argume
|
||||
ecma_op_array_get_to_string_at_index (obj_p, 0),
|
||||
ret_value);
|
||||
|
||||
ecma_string_t *return_string_p = ecma_copy_or_ref_ecma_string (ecma_get_string_from_value (first_value));
|
||||
ecma_string_t *return_string_p = ecma_ref_ecma_string (ecma_get_string_from_value (first_value));
|
||||
|
||||
/* 9-10. */
|
||||
for (uint32_t k = 1; ecma_is_value_empty (ret_value) && (k < length); k++)
|
||||
|
||||
@@ -125,11 +125,11 @@ ecma_builtin_error_prototype_object_to_string (ecma_value_t this_arg) /**< this
|
||||
|
||||
if (ecma_string_get_length (name_string_p) == 0)
|
||||
{
|
||||
ret_str_p = ecma_copy_or_ref_ecma_string (msg_string_p);
|
||||
ret_str_p = ecma_ref_ecma_string (msg_string_p);
|
||||
}
|
||||
else if (ecma_string_get_length (msg_string_p) == 0)
|
||||
{
|
||||
ret_str_p = ecma_copy_or_ref_ecma_string (name_string_p);
|
||||
ret_str_p = ecma_ref_ecma_string (name_string_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -992,7 +992,7 @@ ecma_builtin_json_stringify (ecma_value_t this_arg, /**< 'this' argument */
|
||||
|
||||
if (num_of_chars < 10)
|
||||
{
|
||||
context.gap_str_p = ecma_copy_or_ref_ecma_string (space_str_p);
|
||||
context.gap_str_p = ecma_ref_ecma_string (space_str_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1061,7 +1061,7 @@ ecma_builtin_json_quote (ecma_string_t *string_p) /**< string that should be quo
|
||||
{
|
||||
/* 1. */
|
||||
ecma_string_t *quote_str_p = ecma_get_magic_string (LIT_MAGIC_STRING_DOUBLE_QUOTE_CHAR);
|
||||
ecma_string_t *product_str_p = ecma_copy_or_ref_ecma_string (quote_str_p);
|
||||
ecma_string_t *product_str_p = ecma_ref_ecma_string (quote_str_p);
|
||||
ecma_string_t *tmp_str_p;
|
||||
|
||||
ECMA_STRING_TO_UTF8_STRING (string_p, string_buff, string_buff_size);
|
||||
|
||||
@@ -168,7 +168,7 @@ ecma_builtin_regexp_prototype_compile (ecma_value_t this_arg, /**< this argument
|
||||
}
|
||||
else
|
||||
{
|
||||
pattern_string_p = ecma_copy_or_ref_ecma_string (ecma_get_string_from_value (regexp_str_value));
|
||||
pattern_string_p = ecma_ref_ecma_string (ecma_get_string_from_value (regexp_str_value));
|
||||
}
|
||||
|
||||
ECMA_FINALIZE (regexp_str_value);
|
||||
@@ -380,7 +380,7 @@ ecma_builtin_regexp_prototype_to_string (ecma_value_t this_arg) /**< this argume
|
||||
|
||||
ecma_string_t *src_sep_str_p = ecma_get_magic_string (LIT_MAGIC_STRING_SLASH_CHAR);
|
||||
ecma_string_t *source_str_p = ecma_get_string_from_value (ecma_get_named_data_property_value (source_prop_p));
|
||||
ecma_string_t *output_str_p = ecma_concat_ecma_strings (src_sep_str_p, ecma_copy_or_ref_ecma_string (source_str_p));
|
||||
ecma_string_t *output_str_p = ecma_concat_ecma_strings (src_sep_str_p, ecma_ref_ecma_string (source_str_p));
|
||||
ecma_deref_ecma_string (source_str_p);
|
||||
|
||||
ecma_string_t *concat_p = ecma_concat_ecma_strings (output_str_p, src_sep_str_p);
|
||||
|
||||
@@ -109,7 +109,7 @@ ecma_builtin_regexp_dispatch_construct (const ecma_value_t *arguments_list_p, /*
|
||||
}
|
||||
else
|
||||
{
|
||||
pattern_string_p = ecma_copy_or_ref_ecma_string (ecma_get_string_from_value (regexp_str_value));
|
||||
pattern_string_p = ecma_ref_ecma_string (ecma_get_string_from_value (regexp_str_value));
|
||||
}
|
||||
|
||||
ECMA_FINALIZE (regexp_str_value);
|
||||
@@ -125,7 +125,7 @@ ecma_builtin_regexp_dispatch_construct (const ecma_value_t *arguments_list_p, /*
|
||||
ecma_op_to_string (flags_value),
|
||||
ret_value);
|
||||
|
||||
flags_string_p = ecma_copy_or_ref_ecma_string (ecma_get_string_from_value (flags_str_value));
|
||||
flags_string_p = ecma_ref_ecma_string (ecma_get_string_from_value (flags_str_value));
|
||||
ECMA_FINALIZE (flags_str_value);
|
||||
}
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@ ecma_builtin_string_prototype_object_to_string (ecma_value_t this_arg) /**< this
|
||||
ecma_string_t *prim_value_str_p;
|
||||
prim_value_str_p = ecma_get_string_from_value (ecma_get_internal_property_value (prim_value_prop_p));
|
||||
|
||||
prim_value_str_p = ecma_copy_or_ref_ecma_string (prim_value_str_p);
|
||||
prim_value_str_p = ecma_ref_ecma_string (prim_value_str_p);
|
||||
|
||||
return ecma_make_string_value (prim_value_str_p);
|
||||
}
|
||||
@@ -253,7 +253,7 @@ ecma_builtin_string_prototype_object_concat (ecma_value_t this_arg, /**< this ar
|
||||
// No copy performed
|
||||
|
||||
/* 4 */
|
||||
ecma_string_t *string_to_return = ecma_copy_or_ref_ecma_string (ecma_get_string_from_value (to_string_val));
|
||||
ecma_string_t *string_to_return = ecma_ref_ecma_string (ecma_get_string_from_value (to_string_val));
|
||||
|
||||
/* 5 */
|
||||
for (uint32_t arg_index = 0;
|
||||
@@ -659,7 +659,7 @@ ecma_builtin_string_prototype_object_replace_append_substr (ecma_string_t *base_
|
||||
}
|
||||
else
|
||||
{
|
||||
ret_string_p = ecma_copy_or_ref_ecma_string (base_string_p);
|
||||
ret_string_p = ecma_ref_ecma_string (base_string_p);
|
||||
}
|
||||
|
||||
return ret_string_p;
|
||||
|
||||
@@ -336,7 +336,7 @@ ecma_op_to_string (ecma_value_t value) /**< ecma value */
|
||||
if (ecma_is_value_string (value))
|
||||
{
|
||||
res_p = ecma_get_string_from_value (value);
|
||||
res_p = ecma_copy_or_ref_ecma_string (res_p);
|
||||
res_p = ecma_ref_ecma_string (res_p);
|
||||
}
|
||||
else if (ecma_is_value_integer_number (value))
|
||||
{
|
||||
|
||||
@@ -123,7 +123,7 @@ ecma_new_standard_error_with_message (ecma_standard_error_t error_type, /**< nat
|
||||
ECMA_PROPERTY_CONFIGURABLE_WRITABLE);
|
||||
|
||||
ecma_set_named_data_property_value (prop_p,
|
||||
ecma_make_string_value (ecma_copy_or_ref_ecma_string (message_string_p)));
|
||||
ecma_make_string_value (ecma_ref_ecma_string (message_string_p)));
|
||||
ecma_deref_ecma_string (message_magic_string_p);
|
||||
|
||||
return new_error_obj_p;
|
||||
|
||||
@@ -751,7 +751,7 @@ ecma_op_object_get_property_names (ecma_object_t *obj_p, /**< object */
|
||||
|
||||
JERRY_ASSERT (name_pos > 0
|
||||
&& name_pos <= array_index_named_properties_count + string_named_properties_count);
|
||||
names_p[--name_pos] = ecma_copy_or_ref_ecma_string (name_p);
|
||||
names_p[--name_pos] = ecma_ref_ecma_string (name_p);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -96,7 +96,7 @@ ecma_make_reference (ecma_value_t base, /**< base value */
|
||||
ecma_string_t *name_p, /**< referenced name */
|
||||
bool is_strict) /**< strict reference flag */
|
||||
{
|
||||
name_p = ecma_copy_or_ref_ecma_string (name_p);
|
||||
name_p = ecma_ref_ecma_string (name_p);
|
||||
|
||||
ecma_reference_t ref;
|
||||
ref.base = ecma_copy_value (base);
|
||||
|
||||
@@ -142,7 +142,7 @@ ecma_op_string_object_get_own_property (ecma_object_t *obj_p, /**< a String obje
|
||||
{
|
||||
uint32_index = property_name_p->u.uint32_number;
|
||||
|
||||
new_prop_name_p = ecma_copy_or_ref_ecma_string (property_name_p);
|
||||
new_prop_name_p = ecma_ref_ecma_string (property_name_p);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+1
-1
@@ -357,7 +357,7 @@ jerry_acquire_string (jerry_string_t *string_p) /**< pointer passed to function
|
||||
{
|
||||
jerry_assert_api_available ();
|
||||
|
||||
return ecma_copy_or_ref_ecma_string (string_p);
|
||||
return ecma_ref_ecma_string (string_p);
|
||||
} /* jerry_acquire_string */
|
||||
|
||||
/**
|
||||
|
||||
@@ -577,7 +577,7 @@ re_compile_bytecode (const re_compiled_code_t **out_bytecode_p, /**< [out] point
|
||||
re_compiled_code.header.refs = 1;
|
||||
re_compiled_code.header.status_flags = re_ctx.flags;
|
||||
ECMA_SET_NON_NULL_POINTER (re_compiled_code.pattern_cp,
|
||||
ecma_copy_or_ref_ecma_string (pattern_str_p));
|
||||
ecma_ref_ecma_string (pattern_str_p));
|
||||
re_compiled_code.num_of_captures = re_ctx.num_of_captures * 2;
|
||||
re_compiled_code.num_of_non_captures = re_ctx.num_of_non_captures;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user