Skip to content

Commit 99b9dd0

Browse files
committed
Optimize literal storage.
JerryScript-DCO-1.0-Signed-off-by: Zoltan Herczeg zherczeg.u-szeged@partner.samsung.com
1 parent ea01767 commit 99b9dd0

30 files changed

+736
-1641
lines changed

jerry-core/ecma/base/ecma-globals.h

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -809,15 +809,18 @@ typedef struct
809809
*/
810810
typedef enum
811811
{
812-
ECMA_STRING_CONTAINER_LIT_TABLE, /**< actual data is in literal table */
813812
ECMA_STRING_CONTAINER_HEAP_ASCII_STRING, /**< actual data is on the heap as an ascii string */
814813
ECMA_STRING_CONTAINER_HEAP_UTF8_STRING, /**< actual data is on the heap as an utf-8 string */
815814
ECMA_STRING_CONTAINER_UINT32_IN_DESC, /**< actual data is UInt32-represeneted Number
816815
stored locally in the string's descriptor */
817816
ECMA_STRING_CONTAINER_MAGIC_STRING, /**< the ecma-string is equal to one of ECMA magic strings */
818817
ECMA_STRING_CONTAINER_MAGIC_STRING_EX, /**< the ecma-string is equal to one of external magic strings */
819818

820-
ECMA_STRING_CONTAINER__MAX = ECMA_STRING_CONTAINER_MAGIC_STRING_EX /**< maximum value */
819+
ECMA_STRING_LITERAL_NUMBER, /**< a literal number which is used solely by the literal storage
820+
* so no string processing function supports this type except
821+
* the ecma_deref_ecma_string function. */
822+
823+
ECMA_STRING_CONTAINER__MAX = ECMA_STRING_LITERAL_NUMBER /**< maximum value */
821824
} ecma_string_container_t;
822825

823826
/**
@@ -847,6 +850,12 @@ typedef enum
847850
#define ECMA_STRING_GET_CONTAINER(string_desc_p) \
848851
((ecma_string_container_t) ((string_desc_p)->refs_and_container & ECMA_STRING_CONTAINER_MASK))
849852

853+
/**
854+
* Checks whether the reference counter is 1.
855+
*/
856+
#define ECMA_STRING_IS_REF_EQUALS_TO_ONE(string_desc_p) \
857+
(((string_desc_p)->refs_and_container >> 3) == 1)
858+
850859
/**
851860
* ECMA string-value descriptor
852861
*/
@@ -892,6 +901,9 @@ typedef struct ecma_string_t
892901
/** Identifier of external magic string */
893902
lit_magic_string_ex_id_t magic_string_ex_id;
894903

904+
/** Literal number */
905+
ecma_value_t lit_number;
906+
895907
/** For zeroing and comparison in some cases */
896908
uint32_t common_field;
897909
} u;

jerry-core/ecma/base/ecma-helpers-string.c

Lines changed: 14 additions & 124 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@
2222
#include "jrt.h"
2323
#include "jrt-libc-includes.h"
2424
#include "lit-char-helpers.h"
25-
#include "lit-literal.h"
2625
#include "lit-magic-strings.h"
27-
#include "lit-literal-storage.h"
28-
#include "vm.h"
2926

3027
/** \addtogroup ecma ECMA
3128
* @{
@@ -72,9 +69,6 @@ typedef struct
7269
uint16_t length; /* Number of characters in the string */
7370
} ecma_string_heap_header_t;
7471

75-
static void
76-
ecma_init_ecma_string_from_lit_cp (ecma_string_t *string_p,
77-
lit_cpointer_t lit_index);
7872
static void
7973
ecma_init_ecma_string_from_magic_string_id (ecma_string_t *string_p,
8074
lit_magic_string_id_t magic_string_id);
@@ -83,39 +77,6 @@ static void
8377
ecma_init_ecma_string_from_magic_string_ex_id (ecma_string_t *string_p,
8478
lit_magic_string_ex_id_t magic_string_ex_id);
8579

