Skip to content

Commit 5f4a220

Browse files
LaszloLangoyichoi
authored andcommitted
Added literal list loading feature to the snapshot tool. (#2422)
It is needed to load literals and register them as magic strings to be able to generate static snapshots. Also modified the list format saving feature to save all of the literals not only the identifiers. JerryScript-DCO-1.0-Signed-off-by: László Langó [email protected]
1 parent f86d745 commit 5f4a220

File tree

4 files changed

+77
-23
lines changed

4 files changed

+77
-23
lines changed

jerry-core/api/jerry-snapshot.c

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1633,9 +1633,15 @@ jerry_parse_and_save_literals (const jerry_char_t *source_p, /**< script source
16331633
{
16341634
ecma_string_t *literal_p = ecma_get_string_from_value (*iterator_p);
16351635

1636-
/* We don't save a literal which isn't a valid identifier or it's a magic string. */
1636+
/* NOTE:
1637+
* We don't save a literal (in C format) which isn't a valid
1638+
* identifier or it's a magic string.
1639+
* TODO:
1640+
* Save all of the literals in C format as well.
1641+
*/
16371642
if (ecma_get_string_magic (literal_p) == LIT_MAGIC_STRING__COUNT
1638-
&& ecma_string_is_valid_identifier (literal_p))
1643+
&& (!is_c_format
1644+
|| (is_c_format && ecma_string_is_valid_identifier (literal_p))))
16391645
{
16401646
literal_count++;
16411647
}
@@ -1666,8 +1672,15 @@ jerry_parse_and_save_literals (const jerry_char_t *source_p, /**< script source
16661672
{
16671673
ecma_string_t *literal_p = ecma_get_string_from_value (*iterator_p);
16681674

1675+
/* NOTE:
1676+
* We don't save a literal (in C format) which isn't a valid
1677+
* identifier or it's a magic string.
1678+
* TODO:
1679+
* Save all of the literals in C format as well.
1680+
*/
16691681
if (ecma_get_string_magic (literal_p) == LIT_MAGIC_STRING__COUNT
1670-
&& ecma_string_is_valid_identifier (literal_p))
1682+
&& (!is_c_format
1683+
|| (is_c_format && ecma_string_is_valid_identifier (literal_p))))
16711684
{
16721685
literal_array[literal_idx++] = literal_p;
16731686
}

jerry-core/lit/lit-magic-strings.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -151,9 +151,7 @@ lit_magic_strings_ex_set (const lit_utf8_byte_t **ex_str_items, /**< character a
151151
id < JERRY_CONTEXT (lit_magic_string_ex_count);
152152
id = (lit_magic_string_ex_id_t) (id + 1))
153153
{
154-
lit_utf8_size_t string_size = lit_zt_utf8_string_size (lit_get_magic_string_ex_utf8 (id));
155-
JERRY_ASSERT (JERRY_CONTEXT (lit_magic_string_ex_sizes)[id] == string_size);
156-
JERRY_ASSERT (JERRY_CONTEXT (lit_magic_string_ex_sizes)[id] <= LIT_MAGIC_STRING_LENGTH_LIMIT);
154+
lit_utf8_size_t string_size = JERRY_CONTEXT (lit_magic_string_ex_sizes)[id];
157155

158156
/**
159157
* Check whether the strings are sorted by size and lexicographically,
@@ -163,6 +161,8 @@ lit_magic_strings_ex_set (const lit_utf8_byte_t **ex_str_items, /**< character a
163161
{
164162
const lit_magic_string_ex_id_t prev_id = id - 1;
165163
const lit_utf8_size_t prev_string_size = lit_get_magic_string_ex_size (prev_id);
164+
JERRY_ASSERT (lit_is_valid_cesu8_string (lit_get_magic_string_ex_utf8 (id),
165+
string_size));
166166
JERRY_ASSERT (prev_string_size <= string_size);
167167

168168
if (prev_string_size == string_size)

jerry-core/lit/lit-magic-strings.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,6 @@
1818

1919
#include "lit-globals.h"
2020

21-
/**
22-
* Limit for magic string length
23-
*/
24-
#define LIT_MAGIC_STRING_LENGTH_LIMIT 32
25-
2621
/**
2722
* Identifiers of ECMA and implementation-defined magic string constants
2823
*/

jerry-main/main-unix-snapshot.c

Lines changed: 58 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
*/
1515

1616
#include <assert.h>
17+
#include <stdlib.h>
1718
#include <string.h>
1819

1920
#include "jerryscript.h"
@@ -27,15 +28,22 @@
2728
*/
2829
#define JERRY_BUFFER_SIZE (1048576)
2930

31+
/**
32+
* Maximum number of loaded literals
33+
*/
34+
#define JERRY_LITERAL_LENGTH (4096)
35+
3036
/**
3137
* Standalone Jerry exit codes
3238
*/
3339
#define JERRY_STANDALONE_EXIT_CODE_OK (0)
3440
#define JERRY_STANDALONE_EXIT_CODE_FAIL (1)
3541

36-
static uint8_t input_buffer[ JERRY_BUFFER_SIZE ];
37-
static uint32_t output_buffer[ JERRY_BUFFER_SIZE / 4 ];
42+
static uint8_t input_buffer[JERRY_BUFFER_SIZE];
43+
static uint32_t output_buffer[JERRY_BUFFER_SIZE / 4];
3844
static const char *output_file_name_p = "js.snapshot";
45+
static jerry_length_t magic_string_lengths[JERRY_LITERAL_LENGTH];
46+
static jerry_char_ptr_t magic_string_items[JERRY_LITERAL_LENGTH];
3947

4048
/**
4149
* Check whether JerryScript has a requested feature enabled or not. If not,
@@ -168,6 +176,7 @@ typedef enum
168176
OPT_GENERATE_LITERAL_C,
169177
OPT_GENERATE_SHOW_OP,
170178
OPT_GENERATE_OUT,
179+
OPT_IMPORT_LITERAL_LIST
171180
} generate_opt_id_t;
172181

173182
/**
@@ -179,6 +188,9 @@ static const cli_opt_t generate_opts[] =
179188
.help = "print this help and exit"),
180189
CLI_OPT_DEF (.id = OPT_GENERATE_STATIC, .opt = "s", .longopt = "static",
181190
.help = "generate static snapshot"),
191+
CLI_OPT_DEF (.id = OPT_IMPORT_LITERAL_LIST, .longopt = "load-literals-list-format",
192+
.meta = "FILE",
193+
.help = "import literals from list format (for static snapshots)"),
182194
CLI_OPT_DEF (.id = OPT_GENERATE_LITERAL_LIST, .longopt = "save-literals-list-format",
183195
.meta = "FILE",
184196
.help = "export literals found in parsed JS input (in list format)"),
@@ -190,7 +202,7 @@ static const cli_opt_t generate_opts[] =
190202
CLI_OPT_DEF (.id = OPT_GENERATE_OUT, .opt = "o", .meta="FILE",
191203
.help = "specify output file name (default: js.snapshot)"),
192204
CLI_OPT_DEF (.id = CLI_OPT_DEFAULT, .meta = "FILE",
193-
.help = "input snapshot file")
205+
.help = "input source file")
194206
};
195207

196208
/**
@@ -206,13 +218,14 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
206218
(void) argc;
207219

208220
bool is_save_literals_mode_in_c_format = false;
221+
bool is_import_literals = false;
209222
uint32_t snapshot_flags = 0;
210223
jerry_init_flag_t flags = JERRY_INIT_EMPTY;
211224

212225
const char *file_name_p = NULL;
213226
uint8_t *source_p = input_buffer;
214227
size_t source_length = 0;
215-
const char *save_literals_file_name_p = NULL;
228+
const char *literals_file_name_p = NULL;
216229

217230
cli_change_opts (cli_state_p, generate_opts);
218231

@@ -230,17 +243,19 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
230243
snapshot_flags |= JERRY_SNAPSHOT_SAVE_STATIC;
231244
break;
232245
}
233-
case OPT_GENERATE_LITERAL_LIST:
234246
case OPT_GENERATE_LITERAL_C:
247+
case OPT_GENERATE_LITERAL_LIST:
248+
case OPT_IMPORT_LITERAL_LIST:
235249
{
236-
if (save_literals_file_name_p != NULL)
250+
if (literals_file_name_p != NULL)
237251
{
238252
jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: literal file name already specified");
239253
return JERRY_STANDALONE_EXIT_CODE_FAIL;
240254
}
241255

256+
is_import_literals = (id == OPT_IMPORT_LITERAL_LIST);
242257
is_save_literals_mode_in_c_format = (id == OPT_GENERATE_LITERAL_C);
243-
save_literals_file_name_p = cli_consume_string (cli_state_p);
258+
literals_file_name_p = cli_consume_string (cli_state_p);
244259
break;
245260
}
246261
case OPT_GENERATE_SHOW_OP:
@@ -306,8 +321,39 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
306321
return JERRY_STANDALONE_EXIT_CODE_FAIL;
307322
}
308323

309-
jerry_value_t snapshot_result;
324+
if (is_import_literals)
325+
{
326+
uint8_t *sp_buffer_start_p = source_p + source_length + 1;
327+
size_t sp_buffer_size = read_file (sp_buffer_start_p, literals_file_name_p);
310328

329+
if (sp_buffer_size > 0)
330+
{
331+
const char *sp_buffer_p = (const char *) sp_buffer_start_p;
332+
uint32_t num_of_lit = 0;
333+
334+
do
335+
{
336+
char *sp_buffer_end_p = NULL;
337+
jerry_length_t mstr_size = (jerry_length_t) strtol (sp_buffer_p, &sp_buffer_end_p, 10);
338+
if (mstr_size > 0)
339+
{
340+
magic_string_items[num_of_lit] = (jerry_char_ptr_t) (sp_buffer_end_p + 1);
341+
magic_string_lengths[num_of_lit] = mstr_size;
342+
num_of_lit++;
343+
}
344+
sp_buffer_p = sp_buffer_end_p + mstr_size + 1;
345+
}
346+
while ((size_t) (sp_buffer_p - (char *) sp_buffer_start_p) < sp_buffer_size);
347+
348+
if (num_of_lit > 0)
349+
{
350+
jerry_register_magic_strings (magic_string_items, num_of_lit,
351+
magic_string_lengths);
352+
}
353+
}
354+
}
355+
356+
jerry_value_t snapshot_result;
311357
snapshot_result = jerry_generate_snapshot ((jerry_char_t *) file_name_p,
312358
(size_t) strlen (file_name_p),
313359
(jerry_char_t *) source_p,
@@ -343,7 +389,7 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
343389

344390
printf ("Created snapshot file: '%s' (%lu bytes)\n", output_file_name_p, (unsigned long) snapshot_size);
345391

346-
if (save_literals_file_name_p != NULL)
392+
if (literals_file_name_p != NULL && !is_import_literals)
347393
{
348394
const size_t literal_buffer_size = jerry_parse_and_save_literals ((jerry_char_t *) source_p,
349395
source_length,
@@ -357,18 +403,18 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
357403
return JERRY_STANDALONE_EXIT_CODE_FAIL;
358404
}
359405

360-
FILE *literal_file_p = fopen (save_literals_file_name_p, "wb");
406+
FILE *literal_file_p = fopen (literals_file_name_p, "wb");
361407

362408
if (literal_file_p == NULL)
363409
{
364-
jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: Unable to write literal file: '%s'\n", save_literals_file_name_p);
410+
jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: Unable to write literal file: '%s'\n", literals_file_name_p);
365411
return JERRY_STANDALONE_EXIT_CODE_FAIL;
366412
}
367413

368414
fwrite (output_buffer, sizeof (uint8_t), literal_buffer_size, literal_file_p);
369415
fclose (literal_file_p);
370416

371-
printf ("Created literal file: '%s' (%lu bytes)\n", save_literals_file_name_p, (unsigned long) literal_buffer_size);
417+
printf ("Created literal file: '%s' (%lu bytes)\n", literals_file_name_p, (unsigned long) literal_buffer_size);
372418
}
373419

374420
return 0;

0 commit comments

Comments
 (0)