Rework literal storage.

The new literal storage keeps ecma strings rather than having a
custom string implementation which duplicates the string management
routines. Conversions between string implementations are eliminated
which improved the performance by 4%.

JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
This commit is contained in:
Zoltan Herczeg
2016-06-27 00:25:09 -07:00
parent 0940be57f6
commit 0a32c97755
30 changed files with 744 additions and 1641 deletions
-3
View File
@@ -16,7 +16,6 @@
#include "ecma-helpers.h"
#include "lit-strings.h"
#include "ecma-init-finalize.h"
#include "lit-literal.h"
#include "lit-char-helpers.h"
#include "js-parser-internal.h"
@@ -28,7 +27,6 @@ main ()
TEST_INIT ();
jmem_init ();
lit_init ();
ecma_init ();
const uint8_t _1_byte_long1[] = "\\u007F";
@@ -76,7 +74,6 @@ main ()
JERRY_ASSERT (length == 3);
ecma_finalize ();
lit_finalize ();
jmem_finalize (true);
return 0;
+16 -44
View File
@@ -15,8 +15,7 @@
*/
#include "ecma-helpers.h"
#include "lit-literal.h"
#include "lit-literal-storage.h"
#include "ecma-literal-storage.h"
#include "test-common.h"
// Iterations count
@@ -55,31 +54,6 @@ generate_number ()
return num;
} /* generate_number */
static bool
compare_utf8_string_and_string_literal (const lit_utf8_byte_t *str_p, lit_utf8_size_t str_size, lit_literal_t lit)
{
if (LIT_RECORD_IS_CHARSET (lit))
{
lit_utf8_byte_t *lit_str_p = lit_charset_literal_get_charset (lit);
lit_utf8_size_t lit_str_size = lit_charset_literal_get_size (lit);
return lit_compare_utf8_strings (str_p, str_size, lit_str_p, lit_str_size);
}
else if (LIT_RECORD_IS_MAGIC_STR (lit))
{
lit_magic_string_id_t magic_id = lit_magic_literal_get_magic_str_id (lit);
return lit_compare_utf8_string_and_magic_string (str_p, str_size, magic_id);
}
else if (LIT_RECORD_IS_MAGIC_STR_EX (lit))
{
lit_magic_string_ex_id_t magic_id = lit_magic_literal_get_magic_str_ex_id (lit);
return lit_compare_utf8_string_and_magic_string_ex (str_p, str_size, magic_id);
}
return false;
} /* compare_utf8_string_and_string_literal */
int
main ()
{
@@ -91,7 +65,7 @@ main ()
lit_utf8_size_t lengths[test_sub_iters];
jmem_init ();
lit_init ();
ecma_init_lit_storage ();
for (uint32_t i = 0; i < test_iters; i++)
{
@@ -106,7 +80,7 @@ main ()
{
lengths[j] = (lit_utf8_size_t) (rand () % max_characters_in_string + 1);
generate_string (strings[j], lengths[j]);
lit_create_literal_from_utf8_string (strings[j], lengths[j]);
ecma_find_or_create_literal_string (strings[j], lengths[j]);
strings[j][lengths[j]] = '\0';
ptrs[j] = strings[j];
JERRY_ASSERT (ptrs[j]);
@@ -117,36 +91,34 @@ main ()
ptrs[j] = lit_get_magic_string_utf8 (msi);
JERRY_ASSERT (ptrs[j]);
lengths[j] = (lit_utf8_size_t) lit_zt_utf8_string_size (ptrs[j]);
lit_create_literal_from_utf8_string (ptrs[j], lengths[j]);
ecma_find_or_create_literal_string (ptrs[j], lengths[j]);
}
else
{
ecma_number_t num = generate_number ();
lengths[j] = ecma_number_to_utf8_string (num, strings[j], max_characters_in_string);
lit_create_literal_from_num (num);
ecma_find_or_create_literal_number (num);
}
}
// Add empty string
lit_create_literal_from_utf8_string (NULL, 0);
ecma_find_or_create_literal_string (NULL, 0);
for (uint32_t j = 0; j < test_sub_iters; j++)
{
lit_literal_t lit1;
lit_literal_t lit2;
jmem_cpointer_t lit1;
jmem_cpointer_t lit2;
if (ptrs[j])
{
lit1 = lit_find_or_create_literal_from_utf8_string (ptrs[j], lengths[j]);
lit2 = lit_find_literal_by_utf8_string (ptrs[j], lengths[j]);
JERRY_ASSERT (compare_utf8_string_and_string_literal (ptrs[j], lengths[j], lit1));
JERRY_ASSERT (compare_utf8_string_and_string_literal (ptrs[j], lengths[j], lit2));
lit1 = ecma_find_or_create_literal_string (ptrs[j], lengths[j]);
lit2 = ecma_find_or_create_literal_string (ptrs[j], lengths[j]);
JERRY_ASSERT (lit1 == lit2);
}
else
{
lit1 = lit_find_or_create_literal_from_num (numbers[j]);
lit2 = lit_find_literal_by_num (numbers[j]);
JERRY_ASSERT (numbers[j] == lit_number_literal_get_number (lit1));
JERRY_ASSERT (numbers[j] == lit_number_literal_get_number (lit2));
lit1 = ecma_find_or_create_literal_number (numbers[j]);
lit2 = ecma_find_or_create_literal_number (numbers[j]);
JERRY_ASSERT (lit1 == lit2);
}
JERRY_ASSERT (lit1);
JERRY_ASSERT (lit2);
@@ -154,10 +126,10 @@ main ()
}
// Check empty string exists
JERRY_ASSERT (lit_find_literal_by_utf8_string (NULL, 0));
JERRY_ASSERT (ecma_find_or_create_literal_string (NULL, 0) != JMEM_CP_NULL);
}
lit_finalize ();
ecma_finalize_lit_storage ();
jmem_finalize (true);
return 0;
} /* main */
-3
View File
@@ -17,7 +17,6 @@
#include "ecma-helpers.h"
#include "lit-strings.h"
#include "ecma-init-finalize.h"
#include "lit-literal.h"
#include "test-common.h"
@@ -107,7 +106,6 @@ main ()
TEST_INIT ();
jmem_init ();
lit_init ();
ecma_init ();
lit_utf8_byte_t cesu8_string[max_bytes_in_string];
@@ -219,7 +217,6 @@ main ()
JERRY_ASSERT (res_buf[2] == 0xBF);
ecma_finalize ();
lit_finalize ();
jmem_finalize (true);
return 0;