diff --git a/src/libruntime/serializer.h b/src/libruntime/serializer.h index f437ce1a1..e47008a84 100644 --- a/src/libruntime/serializer.h +++ b/src/libruntime/serializer.h @@ -21,9 +21,9 @@ void serializer_init (void); -uint8_t serializer_dump_strings (const char **, uint8_t); +uint16_t serializer_dump_strings (const char **, uint8_t); -void serializer_dump_nums (const int32_t *, uint8_t, uint8_t, uint8_t); +void serializer_dump_nums (const int32_t *, uint8_t, uint16_t, uint8_t); void serializer_dump_opcode (OPCODE); diff --git a/src/libruntime/target/linux/deserializer.c b/src/libruntime/target/linux/deserializer.c index eaa50a2ce..1056fc88b 100644 --- a/src/libruntime/target/linux/deserializer.c +++ b/src/libruntime/target/linux/deserializer.c @@ -22,7 +22,8 @@ uint8_t num_size = 0; const ecma_char_t * deserialize_string_by_id (uint8_t id) { - uint8_t size, *data, offset; + uint8_t size, *data; + uint16_t offset; if (bytecode_data == NULL) return NULL; @@ -34,17 +35,18 @@ deserialize_string_by_id (uint8_t id) data = bytecode_data; - data += id + 1; + data += id * 2 + 1; - offset = *data; + offset = *((uint16_t *) data); - return bytecode_data + offset; + return ((const ecma_char_t *) bytecode_data + offset); } int deserialize_num_by_id (uint8_t id) { - uint8_t str_size, str_offset, *data; + uint16_t str_size, str_offset; + uint8_t *data; str_size = *bytecode_data; if (id < str_size) @@ -55,8 +57,9 @@ deserialize_num_by_id (uint8_t id) if (num_data == NULL) { - data = bytecode_data + str_size; - str_offset = *data; + // Go to last string's offset + data = (uint8_t *) (bytecode_data + str_size * 2 - 1); + str_offset = *((uint16_t *) data); data = bytecode_data + str_offset; while (*data) diff --git a/src/libruntime/target/linux/serializer.c b/src/libruntime/target/linux/serializer.c index 801fc2d13..a5b983249 100644 --- a/src/libruntime/target/linux/serializer.c +++ b/src/libruntime/target/linux/serializer.c @@ -14,6 +14,7 @@ */ #include "serializer.h" +#include "parser.h" #include "jerry-libc.h" #include "bytecode-linux.h" #include "deserializer.h" @@ -41,32 +42,35 @@ serializer_init (void) { } -uint8_t +uint16_t serializer_dump_strings (const char *strings[], uint8_t size) { uint8_t i; - uint8_t offset = (uint8_t) (size + 1), res; + uint16_t offset = (uint16_t) (size * 2 + 1), res; __printf ("STRINGS %d:\n", size); for (i = 0; i < size; i++) { - __printf ("%3d %3d %20s\n", i, offset, strings[i]); - offset = (uint8_t) (offset + __strlen (strings[i]) + 1); + __printf ("%3d %5d %20s\n", i, offset, strings[i]); + offset = (uint16_t) (offset + __strlen (strings[i]) + 1); } bytecode_data = mem_heap_alloc_block (offset, MEM_HEAP_ALLOC_SHORT_TERM); res = offset; bytecode_data[0] = size; - offset = (uint8_t) (size + 1); + offset = (uint16_t) (size * 2 + 1); for (i = 0; i < size; i++) { - bytecode_data[i + 1] = offset; - offset = (uint8_t) (offset + __strlen (strings[i]) + 1); + *((uint16_t *) (bytecode_data + i * 2 + 1)) = offset; + offset = (uint16_t) (offset + __strlen (strings[i]) + 1); } for (i = 0; i < size; i++) - __strncpy ((void *) (bytecode_data + bytecode_data[i + 1]), strings[i], __strlen (strings[i]) + 1); + { + offset = *((uint16_t *) (bytecode_data + i * 2 + 1)); + __strncpy ((char *) (bytecode_data + offset), strings[i], __strlen (strings[i]) + 1); + } #ifndef JERRY_NDEBUG for (i = 0; i < size; i++) @@ -79,21 +83,22 @@ serializer_dump_strings (const char *strings[], uint8_t size) } void -serializer_dump_nums (const int32_t nums[], uint8_t size, uint8_t offset, uint8_t strings_num) +serializer_dump_nums (const int32_t nums[], uint8_t size, uint16_t offset, uint8_t strings_num) { - uint8_t i, *data, num_offset; + uint8_t i, *data; - num_offset = (uint8_t) (offset + size + 1); __printf ("NUMS %d:\n", size); for (i = 0; i < size; i++) { - __printf ("%3d %3d %7d\n", i + strings_num, num_offset, nums[i]); - num_offset = (uint8_t) (num_offset + 4); + __printf ("%3d %7d\n", i + strings_num, nums[i]); } __printf ("\n"); data = mem_heap_alloc_block ((size_t) (offset + size * 4 + 1), MEM_HEAP_ALLOC_LONG_TERM); + if (!data) + parser_fatal (ERR_MEMORY); + __memcpy (data, bytecode_data, offset); mem_heap_free_block (bytecode_data); bytecode_data = data; diff --git a/src/libruntime/target/stm32f4/deserializer.c b/src/libruntime/target/stm32f4/deserializer.c index 192d3d2e4..c6013a63a 100644 --- a/src/libruntime/target/stm32f4/deserializer.c +++ b/src/libruntime/target/stm32f4/deserializer.c @@ -24,7 +24,8 @@ uint8_t num_size = 0; const ecma_char_t * deserialize_string_by_id (uint8_t id) { - uint8_t size, *data, offset; + uint8_t size, *data; + uint16_t offset; if (bytecode_data == NULL) return NULL; @@ -36,17 +37,18 @@ deserialize_string_by_id (uint8_t id) data = bytecode_data; - data += id + 1; + data += id * 2 + 1; - offset = *data; + offset = *((uint16_t *) data); - return bytecode_data + offset; + return ((const ecma_char_t *) bytecode_data + offset); } int deserialize_num_by_id (uint8_t id) { - uint8_t str_size, str_offset, *data; + uint16_t str_size, str_offset; + uint8_t *data; str_size = *bytecode_data; if (id < str_size) @@ -57,8 +59,9 @@ deserialize_num_by_id (uint8_t id) if (num_data == NULL) { - data = bytecode_data + str_size; - str_offset = *data; + // Go to last string's offset + data = (uint8_t *) (bytecode_data + str_size * 2 - 1); + str_offset = *((uint16_t *) data); data = bytecode_data + str_offset; while (*data) diff --git a/src/libruntime/target/stm32f4/serializer.c b/src/libruntime/target/stm32f4/serializer.c index 5a0ba8af2..41ee302d3 100644 --- a/src/libruntime/target/stm32f4/serializer.c +++ b/src/libruntime/target/stm32f4/serializer.c @@ -14,6 +14,7 @@ */ #include "serializer.h" +#include "parser.h" #include "globals.h" #include "serializer.h" #include "jerry-libc.h" @@ -27,30 +28,33 @@ serializer_init (void) { } -uint8_t +uint16_t serializer_dump_strings (const char *strings[], uint8_t size) { uint8_t i; - uint8_t offset = (uint8_t) (size + 1), res; + uint16_t offset = (uint8_t) (size * 2 + 1), res; for (i = 0; i < size; i++) { - offset = (uint8_t) (offset + __strlen (strings[i]) + 1); + offset = (uint16_t) (offset + __strlen (strings[i]) + 1); } bytecode_data = mem_heap_alloc_block (offset, MEM_HEAP_ALLOC_SHORT_TERM); res = offset; bytecode_data[0] = size; - offset = (uint8_t) (size + 1); + offset = (uint16_t) (size * 2 + 1); for (i = 0; i < size; i++) { - bytecode_data[i + 1] = offset; - offset = (uint8_t) (offset + __strlen (strings[i]) + 1); + *((uint16_t *) (bytecode_data + i * 2 + 1)) = offset; + offset = (uint16_t) (offset + __strlen (strings[i]) + 1); } for (i = 0; i < size; i++) - __strncpy ((void *) (bytecode_data + bytecode_data[i + 1]), strings[i], __strlen (strings[i]) + 1); + { + offset = *((uint16_t *) (bytecode_data + i * 2 + 1)); + __strncpy ((char *) (bytecode_data + offset), strings[i], __strlen (strings[i]) + 1); + } #ifndef JERRY_NDEBUG for (i = 0; i < size; i++) @@ -63,11 +67,14 @@ serializer_dump_strings (const char *strings[], uint8_t size) } void -serializer_dump_nums (const int32_t nums[], uint8_t size, uint8_t offset, uint8_t strings_num __unused) +serializer_dump_nums (const int32_t nums[], uint8_t size, uint16_t offset, uint8_t strings_num __unused) { uint8_t i, *data; data = mem_heap_alloc_block ((size_t) (offset + size * 4 + 1), MEM_HEAP_ALLOC_LONG_TERM); + if (!data) + parser_fatal (ERR_MEMORY); + __memcpy (data, bytecode_data, offset); mem_heap_free_block (bytecode_data); diff --git a/src/main.c b/src/main.c index cfe99a642..52ccd1f2f 100644 --- a/src/main.c +++ b/src/main.c @@ -36,7 +36,7 @@ parser_run (const char *script_source, size_t script_source_size __unused) const char *strings[MAX_STRINGS]; int32_t nums[MAX_NUMS]; uint8_t strings_num, nums_count; - uint8_t offset; + uint16_t offset; const OPCODE *opcodes; TODO( Consider using script_source_size in lexer to check buffer boundaries ); diff --git a/tests/unit/test_addition_opcode_number_operands.c b/tests/unit/test_addition_opcode_number_operands.c index 0ebeadfe4..747b78dc7 100644 --- a/tests/unit/test_addition_opcode_number_operands.c +++ b/tests/unit/test_addition_opcode_number_operands.c @@ -41,7 +41,7 @@ main( int __unused argc, const char *strings[] = { "a", "b" }; int nums [] = { 2 }; - uint8_t offset = serializer_dump_strings( strings, 2); + uint16_t offset = serializer_dump_strings( strings, 2); serializer_dump_nums( nums, 1, offset, 2); init_int( test_program); diff --git a/tests/unit/test_assignment_opcode.c b/tests/unit/test_assignment_opcode.c index ef8950da2..e96796a5c 100644 --- a/tests/unit/test_assignment_opcode.c +++ b/tests/unit/test_assignment_opcode.c @@ -46,7 +46,7 @@ main( int __unused argc, const char *strings[] = { "a", "b" }; int nums [] = { 2 }; - uint8_t offset = serializer_dump_strings( strings, 2); + uint16_t offset = serializer_dump_strings( strings, 2); serializer_dump_nums( nums, 1, offset, 2); init_int( test_program); diff --git a/tests/unit/test_division_opcode.c b/tests/unit/test_division_opcode.c index 32e22cf0d..2bedfe736 100644 --- a/tests/unit/test_division_opcode.c +++ b/tests/unit/test_division_opcode.c @@ -41,7 +41,7 @@ main( int __unused argc, const char *strings[] = { "a", "b" }; int nums [] = { 2 }; - uint8_t offset = serializer_dump_strings( strings, 2); + uint16_t offset = serializer_dump_strings( strings, 2); serializer_dump_nums( nums, 1, offset, 2); init_int( test_program); diff --git a/tests/unit/test_multiplication_opcode.c b/tests/unit/test_multiplication_opcode.c index fdb31c203..c95abb483 100644 --- a/tests/unit/test_multiplication_opcode.c +++ b/tests/unit/test_multiplication_opcode.c @@ -41,7 +41,7 @@ main( int __unused argc, const char *strings[] = { "a", "b" }; int nums [] = { 2 }; - uint8_t offset = serializer_dump_strings( strings, 2); + uint16_t offset = serializer_dump_strings( strings, 2); serializer_dump_nums( nums, 1, offset, 2); init_int( test_program); diff --git a/tests/unit/test_remainder_opcode.c b/tests/unit/test_remainder_opcode.c index d9380fbc4..e82209ac9 100644 --- a/tests/unit/test_remainder_opcode.c +++ b/tests/unit/test_remainder_opcode.c @@ -41,7 +41,7 @@ main( int __unused argc, const char *strings[] = { "a", "b" }; int nums [] = { 2 }; - uint8_t offset = serializer_dump_strings( strings, 2); + uint16_t offset = serializer_dump_strings( strings, 2); serializer_dump_nums( nums, 1, offset, 2); init_int( test_program); diff --git a/tests/unit/test_substraction_opcode.c b/tests/unit/test_substraction_opcode.c index f47833de7..a81e0ebd4 100644 --- a/tests/unit/test_substraction_opcode.c +++ b/tests/unit/test_substraction_opcode.c @@ -41,7 +41,7 @@ main( int __unused argc, const char *strings[] = { "a", "b" }; int nums [] = { 2 }; - uint8_t offset = serializer_dump_strings( strings, 2); + uint16_t offset = serializer_dump_strings( strings, 2); serializer_dump_nums( nums, 1, offset, 2); init_int( test_program); diff --git a/tests/unit/test_var_decl_opcode_in_decl_lex_env.c b/tests/unit/test_var_decl_opcode_in_decl_lex_env.c index 274ad6f77..b4a25f091 100644 --- a/tests/unit/test_var_decl_opcode_in_decl_lex_env.c +++ b/tests/unit/test_var_decl_opcode_in_decl_lex_env.c @@ -39,7 +39,7 @@ main( int __unused argc, const char *strings[] = { "a", "b" }; int nums [] = { 2 }; - uint8_t offset = serializer_dump_strings( strings, 2); + uint16_t offset = serializer_dump_strings( strings, 2); serializer_dump_nums( nums, 1, offset, 2); init_int( test_program);