From 0daeb2f94256b1b723329e9b994d9e47270f92ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Lang=C3=B3?= Date: Tue, 14 Jun 2016 13:51:44 +0200 Subject: [PATCH 1/2] Remove string copy MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- jerry-core/ecma/base/ecma-gc.c | 2 +- jerry-core/ecma/base/ecma-helpers-string.c | 103 ++---------------- jerry-core/ecma/base/ecma-helpers-value.c | 2 +- jerry-core/ecma/base/ecma-helpers.c | 4 +- jerry-core/ecma/base/ecma-helpers.h | 2 +- .../ecma-builtin-array-prototype.c | 4 +- .../ecma-builtin-error-prototype.c | 4 +- .../ecma/builtin-objects/ecma-builtin-json.c | 4 +- .../ecma-builtin-regexp-prototype.c | 4 +- .../builtin-objects/ecma-builtin-regexp.c | 4 +- .../ecma-builtin-string-prototype.c | 6 +- jerry-core/ecma/operations/ecma-conversion.c | 2 +- jerry-core/ecma/operations/ecma-exceptions.c | 2 +- jerry-core/ecma/operations/ecma-objects.c | 2 +- jerry-core/ecma/operations/ecma-reference.c | 2 +- .../ecma/operations/ecma-string-object.c | 2 +- jerry-core/jerry.c | 2 +- jerry-core/parser/regexp/re-compiler.c | 2 +- 18 files changed, 36 insertions(+), 117 deletions(-) diff --git a/jerry-core/ecma/base/ecma-gc.c b/jerry-core/ecma/base/ecma-gc.c index 2d86ce5346..ddf9414893 100644 --- a/jerry-core/ecma/base/ecma-gc.c +++ b/jerry-core/ecma/base/ecma-gc.c @@ -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); } diff --git a/jerry-core/ecma/base/ecma-helpers-string.c b/jerry-core/ecma/base/ecma-helpers-string.c index a54b8423d0..25faa45396 100644 --- a/jerry-core/ecma/base/ecma-helpers-string.c +++ b/jerry-core/ecma/base/ecma-helpers-string.c @@ -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 diff --git a/jerry-core/ecma/base/ecma-helpers-value.c b/jerry-core/ecma/base/ecma-helpers-value.c index c8574d380a..24d23d51bb 100644 --- a/jerry-core/ecma/base/ecma-helpers-value.c +++ b/jerry-core/ecma/base/ecma-helpers-value.c @@ -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: { diff --git a/jerry-core/ecma/base/ecma-helpers.c b/jerry-core/ecma/base/ecma-helpers.c index 4277b04b49..3a3c038b2e 100644 --- a/jerry-core/ecma/base/ecma-helpers.c +++ b/jerry-core/ecma/base/ecma-helpers.c @@ -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); diff --git a/jerry-core/ecma/base/ecma-helpers.h b/jerry-core/ecma/base/ecma-helpers.h index 7972c9c1ef..c2adb9ee2d 100644 --- a/jerry-core/ecma/base/ecma-helpers.h +++ b/jerry-core/ecma/base/ecma-helpers.h @@ -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 *); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c index 45cd563405..61f9aac47c 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c @@ -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++) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c index aac8056495..cbbe268420 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c @@ -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 { diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-json.c b/jerry-core/ecma/builtin-objects/ecma-builtin-json.c index c460859f1d..85e91ea813 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-json.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-json.c @@ -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); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c index e730c4e2b9..12c2b2ce29 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c @@ -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); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c index a72a95c237..1e4fe3c118 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c @@ -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); } diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c index 3540e95e61..91c64d2fe5 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c @@ -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; diff --git a/jerry-core/ecma/operations/ecma-conversion.c b/jerry-core/ecma/operations/ecma-conversion.c index ca6f875a17..ab56410d3c 100644 --- a/jerry-core/ecma/operations/ecma-conversion.c +++ b/jerry-core/ecma/operations/ecma-conversion.c @@ -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)) { diff --git a/jerry-core/ecma/operations/ecma-exceptions.c b/jerry-core/ecma/operations/ecma-exceptions.c index 1ab31156bf..c881600238 100644 --- a/jerry-core/ecma/operations/ecma-exceptions.c +++ b/jerry-core/ecma/operations/ecma-exceptions.c @@ -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; diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index 0a0d5d0a92..f575a76b69 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -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); } } diff --git a/jerry-core/ecma/operations/ecma-reference.c b/jerry-core/ecma/operations/ecma-reference.c index 1861063407..e17d598fb5 100644 --- a/jerry-core/ecma/operations/ecma-reference.c +++ b/jerry-core/ecma/operations/ecma-reference.c @@ -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); diff --git a/jerry-core/ecma/operations/ecma-string-object.c b/jerry-core/ecma/operations/ecma-string-object.c index b59ff24f48..be67385bb3 100644 --- a/jerry-core/ecma/operations/ecma-string-object.c +++ b/jerry-core/ecma/operations/ecma-string-object.c @@ -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 { diff --git a/jerry-core/jerry.c b/jerry-core/jerry.c index bf19e3b1cf..4932dc617e 100644 --- a/jerry-core/jerry.c +++ b/jerry-core/jerry.c @@ -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 */ /** diff --git a/jerry-core/parser/regexp/re-compiler.c b/jerry-core/parser/regexp/re-compiler.c index 448e6818df..3aee690756 100644 --- a/jerry-core/parser/regexp/re-compiler.c +++ b/jerry-core/parser/regexp/re-compiler.c @@ -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; From 8453a9ade88d1131e1e09dcfe25ce2764fa7ccc7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Lang=C3=B3?= Date: Tue, 14 Jun 2016 15:00:12 +0200 Subject: [PATCH 2/2] Change return value of 'ecma_ref_ecma_string' to void MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com --- jerry-core/ecma/base/ecma-helpers-string.c | 13 +++++-------- jerry-core/ecma/base/ecma-helpers-value.c | 3 ++- jerry-core/ecma/base/ecma-helpers.c | 4 ++-- jerry-core/ecma/base/ecma-helpers.h | 2 +- .../ecma-builtin-array-prototype.c | 6 ++++-- .../ecma-builtin-error-prototype.c | 6 ++++-- .../ecma/builtin-objects/ecma-builtin-json.c | 6 ++++-- .../ecma-builtin-regexp-prototype.c | 6 +++--- .../ecma/builtin-objects/ecma-builtin-regexp.c | 7 +++++-- .../ecma-builtin-string-prototype.c | 15 ++++++--------- jerry-core/ecma/operations/ecma-conversion.c | 2 +- jerry-core/ecma/operations/ecma-exceptions.c | 3 ++- jerry-core/ecma/operations/ecma-objects.c | 3 ++- jerry-core/ecma/operations/ecma-reference.c | 2 +- jerry-core/ecma/operations/ecma-string-object.c | 3 ++- jerry-core/jerry.c | 4 +++- jerry-core/parser/regexp/re-compiler.c | 4 ++-- 17 files changed, 49 insertions(+), 40 deletions(-) diff --git a/jerry-core/ecma/base/ecma-helpers-string.c b/jerry-core/ecma/base/ecma-helpers-string.c index 25faa45396..450501f4b1 100644 --- a/jerry-core/ecma/base/ecma-helpers-string.c +++ b/jerry-core/ecma/base/ecma-helpers-string.c @@ -384,11 +384,13 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */ if (str1_size == 0) { - return ecma_ref_ecma_string (string2_p); + ecma_ref_ecma_string (string2_p); + return string2_p; } else if (str2_size == 0) { - return ecma_ref_ecma_string (string1_p); + ecma_ref_ecma_string (string1_p); + return string1_p; } const lit_utf8_size_t new_size = str1_size + str2_size; @@ -444,11 +446,8 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */ /** * Increase reference counter of ecma-string. - * - * @return pointer to same ecma-string descriptor with increased reference counter - * or the ecma-string's copy with reference counter set to 1 */ -ecma_string_t * +void ecma_ref_ecma_string (ecma_string_t *string_p) /**< string descriptor */ { JERRY_ASSERT (string_p != NULL); @@ -463,8 +462,6 @@ ecma_ref_ecma_string (ecma_string_t *string_p) /**< string descriptor */ { jerry_fatal (ERR_REF_COUNT_LIMIT); } - - return string_p; } /* ecma_ref_ecma_string */ /** diff --git a/jerry-core/ecma/base/ecma-helpers-value.c b/jerry-core/ecma/base/ecma-helpers-value.c index 24d23d51bb..05a80883cb 100644 --- a/jerry-core/ecma/base/ecma-helpers-value.c +++ b/jerry-core/ecma/base/ecma-helpers-value.c @@ -637,7 +637,8 @@ ecma_copy_value (ecma_value_t value) /**< value description */ } case ECMA_TYPE_STRING: { - return ecma_make_string_value (ecma_ref_ecma_string (ecma_get_string_from_value (value))); + ecma_ref_ecma_string (ecma_get_string_from_value (value)); + return value; } case ECMA_TYPE_OBJECT: { diff --git a/jerry-core/ecma/base/ecma-helpers.c b/jerry-core/ecma/base/ecma-helpers.c index 3a3c038b2e..b776c2b1a4 100644 --- a/jerry-core/ecma/base/ecma-helpers.c +++ b/jerry-core/ecma/base/ecma-helpers.c @@ -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_ref_ecma_string (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_ref_ecma_string (name_p); + ecma_ref_ecma_string (name_p); ecma_property_value_t value; ECMA_SET_POINTER (value.getter_setter_pair.getter_p, get_p); diff --git a/jerry-core/ecma/base/ecma-helpers.h b/jerry-core/ecma/base/ecma-helpers.h index c2adb9ee2d..57c20f4824 100644 --- a/jerry-core/ecma/base/ecma-helpers.h +++ b/jerry-core/ecma/base/ecma-helpers.h @@ -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_ref_ecma_string (ecma_string_t *); +extern void 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 *); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c index 61f9aac47c..1ac76d8667 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-array-prototype.c @@ -175,7 +175,8 @@ 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_ref_ecma_string (ecma_get_string_from_value (first_value)); + ecma_string_t *return_string_p = ecma_get_string_from_value (first_value); + ecma_ref_ecma_string (return_string_p); /* 9-10. */ for (uint32_t k = 1; ecma_is_value_empty (ret_value) && (k < length); k++) @@ -402,7 +403,8 @@ 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_ref_ecma_string (ecma_get_string_from_value (first_value)); + ecma_string_t *return_string_p = ecma_get_string_from_value (first_value); + ecma_ref_ecma_string (return_string_p); /* 9-10. */ for (uint32_t k = 1; ecma_is_value_empty (ret_value) && (k < length); k++) diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c index cbbe268420..002c6ef70e 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-error-prototype.c @@ -125,11 +125,13 @@ 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_ref_ecma_string (msg_string_p); + ret_str_p = msg_string_p; + ecma_ref_ecma_string (ret_str_p); } else if (ecma_string_get_length (msg_string_p) == 0) { - ret_str_p = ecma_ref_ecma_string (name_string_p); + ret_str_p = name_string_p; + ecma_ref_ecma_string (ret_str_p); } else { diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-json.c b/jerry-core/ecma/builtin-objects/ecma-builtin-json.c index 85e91ea813..1e8939ea77 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-json.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-json.c @@ -992,7 +992,8 @@ ecma_builtin_json_stringify (ecma_value_t this_arg, /**< 'this' argument */ if (num_of_chars < 10) { - context.gap_str_p = ecma_ref_ecma_string (space_str_p); + ecma_ref_ecma_string (space_str_p); + context.gap_str_p = space_str_p; } else { @@ -1061,7 +1062,8 @@ 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_ref_ecma_string (quote_str_p); + ecma_ref_ecma_string (quote_str_p); + ecma_string_t *product_str_p = quote_str_p; ecma_string_t *tmp_str_p; ECMA_STRING_TO_UTF8_STRING (string_p, string_buff, string_buff_size); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c index 12c2b2ce29..3ed0cd6086 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp-prototype.c @@ -168,7 +168,8 @@ ecma_builtin_regexp_prototype_compile (ecma_value_t this_arg, /**< this argument } else { - pattern_string_p = ecma_ref_ecma_string (ecma_get_string_from_value (regexp_str_value)); + pattern_string_p = ecma_get_string_from_value (regexp_str_value); + ecma_ref_ecma_string (pattern_string_p); } ECMA_FINALIZE (regexp_str_value); @@ -380,8 +381,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_ref_ecma_string (source_str_p)); - ecma_deref_ecma_string (source_str_p); + ecma_string_t *output_str_p = ecma_concat_ecma_strings (src_sep_str_p, source_str_p); ecma_string_t *concat_p = ecma_concat_ecma_strings (output_str_p, src_sep_str_p); ecma_deref_ecma_string (src_sep_str_p); diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c index 1e4fe3c118..7cf88563d7 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-regexp.c @@ -109,7 +109,8 @@ ecma_builtin_regexp_dispatch_construct (const ecma_value_t *arguments_list_p, /* } else { - pattern_string_p = ecma_ref_ecma_string (ecma_get_string_from_value (regexp_str_value)); + pattern_string_p = ecma_get_string_from_value (regexp_str_value); + ecma_ref_ecma_string (pattern_string_p); } ECMA_FINALIZE (regexp_str_value); @@ -125,7 +126,9 @@ ecma_builtin_regexp_dispatch_construct (const ecma_value_t *arguments_list_p, /* ecma_op_to_string (flags_value), ret_value); - flags_string_p = ecma_ref_ecma_string (ecma_get_string_from_value (flags_str_value)); + flags_string_p = ecma_get_string_from_value (flags_str_value); + ecma_ref_ecma_string (flags_string_p); + ECMA_FINALIZE (flags_str_value); } diff --git a/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c b/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c index 91c64d2fe5..c39c55790b 100644 --- a/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c +++ b/jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.c @@ -79,12 +79,7 @@ ecma_builtin_string_prototype_object_to_string (ecma_value_t this_arg) /**< this ecma_property_t *prim_value_prop_p = ecma_get_internal_property (obj_p, ECMA_INTERNAL_PROPERTY_ECMA_VALUE); - 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_ref_ecma_string (prim_value_str_p); - - return ecma_make_string_value (prim_value_str_p); + return ecma_copy_value (ecma_get_internal_property_value (prim_value_prop_p)); } } @@ -250,10 +245,11 @@ ecma_builtin_string_prototype_object_concat (ecma_value_t this_arg, /**< this ar ret_value); /* 3 */ - // No copy performed + /* No copy performed */ /* 4 */ - ecma_string_t *string_to_return = ecma_ref_ecma_string (ecma_get_string_from_value (to_string_val)); + ecma_string_t *string_to_return = ecma_get_string_from_value (to_string_val); + ecma_ref_ecma_string (string_to_return); /* 5 */ for (uint32_t arg_index = 0; @@ -659,7 +655,8 @@ ecma_builtin_string_prototype_object_replace_append_substr (ecma_string_t *base_ } else { - ret_string_p = ecma_ref_ecma_string (base_string_p); + ret_string_p = base_string_p; + ecma_ref_ecma_string (ret_string_p); } return ret_string_p; diff --git a/jerry-core/ecma/operations/ecma-conversion.c b/jerry-core/ecma/operations/ecma-conversion.c index ab56410d3c..cb1e8a4018 100644 --- a/jerry-core/ecma/operations/ecma-conversion.c +++ b/jerry-core/ecma/operations/ecma-conversion.c @@ -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_ref_ecma_string (res_p); + ecma_ref_ecma_string (res_p); } else if (ecma_is_value_integer_number (value)) { diff --git a/jerry-core/ecma/operations/ecma-exceptions.c b/jerry-core/ecma/operations/ecma-exceptions.c index c881600238..18d6a6c78d 100644 --- a/jerry-core/ecma/operations/ecma-exceptions.c +++ b/jerry-core/ecma/operations/ecma-exceptions.c @@ -122,8 +122,9 @@ ecma_new_standard_error_with_message (ecma_standard_error_t error_type, /**< nat message_magic_string_p, ECMA_PROPERTY_CONFIGURABLE_WRITABLE); + ecma_ref_ecma_string (message_string_p); ecma_set_named_data_property_value (prop_p, - ecma_make_string_value (ecma_ref_ecma_string (message_string_p))); + ecma_make_string_value (message_string_p)); ecma_deref_ecma_string (message_magic_string_p); return new_error_obj_p; diff --git a/jerry-core/ecma/operations/ecma-objects.c b/jerry-core/ecma/operations/ecma-objects.c index f575a76b69..721b9efbf8 100644 --- a/jerry-core/ecma/operations/ecma-objects.c +++ b/jerry-core/ecma/operations/ecma-objects.c @@ -751,7 +751,8 @@ 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_ref_ecma_string (name_p); + ecma_ref_ecma_string (name_p); + names_p[--name_pos] = name_p; } } diff --git a/jerry-core/ecma/operations/ecma-reference.c b/jerry-core/ecma/operations/ecma-reference.c index e17d598fb5..032a298f09 100644 --- a/jerry-core/ecma/operations/ecma-reference.c +++ b/jerry-core/ecma/operations/ecma-reference.c @@ -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_ref_ecma_string (name_p); + ecma_ref_ecma_string (name_p); ecma_reference_t ref; ref.base = ecma_copy_value (base); diff --git a/jerry-core/ecma/operations/ecma-string-object.c b/jerry-core/ecma/operations/ecma-string-object.c index be67385bb3..ddf01546ee 100644 --- a/jerry-core/ecma/operations/ecma-string-object.c +++ b/jerry-core/ecma/operations/ecma-string-object.c @@ -142,7 +142,8 @@ 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_ref_ecma_string (property_name_p); + new_prop_name_p = property_name_p; + ecma_ref_ecma_string (new_prop_name_p); } else { diff --git a/jerry-core/jerry.c b/jerry-core/jerry.c index 4932dc617e..db5d156d63 100644 --- a/jerry-core/jerry.c +++ b/jerry-core/jerry.c @@ -357,7 +357,9 @@ jerry_acquire_string (jerry_string_t *string_p) /**< pointer passed to function { jerry_assert_api_available (); - return ecma_ref_ecma_string (string_p); + ecma_ref_ecma_string (string_p); + + return string_p; } /* jerry_acquire_string */ /** diff --git a/jerry-core/parser/regexp/re-compiler.c b/jerry-core/parser/regexp/re-compiler.c index 3aee690756..a898a8812d 100644 --- a/jerry-core/parser/regexp/re-compiler.c +++ b/jerry-core/parser/regexp/re-compiler.c @@ -576,8 +576,8 @@ 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_ref_ecma_string (pattern_str_p)); + ecma_ref_ecma_string (pattern_str_p); + ECMA_SET_NON_NULL_POINTER (re_compiled_code.pattern_cp, 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;