aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--jerry-core/api/jerry-snapshot.c19
-rw-r--r--jerry-core/lit/lit-magic-strings.c6
-rw-r--r--jerry-core/lit/lit-magic-strings.h5
-rw-r--r--jerry-main/main-unix-snapshot.c70
4 files changed, 77 insertions, 23 deletions
diff --git a/jerry-core/api/jerry-snapshot.c b/jerry-core/api/jerry-snapshot.c
index a24eb2b9..ec5531ab 100644
--- a/jerry-core/api/jerry-snapshot.c
+++ b/jerry-core/api/jerry-snapshot.c
@@ -1633,9 +1633,15 @@ jerry_parse_and_save_literals (const jerry_char_t *source_p, /**< script source
{
ecma_string_t *literal_p = ecma_get_string_from_value (*iterator_p);
- /* We don't save a literal which isn't a valid identifier or it's a magic string. */
+ /* NOTE:
+ * We don't save a literal (in C format) which isn't a valid
+ * identifier or it's a magic string.
+ * TODO:
+ * Save all of the literals in C format as well.
+ */
if (ecma_get_string_magic (literal_p) == LIT_MAGIC_STRING__COUNT
- && ecma_string_is_valid_identifier (literal_p))
+ && (!is_c_format
+ || (is_c_format && ecma_string_is_valid_identifier (literal_p))))
{
literal_count++;
}
@@ -1666,8 +1672,15 @@ jerry_parse_and_save_literals (const jerry_char_t *source_p, /**< script source
{
ecma_string_t *literal_p = ecma_get_string_from_value (*iterator_p);
+ /* NOTE:
+ * We don't save a literal (in C format) which isn't a valid
+ * identifier or it's a magic string.
+ * TODO:
+ * Save all of the literals in C format as well.
+ */
if (ecma_get_string_magic (literal_p) == LIT_MAGIC_STRING__COUNT
- && ecma_string_is_valid_identifier (literal_p))
+ && (!is_c_format
+ || (is_c_format && ecma_string_is_valid_identifier (literal_p))))
{
literal_array[literal_idx++] = literal_p;
}
diff --git a/jerry-core/lit/lit-magic-strings.c b/jerry-core/lit/lit-magic-strings.c
index 78d10981..aee9837e 100644
--- a/jerry-core/lit/lit-magic-strings.c
+++ b/jerry-core/lit/lit-magic-strings.c
@@ -151,9 +151,7 @@ lit_magic_strings_ex_set (const lit_utf8_byte_t **ex_str_items, /**< character a
id < JERRY_CONTEXT (lit_magic_string_ex_count);
id = (lit_magic_string_ex_id_t) (id + 1))
{
- lit_utf8_size_t string_size = lit_zt_utf8_string_size (lit_get_magic_string_ex_utf8 (id));
- JERRY_ASSERT (JERRY_CONTEXT (lit_magic_string_ex_sizes)[id] == string_size);
- JERRY_ASSERT (JERRY_CONTEXT (lit_magic_string_ex_sizes)[id] <= LIT_MAGIC_STRING_LENGTH_LIMIT);
+ lit_utf8_size_t string_size = JERRY_CONTEXT (lit_magic_string_ex_sizes)[id];
/**
* 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
{
const lit_magic_string_ex_id_t prev_id = id - 1;
const lit_utf8_size_t prev_string_size = lit_get_magic_string_ex_size (prev_id);
+ JERRY_ASSERT (lit_is_valid_cesu8_string (lit_get_magic_string_ex_utf8 (id),
+ string_size));
JERRY_ASSERT (prev_string_size <= string_size);
if (prev_string_size == string_size)
diff --git a/jerry-core/lit/lit-magic-strings.h b/jerry-core/lit/lit-magic-strings.h
index 940330e1..c4a40107 100644
--- a/jerry-core/lit/lit-magic-strings.h
+++ b/jerry-core/lit/lit-magic-strings.h
@@ -19,11 +19,6 @@
#include "lit-globals.h"
/**
- * Limit for magic string length
- */
-#define LIT_MAGIC_STRING_LENGTH_LIMIT 32
-
-/**
* Identifiers of ECMA and implementation-defined magic string constants
*/
typedef enum
diff --git a/jerry-main/main-unix-snapshot.c b/jerry-main/main-unix-snapshot.c
index 04b628e7..752437cf 100644
--- a/jerry-main/main-unix-snapshot.c
+++ b/jerry-main/main-unix-snapshot.c
@@ -14,6 +14,7 @@
*/
#include <assert.h>
+#include <stdlib.h>
#include <string.h>
#include "jerryscript.h"
@@ -28,14 +29,21 @@
#define JERRY_BUFFER_SIZE (1048576)
/**
+ * Maximum number of loaded literals
+ */
+#define JERRY_LITERAL_LENGTH (4096)
+
+/**
* Standalone Jerry exit codes
*/
#define JERRY_STANDALONE_EXIT_CODE_OK (0)
#define JERRY_STANDALONE_EXIT_CODE_FAIL (1)
-static uint8_t input_buffer[ JERRY_BUFFER_SIZE ];
-static uint32_t output_buffer[ JERRY_BUFFER_SIZE / 4 ];
+static uint8_t input_buffer[JERRY_BUFFER_SIZE];
+static uint32_t output_buffer[JERRY_BUFFER_SIZE / 4];
static const char *output_file_name_p = "js.snapshot";
+static jerry_length_t magic_string_lengths[JERRY_LITERAL_LENGTH];
+static jerry_char_ptr_t magic_string_items[JERRY_LITERAL_LENGTH];
/**
* Check whether JerryScript has a requested feature enabled or not. If not,
@@ -168,6 +176,7 @@ typedef enum
OPT_GENERATE_LITERAL_C,
OPT_GENERATE_SHOW_OP,
OPT_GENERATE_OUT,
+ OPT_IMPORT_LITERAL_LIST
} generate_opt_id_t;
/**
@@ -179,6 +188,9 @@ static const cli_opt_t generate_opts[] =
.help = "print this help and exit"),
CLI_OPT_DEF (.id = OPT_GENERATE_STATIC, .opt = "s", .longopt = "static",
.help = "generate static snapshot"),
+ CLI_OPT_DEF (.id = OPT_IMPORT_LITERAL_LIST, .longopt = "load-literals-list-format",
+ .meta = "FILE",
+ .help = "import literals from list format (for static snapshots)"),
CLI_OPT_DEF (.id = OPT_GENERATE_LITERAL_LIST, .longopt = "save-literals-list-format",
.meta = "FILE",
.help = "export literals found in parsed JS input (in list format)"),
@@ -190,7 +202,7 @@ static const cli_opt_t generate_opts[] =
CLI_OPT_DEF (.id = OPT_GENERATE_OUT, .opt = "o", .meta="FILE",
.help = "specify output file name (default: js.snapshot)"),
CLI_OPT_DEF (.id = CLI_OPT_DEFAULT, .meta = "FILE",
- .help = "input snapshot file")
+ .help = "input source file")
};
/**
@@ -206,13 +218,14 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
(void) argc;
bool is_save_literals_mode_in_c_format = false;
+ bool is_import_literals = false;
uint32_t snapshot_flags = 0;
jerry_init_flag_t flags = JERRY_INIT_EMPTY;
const char *file_name_p = NULL;
uint8_t *source_p = input_buffer;
size_t source_length = 0;
- const char *save_literals_file_name_p = NULL;
+ const char *literals_file_name_p = NULL;
cli_change_opts (cli_state_p, generate_opts);
@@ -230,17 +243,19 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
snapshot_flags |= JERRY_SNAPSHOT_SAVE_STATIC;
break;
}
- case OPT_GENERATE_LITERAL_LIST:
case OPT_GENERATE_LITERAL_C:
+ case OPT_GENERATE_LITERAL_LIST:
+ case OPT_IMPORT_LITERAL_LIST:
{
- if (save_literals_file_name_p != NULL)
+ if (literals_file_name_p != NULL)
{
jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: literal file name already specified");
return JERRY_STANDALONE_EXIT_CODE_FAIL;
}
+ is_import_literals = (id == OPT_IMPORT_LITERAL_LIST);
is_save_literals_mode_in_c_format = (id == OPT_GENERATE_LITERAL_C);
- save_literals_file_name_p = cli_consume_string (cli_state_p);
+ literals_file_name_p = cli_consume_string (cli_state_p);
break;
}
case OPT_GENERATE_SHOW_OP:
@@ -306,8 +321,39 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
return JERRY_STANDALONE_EXIT_CODE_FAIL;
}
- jerry_value_t snapshot_result;
+ if (is_import_literals)
+ {
+ uint8_t *sp_buffer_start_p = source_p + source_length + 1;
+ size_t sp_buffer_size = read_file (sp_buffer_start_p, literals_file_name_p);
+ if (sp_buffer_size > 0)
+ {
+ const char *sp_buffer_p = (const char *) sp_buffer_start_p;
+ uint32_t num_of_lit = 0;
+
+ do
+ {
+ char *sp_buffer_end_p = NULL;
+ jerry_length_t mstr_size = (jerry_length_t) strtol (sp_buffer_p, &sp_buffer_end_p, 10);
+ if (mstr_size > 0)
+ {
+ magic_string_items[num_of_lit] = (jerry_char_ptr_t) (sp_buffer_end_p + 1);
+ magic_string_lengths[num_of_lit] = mstr_size;
+ num_of_lit++;
+ }
+ sp_buffer_p = sp_buffer_end_p + mstr_size + 1;
+ }
+ while ((size_t) (sp_buffer_p - (char *) sp_buffer_start_p) < sp_buffer_size);
+
+ if (num_of_lit > 0)
+ {
+ jerry_register_magic_strings (magic_string_items, num_of_lit,
+ magic_string_lengths);
+ }
+ }
+ }
+
+ jerry_value_t snapshot_result;
snapshot_result = jerry_generate_snapshot ((jerry_char_t *) file_name_p,
(size_t) strlen (file_name_p),
(jerry_char_t *) source_p,
@@ -343,7 +389,7 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
printf ("Created snapshot file: '%s' (%lu bytes)\n", output_file_name_p, (unsigned long) snapshot_size);
- if (save_literals_file_name_p != NULL)
+ if (literals_file_name_p != NULL && !is_import_literals)
{
const size_t literal_buffer_size = jerry_parse_and_save_literals ((jerry_char_t *) source_p,
source_length,
@@ -357,18 +403,18 @@ process_generate (cli_state_t *cli_state_p, /**< cli state */
return JERRY_STANDALONE_EXIT_CODE_FAIL;
}
- FILE *literal_file_p = fopen (save_literals_file_name_p, "wb");
+ FILE *literal_file_p = fopen (literals_file_name_p, "wb");
if (literal_file_p == NULL)
{
- jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: Unable to write literal file: '%s'\n", save_literals_file_name_p);
+ jerry_port_log (JERRY_LOG_LEVEL_ERROR, "Error: Unable to write literal file: '%s'\n", literals_file_name_p);
return JERRY_STANDALONE_EXIT_CODE_FAIL;
}
fwrite (output_buffer, sizeof (uint8_t), literal_buffer_size, literal_file_p);
fclose (literal_file_p);
- printf ("Created literal file: '%s' (%lu bytes)\n", save_literals_file_name_p, (unsigned long) literal_buffer_size);
+ printf ("Created literal file: '%s' (%lu bytes)\n", literals_file_name_p, (unsigned long) literal_buffer_size);
}
return 0;