Skip to content

Remove ECMA_STRING_CONTAINER_CONCATENATION type from ecma_string #635

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions jerry-core/ecma/base/ecma-globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -783,7 +783,6 @@ typedef enum
ECMA_STRING_CONTAINER_HEAP_NUMBER, /**< actual data is on the heap as a ecma_number_t */
ECMA_STRING_CONTAINER_UINT32_IN_DESC, /**< actual data is UInt32-represeneted Number
stored locally in the string's descriptor */
ECMA_STRING_CONTAINER_CONCATENATION, /**< the ecma-string is concatenation of two specified ecma-strings */
ECMA_STRING_CONTAINER_MAGIC_STRING, /**< the ecma-string is equal to one of ECMA magic strings */
ECMA_STRING_CONTAINER_MAGIC_STRING_EX /**< the ecma-string is equal to one of external magic strings */
} ecma_string_container_t;
Expand Down Expand Up @@ -831,19 +830,6 @@ typedef struct ecma_string_t
/** UInt32-represented number placed locally in the descriptor */
uint32_t uint32_number;

/** Representation of concatenation */
struct
{
mem_cpointer_t string1_cp : ECMA_POINTER_FIELD_WIDTH;
mem_cpointer_t string2_cp : ECMA_POINTER_FIELD_WIDTH;

/**
* Flag indicating that last code_unit of first string in concatenation is high surrogate
* and first code_unit of second string is low surrogate
*/
unsigned int is_surrogate_pair_sliced : 1;
} concatenation;

/** Identifier of magic string */
lit_magic_string_id_t magic_string_id;

Expand Down
178 changes: 30 additions & 148 deletions jerry-core/ecma/base/ecma-helpers-string.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -627,53 +627,44 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */
jerry_fatal (ERR_OUT_OF_MEMORY);
}

ecma_string_t* string_desc_p = ecma_alloc_string ();
string_desc_p->refs = 1;
string_desc_p->is_stack_var = false;
string_desc_p->container = ECMA_STRING_CONTAINER_CONCATENATION;

string_desc_p->u.common_field = 0;

string1_p = ecma_copy_or_ref_ecma_string (string1_p);
string2_p = ecma_copy_or_ref_ecma_string (string2_p);

ECMA_SET_NON_NULL_POINTER (string_desc_p->u.concatenation.string1_cp, string1_p);
ECMA_SET_NON_NULL_POINTER (string_desc_p->u.concatenation.string2_cp, string2_p);

ecma_char_t str1_last_code_unit = ecma_string_get_char_at_pos (string1_p, ecma_string_get_length (string1_p) - 1);
ecma_char_t str2_first_code_unit = ecma_string_get_char_at_pos (string2_p, 0);

string_desc_p->u.concatenation.is_surrogate_pair_sliced = (lit_is_code_unit_high_surrogate (str1_last_code_unit)
&& lit_is_code_unit_low_surrogate (str2_first_code_unit));
bool is_surrogate_pair_sliced = (lit_is_code_unit_high_surrogate (str1_last_code_unit)
&& lit_is_code_unit_low_surrogate (str2_first_code_unit));

if (!string_desc_p->u.concatenation.is_surrogate_pair_sliced)
{
lit_utf8_size_t buffer_size = ecma_string_get_size (string2_p);
lit_utf8_size_t buffer_size = str1_size + str2_size - (lit_utf8_size_t) (is_surrogate_pair_sliced ?
LIT_UTF8_CESU8_SURROGATE_SIZE_DIF : 0);

MEM_DEFINE_LOCAL_ARRAY (utf8_str_p, buffer_size, lit_utf8_byte_t);
lit_utf8_byte_t *str_p = (lit_utf8_byte_t *) mem_heap_alloc_block (buffer_size, MEM_HEAP_ALLOC_SHORT_TERM);

ssize_t sz = ecma_string_to_utf8_string (string2_p, utf8_str_p, (ssize_t) buffer_size);
JERRY_ASSERT (sz > 0);
ssize_t bytes_copied1, bytes_copied2;

string_desc_p->hash = lit_utf8_string_hash_combine (string1_p->hash, utf8_str_p, buffer_size);
bytes_copied1 = ecma_string_to_utf8_string (string1_p, str_p, (ssize_t) str1_size);
JERRY_ASSERT (bytes_copied1 > 0);

MEM_FINALIZE_LOCAL_ARRAY (utf8_str_p);
if (!is_surrogate_pair_sliced)
{
bytes_copied2 = ecma_string_to_utf8_string (string2_p, str_p + str1_size, (ssize_t) str2_size);
JERRY_ASSERT (bytes_copied2 > 0);
}
else
{
lit_utf8_size_t buffer_size = ecma_string_get_size (string_desc_p);

MEM_DEFINE_LOCAL_ARRAY (utf8_str_p, buffer_size, lit_utf8_byte_t);
bytes_copied2 = ecma_string_to_utf8_string (string2_p,
str_p + str1_size - LIT_UTF8_MAX_BYTES_IN_CODE_UNIT + 1,
(ssize_t) buffer_size - bytes_copied1
+ LIT_UTF8_MAX_BYTES_IN_CODE_UNIT);
JERRY_ASSERT (bytes_copied2 > 0);

ssize_t sz = ecma_string_to_utf8_string (string_desc_p, utf8_str_p, (ssize_t) buffer_size);
JERRY_ASSERT (sz > 0);

string_desc_p->hash = lit_utf8_string_calc_hash (utf8_str_p, buffer_size);

MEM_FINALIZE_LOCAL_ARRAY (utf8_str_p);
lit_code_point_t surrogate_code_point = lit_convert_surrogate_pair_to_code_point (str1_last_code_unit,
str2_first_code_unit);
lit_code_point_to_utf8 (surrogate_code_point, str_p + str1_size - LIT_UTF8_MAX_BYTES_IN_CODE_UNIT);
}
ecma_string_t *str_concat_p = ecma_new_ecma_string_from_utf8 (str_p, buffer_size);

return string_desc_p;
mem_heap_free_block ((void*) str_p);

return str_concat_p;
} /* ecma_concat_ecma_strings */