86-
/**
87-
* Initialize ecma-string descriptor with string described by index in literal table
88-
*/
89-
static void
90-
ecma_init_ecma_string_from_lit_cp (ecma_string_t *string_p, /**< descriptor to initialize */
91-
lit_cpointer_t lit_cp) /**< compressed pointer to literal */
92-
{
93-
lit_literal_t lit = lit_cpointer_decompress (lit_cp);
94-
95-
if (LIT_RECORD_IS_MAGIC_STR (lit))
96-
{
97-
ecma_init_ecma_string_from_magic_string_id (string_p,
98-
lit_magic_literal_get_magic_str_id (lit));
99-
100-
return;
101-
}
102-
103-
if (LIT_RECORD_IS_MAGIC_STR_EX (lit))
104-
{
105-
ecma_init_ecma_string_from_magic_string_ex_id (string_p,
106-
lit_magic_literal_get_magic_str_ex_id (lit));
107-
return;
108-
}
109-
110-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
111-
112-
string_p->refs_and_container = ECMA_STRING_CONTAINER_LIT_TABLE | ECMA_STRING_REF_ONE;
113-
string_p->hash = lit_charset_literal_get_hash (lit);
114-
115-
string_p->u.common_field = 0;
116-
string_p->u.lit_cp = lit_cp;
117-
} /* ecma_init_ecma_string_from_lit_cp */
118-
11980
/**
12081
* Initialize ecma-string descriptor with specified magic string
12182
*/
@@ -320,21 +281,6 @@ ecma_new_ecma_string_from_number (ecma_number_t num) /**< ecma-number */
320281
return string_desc_p;
321282
} /* ecma_new_ecma_string_from_number */
322283

323-
/**
324-
* Allocate new ecma-string and fill it with reference to string literal
325-
*
326-
* @return pointer to ecma-string descriptor
327-
*/
328-
ecma_string_t *
329-
ecma_new_ecma_string_from_lit_cp (lit_cpointer_t lit_cp) /**< index in the literal table */
330-
{
331-
ecma_string_t *string_desc_p = ecma_alloc_string ();
332-
333-
ecma_init_ecma_string_from_lit_cp (string_desc_p, lit_cp);
334-
335-
return string_desc_p;
336-
} /* ecma_new_ecma_string_from_lit_cp */
337-
338284
/**
339285
* Allocate new ecma-string and fill it with reference to ECMA magic string
340286
*
@@ -502,14 +448,22 @@ ecma_deref_ecma_string (ecma_string_t *string_p) /**< ecma-string */
502448

503449
break;
504450
}
505-
case ECMA_STRING_CONTAINER_LIT_TABLE:
506451
case ECMA_STRING_CONTAINER_UINT32_IN_DESC:
507452
case ECMA_STRING_CONTAINER_MAGIC_STRING:
508453
case ECMA_STRING_CONTAINER_MAGIC_STRING_EX:
509454
{
510455
/* only the string descriptor itself should be freed */
511456
break;
512457
}
458+
case ECMA_STRING_LITERAL_NUMBER:
459+
{
460+
ecma_fast_free_value (string_p->u.lit_number);
461+
break;
462+
}
463+
default:
464+
{
465+
JERRY_UNREACHABLE ();
466+
}
513467
}
514468

515469
ecma_dealloc_string (string_p);
@@ -532,7 +486,6 @@ ecma_string_to_number (const ecma_string_t *str_p) /**< ecma-string */
532486
return ((ecma_number_t) uint32_number);
533487
}
534488

535-
case ECMA_STRING_CONTAINER_LIT_TABLE:
536489
case ECMA_STRING_CONTAINER_HEAP_UTF8_STRING:
537490
case ECMA_STRING_CONTAINER_HEAP_ASCII_STRING:
538491
case ECMA_STRING_CONTAINER_MAGIC_STRING:
@@ -553,9 +506,12 @@ ecma_string_to_number (const ecma_string_t *str_p) /**< ecma-string */
553506

