From 8547380d46efc9602b7689a351c923744a8d769d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Lang=C3=B3?= Date: Mon, 3 Sep 2018 14:00:07 +0200 Subject: [PATCH] Fix constantness of 'jerry_merge_snapshots' function. (#2504) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 'jerry_merge_snapshots' should not modify the input snapshots. Updated the related unit test. Also fixed some minor style issues. JerryScript-DCO-1.0-Signed-off-by: László Langó llango.u-szeged@partner.samsung.com --- jerry-core/api/jerry-snapshot.c | 164 ++++++++++---------- jerry-core/ecma/base/ecma-literal-storage.c | 2 +- tests/unit-core/test-snapshot.c | 12 +- 3 files changed, 94 insertions(+), 84 deletions(-) diff --git a/jerry-core/api/jerry-snapshot.c b/jerry-core/api/jerry-snapshot.c index 7f969bfd0..47241bf88 100644 --- a/jerry-core/api/jerry-snapshot.c +++ b/jerry-core/api/jerry-snapshot.c @@ -965,7 +965,7 @@ jerry_snapshot_result (const uint32_t *snapshot_p, /**< snapshot */ } else { - const uint8_t *literal_base_p = (uint8_t *) (snapshot_data_p + header_p->lit_table_offset); + const uint8_t *literal_base_p = snapshot_data_p + header_p->lit_table_offset; bytecode_p = snapshot_load_compiled_code ((const uint8_t *) bytecode_p, literal_base_p, @@ -1055,7 +1055,78 @@ scan_snapshot_functions (const uint8_t *buffer_p, /**< snapshot buffer start */ do { - ecma_compiled_code_t *bytecode_p = (ecma_compiled_code_t *) buffer_p; + const ecma_compiled_code_t *bytecode_p = (ecma_compiled_code_t *) buffer_p; + uint32_t code_size = ((uint32_t) bytecode_p->size) << JMEM_ALIGNMENT_LOG; + + if ((bytecode_p->status_flags & CBC_CODE_FLAGS_FUNCTION) + && !(bytecode_p->status_flags & CBC_CODE_FLAGS_STATIC_FUNCTION)) + { + const ecma_value_t *literal_start_p; + uint32_t argument_end; + uint32_t const_literal_end; + + if (bytecode_p->status_flags & CBC_CODE_FLAGS_UINT16_ARGUMENTS) + { + literal_start_p = (ecma_value_t *) (buffer_p + sizeof (cbc_uint16_arguments_t)); + + cbc_uint16_arguments_t *args_p = (cbc_uint16_arguments_t *) buffer_p; + argument_end = args_p->argument_end; + const_literal_end = (uint32_t) (args_p->const_literal_end - args_p->register_end); + } + else + { + literal_start_p = (ecma_value_t *) (buffer_p + sizeof (cbc_uint8_arguments_t)); + + cbc_uint8_arguments_t *args_p = (cbc_uint8_arguments_t *) buffer_p; + argument_end = args_p->argument_end; + const_literal_end = (uint32_t) (args_p->const_literal_end - args_p->register_end); + } + + for (uint32_t i = 0; i < const_literal_end; i++) + { + if ((literal_start_p[i] & ECMA_VALUE_TYPE_MASK) == ECMA_TYPE_SNAPSHOT_OFFSET) + { + ecma_value_t lit_value = ecma_snapshot_get_literal (literal_base_p, literal_start_p[i]); + ecma_save_literals_append_value (lit_value, lit_pool_p); + } + } + + if (CBC_NON_STRICT_ARGUMENTS_NEEDED (bytecode_p)) + { + uint8_t *byte_p = (uint8_t *) bytecode_p; + byte_p += ((size_t) bytecode_p->size) << JMEM_ALIGNMENT_LOG; + literal_start_p = ((ecma_value_t *) byte_p) - argument_end; + + for (uint32_t i = 0; i < argument_end; i++) + { + if ((literal_start_p[i] & ECMA_VALUE_TYPE_MASK) == ECMA_TYPE_SNAPSHOT_OFFSET) + { + ecma_value_t lit_value = ecma_snapshot_get_literal (literal_base_p, literal_start_p[i]); + ecma_save_literals_append_value (lit_value, lit_pool_p); + } + } + } + } + + buffer_p += code_size; + } + while (buffer_p < buffer_end_p); +} /* scan_snapshot_functions */ + +/** + * Update all literal offsets in a snapshot data. + */ +static void +update_literal_offsets (uint8_t *buffer_p, /**< [in,out] snapshot buffer start */ + const uint8_t *buffer_end_p, /**< snapshot buffer end */ + const lit_mem_to_snapshot_id_map_entry_t *lit_map_p, /**< literal map */ + const uint8_t *literal_base_p) /**< start of literal data */ +{ + JERRY_ASSERT (buffer_end_p > buffer_p); + + do + { + const ecma_compiled_code_t *bytecode_p = (ecma_compiled_code_t *) buffer_p; uint32_t code_size = ((uint32_t) bytecode_p->size) << JMEM_ALIGNMENT_LOG; if ((bytecode_p->status_flags & CBC_CODE_FLAGS_FUNCTION) @@ -1087,81 +1158,9 @@ scan_snapshot_functions (const uint8_t *buffer_p, /**< snapshot buffer start */ if ((literal_start_p[i] & ECMA_VALUE_TYPE_MASK) == ECMA_TYPE_SNAPSHOT_OFFSET) { ecma_value_t lit_value = ecma_snapshot_get_literal (literal_base_p, literal_start_p[i]); - literal_start_p[i] = lit_value; - ecma_save_literals_append_value (lit_value, lit_pool_p); - } - } + const lit_mem_to_snapshot_id_map_entry_t *current_p = lit_map_p; - if (CBC_NON_STRICT_ARGUMENTS_NEEDED (bytecode_p)) - { - uint8_t *byte_p = (uint8_t *) bytecode_p; - byte_p += ((size_t) bytecode_p->size) << JMEM_ALIGNMENT_LOG; - literal_start_p = ((ecma_value_t *) byte_p) - argument_end; - - for (uint32_t i = 0; i < argument_end; i++) - { - if ((literal_start_p[i] & ECMA_VALUE_TYPE_MASK) == ECMA_TYPE_SNAPSHOT_OFFSET) - { - ecma_value_t lit_value = ecma_snapshot_get_literal (literal_base_p, literal_start_p[i]); - literal_start_p[i] = lit_value; - ecma_save_literals_append_value (lit_value, lit_pool_p); - } - } - } - } - - buffer_p += code_size; - } - while (buffer_p < buffer_end_p); -} /* scan_snapshot_functions */ - -/** - * Update all literal offsets in a snapshot data. - */ -static void -update_literal_offsets (uint8_t *buffer_p, /**< snapshot buffer start */ - const uint8_t *buffer_end_p, /**< snapshot buffer end */ - lit_mem_to_snapshot_id_map_entry_t *lit_map_p) /**< literal map */ -{ - JERRY_ASSERT (buffer_end_p > buffer_p); - - do - { - ecma_compiled_code_t *bytecode_p = (ecma_compiled_code_t *) buffer_p; - uint32_t code_size = ((uint32_t) bytecode_p->size) << JMEM_ALIGNMENT_LOG; - - if ((bytecode_p->status_flags & CBC_CODE_FLAGS_FUNCTION) - && !(bytecode_p->status_flags & CBC_CODE_FLAGS_STATIC_FUNCTION)) - { - ecma_value_t *literal_start_p; - uint32_t argument_end; - uint32_t const_literal_end; - - if (bytecode_p->status_flags & CBC_CODE_FLAGS_UINT16_ARGUMENTS) - { - literal_start_p = (ecma_value_t *) (buffer_p + sizeof (cbc_uint16_arguments_t)); - - cbc_uint16_arguments_t *args_p = (cbc_uint16_arguments_t *) buffer_p; - argument_end = args_p->argument_end; - const_literal_end = (uint32_t) (args_p->const_literal_end - args_p->register_end); - } - else - { - literal_start_p = (ecma_value_t *) (buffer_p + sizeof (cbc_uint8_arguments_t)); - - cbc_uint8_arguments_t *args_p = (cbc_uint8_arguments_t *) buffer_p; - argument_end = args_p->argument_end; - const_literal_end = (uint32_t) (args_p->const_literal_end - args_p->register_end); - } - - for (uint32_t i = 0; i < const_literal_end; i++) - { - if (ecma_is_value_string (literal_start_p[i]) - || ecma_is_value_float_number (literal_start_p[i])) - { - lit_mem_to_snapshot_id_map_entry_t *current_p = lit_map_p; - - while (current_p->literal_id != literal_start_p[i]) + while (current_p->literal_id != lit_value) { current_p++; } @@ -1178,11 +1177,12 @@ update_literal_offsets (uint8_t *buffer_p, /**< snapshot buffer start */ for (uint32_t i = 0; i < argument_end; i++) { - if (literal_start_p[i] != ECMA_VALUE_EMPTY) + if ((literal_start_p[i] & ECMA_VALUE_TYPE_MASK) == ECMA_TYPE_SNAPSHOT_OFFSET) { - lit_mem_to_snapshot_id_map_entry_t *current_p = lit_map_p; + ecma_value_t lit_value = ecma_snapshot_get_literal (literal_base_p, literal_start_p[i]); + const lit_mem_to_snapshot_id_map_entry_t *current_p = lit_map_p; - while (current_p->literal_id != literal_start_p[i]) + while (current_p->literal_id != lit_value) { current_p++; } @@ -1251,7 +1251,7 @@ jerry_merge_snapshots (const uint32_t **inp_buffers_p, /**< array of (pointers t uint32_t start_offset = header_p->func_offsets[0]; const uint8_t *data_p = (const uint8_t *) inp_buffers_p[i]; - const uint8_t *literal_base_p = (uint8_t *) (data_p + header_p->lit_table_offset); + const uint8_t *literal_base_p = data_p + header_p->lit_table_offset; JERRY_ASSERT (header_p->number_of_funcs > 0); @@ -1311,9 +1311,11 @@ jerry_merge_snapshots (const uint32_t **inp_buffers_p, /**< array of (pointers t ((const uint8_t *) inp_buffers_p[i]) + start_offset, current_header_p->lit_table_offset - start_offset); + const uint8_t *literal_base_p = ((const uint8_t *) inp_buffers_p[i]) + current_header_p->lit_table_offset; update_literal_offsets (dst_p, dst_p + current_header_p->lit_table_offset - start_offset, - lit_map_p); + lit_map_p, + literal_base_p); uint32_t current_offset = (uint32_t) (dst_p - (uint8_t *) out_buffer_p) - start_offset; diff --git a/jerry-core/ecma/base/ecma-literal-storage.c b/jerry-core/ecma/base/ecma-literal-storage.c index 959711353..4262ea9f0 100644 --- a/jerry-core/ecma/base/ecma-literal-storage.c +++ b/jerry-core/ecma/base/ecma-literal-storage.c @@ -346,7 +346,7 @@ ecma_save_literals_add_compiled_code (const ecma_compiled_code_t *compiled_code_ * Save literals to specified snapshot buffer. * * Note: - * Frees lit_pool_p regardless of success. + * Frees 'lit_pool_p' regardless of success. * * @return true - if save was performed successfully (i.e. buffer size is sufficient), * false - otherwise diff --git a/tests/unit-core/test-snapshot.c b/tests/unit-core/test-snapshot.c index d37491bf5..6d11bfb13 100644 --- a/tests/unit-core/test-snapshot.c +++ b/tests/unit-core/test-snapshot.c @@ -286,7 +286,7 @@ main (void) size_t snapshot_sizes[2]; static uint32_t merged_snapshot_buffer[SNAPSHOT_BUFFER_SIZE]; - const char *code_to_snapshot_p = "123"; + const char *code_to_snapshot_p = "var a = 'hello'; 123"; jerry_init (JERRY_INIT_EMPTY); jerry_value_t generate_result; @@ -305,7 +305,7 @@ main (void) jerry_cleanup (); - code_to_snapshot_p = "456"; + code_to_snapshot_p = "var b = 'hello'; 456"; jerry_init (JERRY_INIT_EMPTY); generate_result = jerry_generate_snapshot (NULL, @@ -331,6 +331,12 @@ main (void) snapshot_buffers[0] = snapshot_buffer_0; snapshot_buffers[1] = snapshot_buffer_1; + static uint32_t snapshot_buffer_0_bck[SNAPSHOT_BUFFER_SIZE]; + static uint32_t snapshot_buffer_1_bck[SNAPSHOT_BUFFER_SIZE]; + + memcpy (snapshot_buffer_0_bck, snapshot_buffer_0, SNAPSHOT_BUFFER_SIZE); + memcpy (snapshot_buffer_1_bck, snapshot_buffer_1, SNAPSHOT_BUFFER_SIZE); + size_t merged_size = jerry_merge_snapshots (snapshot_buffers, snapshot_sizes, 2, @@ -340,6 +346,8 @@ main (void) jerry_cleanup (); + TEST_ASSERT (0 == memcmp (snapshot_buffer_0_bck, snapshot_buffer_0, SNAPSHOT_BUFFER_SIZE)); + TEST_ASSERT (0 == memcmp (snapshot_buffer_1_bck, snapshot_buffer_1, SNAPSHOT_BUFFER_SIZE)); jerry_init (JERRY_INIT_EMPTY);