/**
Expand Down Expand Up @@ -706,16 +697,6 @@ ecma_copy_ecma_string (ecma_string_t *string_desc_p) /**< string descriptor */
break;
}

case ECMA_STRING_CONTAINER_CONCATENATION:
{
ecma_string_t *part1_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t, string_desc_p->u.concatenation.string1_cp);
ecma_string_t *part2_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t, string_desc_p->u.concatenation.string2_cp);

new_str_p = ecma_concat_ecma_strings (part1_p, part2_p);

break;
}

case ECMA_STRING_CONTAINER_HEAP_NUMBER:
{
ecma_number_t *num_p = ECMA_GET_NON_NULL_POINTER (ecma_number_t, string_desc_p->u.number_cp);
Expand Down Expand Up @@ -840,20 +821,6 @@ ecma_deref_ecma_string (ecma_string_t *string_p) /**< ecma-string */

break;
}
case ECMA_STRING_CONTAINER_CONCATENATION:
{
ecma_string_t *string1_p, *string2_p;

string1_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t,
string_p->u.concatenation.string1_cp);
string2_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t,
string_p->u.concatenation.string2_cp);

ecma_deref_ecma_string (string1_p);
ecma_deref_ecma_string (string2_p);

break;
}
case ECMA_STRING_CONTAINER_LIT_TABLE:
case ECMA_STRING_CONTAINER_UINT32_IN_DESC:
case ECMA_STRING_CONTAINER_MAGIC_STRING:
Expand Down Expand Up @@ -924,7 +891,6 @@ ecma_string_to_number (const ecma_string_t *str_p) /**< ecma-string */