554507
return num;
555508
}
556-
}
557509

558-
JERRY_UNREACHABLE ();
510+
default:
511+
{
512+
JERRY_UNREACHABLE ();
513+
}
514+
}
559515
} /* ecma_string_to_number */
560516

561517
/**
@@ -628,14 +584,6 @@ ecma_string_copy_to_utf8_buffer (const ecma_string_t *string_desc_p, /**< ecma-s
628584
memcpy (buffer_p, data_p, size);
629585
break;
630586
}
631-
case ECMA_STRING_CONTAINER_LIT_TABLE:
632-
{
633-
const lit_literal_t lit = lit_get_literal_by_cp (string_desc_p->u.lit_cp);
634-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
635-
size = lit_charset_literal_get_size (lit);
636-
memcpy (buffer_p, lit_charset_literal_get_charset (lit), size);
637-
break;
638-
}
639587
case ECMA_STRING_CONTAINER_UINT32_IN_DESC:
640588
{
641589
const uint32_t uint32_number = string_desc_p->u.uint32_number;
@@ -762,16 +710,6 @@ ecma_string_raw_chars (const ecma_string_t *string_p, /**< ecma-string */
762710

763711
switch (ECMA_STRING_GET_CONTAINER (string_p))
764712
{
765-
case ECMA_STRING_CONTAINER_LIT_TABLE:
766-
{
767-
lit_literal_t lit = lit_get_literal_by_cp (string_p->u.lit_cp);
768-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
769-
770-
length = lit_charset_literal_get_length (lit);
771-
size = lit_charset_literal_get_size (lit);
772-
result_p = lit_charset_literal_get_charset (lit);
773-
break;
774-
}
775713
case ECMA_STRING_CONTAINER_HEAP_UTF8_STRING:
776714
{
777715
const ecma_string_heap_header_t *data_p = ECMA_GET_NON_NULL_POINTER (ecma_string_heap_header_t,
@@ -861,11 +799,6 @@ ecma_compare_ecma_strings_longpath (const ecma_string_t *string1_p, /* ecma-stri
861799
{
862800
switch (ECMA_STRING_GET_CONTAINER (string1_p))
863801
{
864-
case ECMA_STRING_CONTAINER_LIT_TABLE:
865-
{
866-
JERRY_ASSERT (string1_p->u.lit_cp != string2_p->u.lit_cp);
867-
return false;
868-
}
869802
case ECMA_STRING_CONTAINER_MAGIC_STRING:
870803
{
871804
JERRY_ASSERT (string1_p->u.magic_string_id != string2_p->u.magic_string_id);
@@ -958,13 +891,6 @@ ecma_compare_ecma_strings_longpath (const ecma_string_t *string1_p, /* ecma-stri
958891

959892
utf8_string1_p = data_p;
960893
}
961-
else if (ECMA_STRING_GET_CONTAINER (string1_p) == ECMA_STRING_CONTAINER_LIT_TABLE)
962-
{
963-
const lit_literal_t lit = lit_get_literal_by_cp (string1_p->u.lit_cp);
964-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
965-
966-
utf8_string1_p = (lit_utf8_byte_t *) lit_charset_literal_get_charset (lit);
967-
}
968894
else
969895
{
970896
utf8_string1_p = (lit_utf8_byte_t *) jmem_heap_alloc_block ((size_t) strings_size);
@@ -988,13 +914,6 @@ ecma_compare_ecma_strings_longpath (const ecma_string_t *string1_p, /* ecma-stri
988914

989915
utf8_string2_p = data_p;
990916
}
991-
else if (ECMA_STRING_GET_CONTAINER (string2_p) == ECMA_STRING_CONTAINER_LIT_TABLE)
992-
{
993-
const lit_literal_t lit = lit_get_literal_by_cp (string2_p->u.lit_cp);
994-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
995-
996-
utf8_string2_p = (lit_utf8_byte_t *) lit_charset_literal_get_charset (lit);
997-
}
998917
else
999918
{
1000919
utf8_string2_p = (lit_utf8_byte_t *) jmem_heap_alloc_block ((size_t) strings_size);
@@ -1088,14 +1007,6 @@ ecma_compare_ecma_strings_relational (const ecma_string_t *string1_p, /**< ecma-
10881007
utf8_string1_p = data_p;
10891008
utf8_string1_size = (lit_utf8_size_t) string1_p->u.ascii_string.size;
10901009
}
1091-
else if (ECMA_STRING_GET_CONTAINER (string1_p) == ECMA_STRING_CONTAINER_LIT_TABLE)
1092-
{
1093-
const lit_literal_t lit = lit_get_literal_by_cp (string1_p->u.lit_cp);
1094-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
1095-
1096-
utf8_string1_p = (lit_utf8_byte_t *) lit_charset_literal_get_charset (lit);
1097-
utf8_string1_size = (lit_utf8_size_t) lit_charset_literal_get_size (lit);
1098-
}
10991010
else
11001011
{
11011012
utf8_string1_size = ecma_string_get_size (string1_p);
@@ -1129,14 +1040,6 @@ ecma_compare_ecma_strings_relational (const ecma_string_t *string1_p, /**< ecma-
11291040
utf8_string2_p = data_p;
11301041
utf8_string2_size = (lit_utf8_size_t) string2_p->u.ascii_string.size;
11311042
}
1132-
else if (ECMA_STRING_GET_CONTAINER (string2_p) == ECMA_STRING_CONTAINER_LIT_TABLE)
1133-
{
1134-
const lit_literal_t lit = lit_get_literal_by_cp (string2_p->u.lit_cp);
1135-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
1136-
1137-
utf8_string2_p = (lit_utf8_byte_t *) lit_charset_literal_get_charset (lit);
1138-
utf8_string2_size = (lit_utf8_size_t) lit_charset_literal_get_size (lit);
1139-
}
11401043
else
11411044
{
11421045
utf8_string2_size = ecma_string_get_size (string2_p);
@@ -1182,12 +1085,6 @@ ecma_string_get_length (const ecma_string_t *string_p) /**< ecma-string */
11821085
{
11831086
switch (ECMA_STRING_GET_CONTAINER (string_p))
11841087
{
1185-
case ECMA_STRING_CONTAINER_LIT_TABLE:
1186-
{
1187-
lit_literal_t lit = lit_get_literal_by_cp (string_p->u.lit_cp);
1188-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
1189-
return lit_charset_literal_get_length (lit);
1190-
}
11911088
case ECMA_STRING_CONTAINER_MAGIC_STRING:
11921089
{
11931090
JERRY_ASSERT (ECMA_STRING_IS_ASCII (lit_get_magic_string_utf8 (string_p->u.magic_string_id),
@@ -1229,13 +1126,6 @@ ecma_string_get_size (const ecma_string_t *string_p) /**< ecma-string */
12291126
{
12301127
switch (ECMA_STRING_GET_CONTAINER (string_p))
12311128
{
1232-
case ECMA_STRING_CONTAINER_LIT_TABLE:
1233-
{
1234-
lit_literal_t lit = lit_get_literal_by_cp (string_p->u.lit_cp);
1235-
JERRY_ASSERT (LIT_RECORD_IS_CHARSET (lit));
1236-
1237-
return lit_charset_literal_get_size (lit);
1238-
}
12391129
case ECMA_STRING_CONTAINER_MAGIC_STRING:
12401130
{
12411131
return lit_get_magic_string_size (string_p->u.magic_string_id);

jerry-core/ecma/base/ecma-helpers.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,14 +1429,14 @@ ecma_bytecode_deref (ecma_compiled_code_t *bytecode_p) /**< byte code pointer */
14291429

14301430
if (bytecode_p->status_flags & CBC_CODE_FLAGS_FUNCTION)
14311431
{
1432-
lit_cpointer_t *literal_start_p = NULL;
1432+
jmem_cpointer_t *literal_start_p = NULL;
14331433
uint32_t literal_end;
14341434
uint32_t const_literal_end;
14351435

14361436
if (bytecode_p->status_flags & CBC_CODE_FLAGS_UINT16_ARGUMENTS)
14371437
{
14381438
uint8_t *byte_p = (uint8_t *) bytecode_p;
1439-
literal_start_p = (lit_cpointer_t *) (byte_p + sizeof (cbc_uint16_arguments_t));
1439+
literal_start_p = (jmem_cpointer_t *) (byte_p + sizeof (cbc_uint16_arguments_t));
14401440

14411441
cbc_uint16_arguments_t *args_p = (cbc_uint16_arguments_t *) bytecode_p;
14421442
literal_end = args_p->literal_end;
@@ -1445,7 +1445,7 @@ ecma_bytecode_deref (ecma_compiled_code_t *bytecode_p) /**< byte code pointer */
14451445
else
14461446
{
14471447
uint8_t *byte_p = (uint8_t *) bytecode_p;
1448-
literal_start_p = (lit_cpointer_t *) (byte_p + sizeof (cbc_uint8_arguments_t));
1448+
literal_start_p = (jmem_cpointer_t *) (byte_p + sizeof (cbc_uint8_arguments_t));
14491449

14501450
cbc_uint8_arguments_t *args_p = (cbc_uint8_arguments_t *) bytecode_p;
14511451
literal_end = args_p->literal_end;

jerry-core/ecma/base/ecma-helpers.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
#include "ecma-globals.h"
2121
#include "jmem-allocator.h"
22-
#include "lit-cpointer.h"
2322
#include "lit-strings.h"
2423

2524
/** \addtogroup ecma ECMA
@@ -165,7 +164,6 @@ extern ecma_string_t *ecma_new_ecma_string_from_utf8 (const lit_utf8_byte_t *, l
165164
extern ecma_string_t *ecma_new_ecma_string_from_code_unit (ecma_char_t);
166165
extern ecma_string_t *ecma_new_ecma_string_from_uint32 (uint32_t);
167166
extern ecma_string_t *ecma_new_ecma_string_from_number (ecma_number_t);
168-
extern ecma_string_t *ecma_new_ecma_string_from_lit_cp (lit_cpointer_t);
169167
extern ecma_string_t *ecma_new_ecma_string_from_magic_string_id (lit_magic_string_id_t);
170168
extern ecma_string_t *ecma_new_ecma_string_from_magic_string_ex_id (lit_magic_string_ex_id_t);
171169
extern ecma_string_t *ecma_concat_ecma_strings (ecma_string_t *, ecma_string_t *);

jerry-core/ecma/base/ecma-init-finalize.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#include "ecma-init-finalize.h"
2020
#include "ecma-lcache.h"
2121
#include "ecma-lex-env.h"
22+
#include "ecma-literal-storage.h"
2223
#include "jmem-allocator.h"
2324

2425
/** \addtogroup ecma ECMA
@@ -37,6 +38,7 @@ ecma_init (void)
3738
ecma_gc_init ();
3839
ecma_init_builtins ();
3940
ecma_lcache_init ();
41+
ecma_init_lit_storage ();
4042
ecma_init_environment ();
4143

4244
jmem_register_free_unused_memory_callback (ecma_free_unused_memory);
@@ -53,6 +55,7 @@ ecma_finalize (void)
5355
ecma_finalize_environment ();
5456
ecma_finalize_builtins ();
5557
ecma_gc_run ();
58+
ecma_finalize_lit_storage ();
5659
} /* ecma_finalize */
5760

5861
/**

0 commit comments

Comments
 (0)