case ECMA_STRING_CONTAINER_LIT_TABLE:
case ECMA_STRING_CONTAINER_HEAP_CHUNKS:
case ECMA_STRING_CONTAINER_CONCATENATION:
case ECMA_STRING_CONTAINER_MAGIC_STRING:
case ECMA_STRING_CONTAINER_MAGIC_STRING_EX:
{
Expand Down Expand Up @@ -1052,54 +1018,7 @@ ecma_string_to_utf8_string (const ecma_string_t *string_desc_p, /**< ecma-string

break;
}
case ECMA_STRING_CONTAINER_CONCATENATION:
{
const ecma_string_t *string1_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t,
string_desc_p->u.concatenation.string1_cp);
const ecma_string_t *string2_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t,
string_desc_p->u.concatenation.string2_cp);

lit_utf8_byte_t *dest_p = buffer_p;

ssize_t bytes_copied1, bytes_copied2;

bytes_copied1 = ecma_string_to_utf8_string (string1_p, dest_p, buffer_size);
JERRY_ASSERT (bytes_copied1 > 0);

dest_p += ecma_string_get_size (string1_p);

if (!string_desc_p->u.concatenation.is_surrogate_pair_sliced)
{
bytes_copied2 = ecma_string_to_utf8_string (string2_p, dest_p, buffer_size - bytes_copied1);
JERRY_ASSERT (bytes_copied2 > 0);
}
else
{
dest_p -= LIT_UTF8_MAX_BYTES_IN_CODE_UNIT;

ecma_char_t high_surrogate = lit_utf8_string_code_unit_at (dest_p, LIT_UTF8_MAX_BYTES_IN_CODE_UNIT, 0);
JERRY_ASSERT (lit_is_code_unit_high_surrogate (high_surrogate));

bytes_copied2 = ecma_string_to_utf8_string (string2_p,
dest_p + 1,
buffer_size - bytes_copied1 + LIT_UTF8_MAX_BYTES_IN_CODE_UNIT);
JERRY_ASSERT (bytes_copied2 > 0);

ecma_char_t low_surrogate = lit_utf8_string_code_unit_at (dest_p + 1, LIT_UTF8_MAX_BYTES_IN_CODE_UNIT, 0);
JERRY_ASSERT (lit_is_code_unit_low_surrogate (low_surrogate));

lit_code_point_t surrogate_code_point = lit_convert_surrogate_pair_to_code_point (high_surrogate,
low_surrogate);
lit_code_point_to_utf8 (surrogate_code_point, dest_p);
}

JERRY_ASSERT (required_buffer_size == (bytes_copied1 + bytes_copied2 -
(string_desc_p->u.concatenation.is_surrogate_pair_sliced
? LIT_UTF8_CESU8_SURROGATE_SIZE_DIF
: 0)));

break;
}
case ECMA_STRING_CONTAINER_MAGIC_STRING:
{
const lit_magic_string_id_t id = string_desc_p->u.magic_string_id;
Expand Down Expand Up @@ -1210,11 +1129,6 @@ ecma_compare_ecma_strings_longpath (const ecma_string_t *string1_p, /* ecma-stri

return ecma_compare_chars_collection (chars_collection1_p, chars_collection2_p);
}
case ECMA_STRING_CONTAINER_CONCATENATION:
{
/* long path */
break;
}
case ECMA_STRING_CONTAINER_LIT_TABLE:
{
JERRY_ASSERT (string1_p->u.lit_cp.packed_value != string2_p->u.lit_cp.packed_value);
Expand Down Expand Up @@ -1469,25 +1383,15 @@ ecma_string_get_length (const ecma_string_t *string_p) /**< ecma-string */

return (ecma_length_t) ecma_number_to_utf8_string (*num_p, buffer, sizeof (buffer));
}
else if (container == ECMA_STRING_CONTAINER_HEAP_CHUNKS)
else
{
JERRY_ASSERT (container == ECMA_STRING_CONTAINER_HEAP_CHUNKS);

const ecma_collection_header_t *collection_header_p = ECMA_GET_NON_NULL_POINTER (ecma_collection_header_t,
string_p->u.collection_cp);

return ecma_get_chars_collection_length (collection_header_p);
}
else
{
JERRY_ASSERT (container == ECMA_STRING_CONTAINER_CONCATENATION);

const ecma_string_t *string1_p, *string2_p;

string1_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t, string_p->u.concatenation.string1_cp);
string2_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t, string_p->u.concatenation.string2_cp);

return (ecma_string_get_length (string1_p) + ecma_string_get_length (string2_p) -
string_p->u.concatenation.is_surrogate_pair_sliced);
}
} /* ecma_string_get_length */


Expand Down Expand Up @@ -1555,27 +1459,15 @@ ecma_string_get_size (const ecma_string_t *string_p) /**< ecma-string */
buffer,
sizeof (buffer));
}
else if (container == ECMA_STRING_CONTAINER_HEAP_CHUNKS)
else
{
JERRY_ASSERT (container == ECMA_STRING_CONTAINER_HEAP_CHUNKS);

const ecma_collection_header_t *collection_header_p = ECMA_GET_NON_NULL_POINTER (ecma_collection_header_t,
string_p->u.collection_cp);

return collection_header_p->unit_number;
}
else
{
JERRY_ASSERT (container == ECMA_STRING_CONTAINER_CONCATENATION);

const ecma_string_t *string1_p, *string2_p;

string1_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t, string_p->u.concatenation.string1_cp);
string2_p = ECMA_GET_NON_NULL_POINTER (ecma_string_t, string_p->u.concatenation.string2_cp);

return (ecma_string_get_size (string1_p) + ecma_string_get_size (string2_p) -
(lit_utf8_size_t) (string_p->u.concatenation.is_surrogate_pair_sliced
? LIT_UTF8_CESU8_SURROGATE_SIZE_DIF
: 0));
}
} /* ecma_string_get_size */

/**
Expand Down Expand Up @@ -1715,11 +1607,6 @@ ecma_is_string_magic (const ecma_string_t *string_p, /**< ecma-string */

return true;
}
else if (string_p->container == ECMA_STRING_CONTAINER_CONCATENATION
&& ecma_string_get_length (string_p) <= LIT_MAGIC_STRING_LENGTH_LIMIT)
{
return ecma_is_string_magic_longpath (string_p, out_id_p);
}
else
{
/*
Expand Down Expand Up @@ -1753,11 +1640,6 @@ ecma_is_ex_string_magic (const ecma_string_t *string_p, /**< ecma-string */

return true;
}
else if (string_p->container == ECMA_STRING_CONTAINER_CONCATENATION
&& ecma_string_get_length (string_p) <= LIT_MAGIC_STRING_LENGTH_LIMIT)
{
return ecma_is_ex_string_magic_longpath (string_p, out_id_p);
}
else
{
/*
Expand Down