Change strings offset size from 8 bits to 16 bits

This commit is contained in:
Ilmir Usmanov
2014-07-29 17:49:13 +04:00
parent bc9d80147a
commit e497875c06
13 changed files with 63 additions and 45 deletions
+2 -2
View File
@@ -21,9 +21,9 @@
void serializer_init (void); 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); void serializer_dump_opcode (OPCODE);
+10 -7
View File
@@ -22,7 +22,8 @@ uint8_t num_size = 0;
const ecma_char_t * const ecma_char_t *
deserialize_string_by_id (uint8_t id) deserialize_string_by_id (uint8_t id)
{ {
uint8_t size, *data, offset; uint8_t size, *data;
uint16_t offset;
if (bytecode_data == NULL) if (bytecode_data == NULL)
return NULL; return NULL;
@@ -34,17 +35,18 @@ deserialize_string_by_id (uint8_t id)
data = bytecode_data; 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 int
deserialize_num_by_id (uint8_t id) 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; str_size = *bytecode_data;
if (id < str_size) if (id < str_size)
@@ -55,8 +57,9 @@ deserialize_num_by_id (uint8_t id)
if (num_data == NULL) if (num_data == NULL)
{ {
data = bytecode_data + str_size; // Go to last string's offset
str_offset = *data; data = (uint8_t *) (bytecode_data + str_size * 2 - 1);
str_offset = *((uint16_t *) data);
data = bytecode_data + str_offset; data = bytecode_data + str_offset;
while (*data) while (*data)
+18 -13
View File
@@ -14,6 +14,7 @@
*/ */
#include "serializer.h" #include "serializer.h"
#include "parser.h"
#include "jerry-libc.h" #include "jerry-libc.h"
#include "bytecode-linux.h" #include "bytecode-linux.h"
#include "deserializer.h" #include "deserializer.h"
@@ -41,32 +42,35 @@ serializer_init (void)
{ {
} }
uint8_t uint16_t
serializer_dump_strings (const char *strings[], uint8_t size) serializer_dump_strings (const char *strings[], uint8_t size)
{ {
uint8_t i; 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); __printf ("STRINGS %d:\n", size);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
__printf ("%3d %3d %20s\n", i, offset, strings[i]); __printf ("%3d %5d %20s\n", i, offset, strings[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); bytecode_data = mem_heap_alloc_block (offset, MEM_HEAP_ALLOC_SHORT_TERM);
res = offset; res = offset;
bytecode_data[0] = size; bytecode_data[0] = size;
offset = (uint8_t) (size + 1); offset = (uint16_t) (size * 2 + 1);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
bytecode_data[i + 1] = offset; *((uint16_t *) (bytecode_data + i * 2 + 1)) = offset;
offset = (uint8_t) (offset + __strlen (strings[i]) + 1); offset = (uint16_t) (offset + __strlen (strings[i]) + 1);
} }
for (i = 0; i < size; i++) 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 #ifndef JERRY_NDEBUG
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
@@ -79,21 +83,22 @@ serializer_dump_strings (const char *strings[], uint8_t size)
} }
void 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); __printf ("NUMS %d:\n", size);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
__printf ("%3d %3d %7d\n", i + strings_num, num_offset, nums[i]); __printf ("%3d %7d\n", i + strings_num, nums[i]);
num_offset = (uint8_t) (num_offset + 4);
} }
__printf ("\n"); __printf ("\n");
data = mem_heap_alloc_block ((size_t) (offset + size * 4 + 1), MEM_HEAP_ALLOC_LONG_TERM); 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); __memcpy (data, bytecode_data, offset);
mem_heap_free_block (bytecode_data); mem_heap_free_block (bytecode_data);
bytecode_data = data; bytecode_data = data;
+10 -7
View File
@@ -24,7 +24,8 @@ uint8_t num_size = 0;
const ecma_char_t * const ecma_char_t *
deserialize_string_by_id (uint8_t id) deserialize_string_by_id (uint8_t id)
{ {
uint8_t size, *data, offset; uint8_t size, *data;
uint16_t offset;
if (bytecode_data == NULL) if (bytecode_data == NULL)
return NULL; return NULL;
@@ -36,17 +37,18 @@ deserialize_string_by_id (uint8_t id)
data = bytecode_data; 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 int
deserialize_num_by_id (uint8_t id) 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; str_size = *bytecode_data;
if (id < str_size) if (id < str_size)
@@ -57,8 +59,9 @@ deserialize_num_by_id (uint8_t id)
if (num_data == NULL) if (num_data == NULL)
{ {
data = bytecode_data + str_size; // Go to last string's offset
str_offset = *data; data = (uint8_t *) (bytecode_data + str_size * 2 - 1);
str_offset = *((uint16_t *) data);
data = bytecode_data + str_offset; data = bytecode_data + str_offset;
while (*data) while (*data)
+15 -8
View File
@@ -14,6 +14,7 @@
*/ */
#include "serializer.h" #include "serializer.h"
#include "parser.h"
#include "globals.h" #include "globals.h"
#include "serializer.h" #include "serializer.h"
#include "jerry-libc.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) serializer_dump_strings (const char *strings[], uint8_t size)
{ {
uint8_t i; 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++) 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); bytecode_data = mem_heap_alloc_block (offset, MEM_HEAP_ALLOC_SHORT_TERM);
res = offset; res = offset;
bytecode_data[0] = size; bytecode_data[0] = size;
offset = (uint8_t) (size + 1); offset = (uint16_t) (size * 2 + 1);
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
bytecode_data[i + 1] = offset; *((uint16_t *) (bytecode_data + i * 2 + 1)) = offset;
offset = (uint8_t) (offset + __strlen (strings[i]) + 1); offset = (uint16_t) (offset + __strlen (strings[i]) + 1);
} }
for (i = 0; i < size; i++) 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 #ifndef JERRY_NDEBUG
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
@@ -63,11 +67,14 @@ serializer_dump_strings (const char *strings[], uint8_t size)
} }
void 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; uint8_t i, *data;
data = mem_heap_alloc_block ((size_t) (offset + size * 4 + 1), MEM_HEAP_ALLOC_LONG_TERM); 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); __memcpy (data, bytecode_data, offset);
mem_heap_free_block (bytecode_data); mem_heap_free_block (bytecode_data);
+1 -1
View File
@@ -36,7 +36,7 @@ parser_run (const char *script_source, size_t script_source_size __unused)
const char *strings[MAX_STRINGS]; const char *strings[MAX_STRINGS];
int32_t nums[MAX_NUMS]; int32_t nums[MAX_NUMS];
uint8_t strings_num, nums_count; uint8_t strings_num, nums_count;
uint8_t offset; uint16_t offset;
const OPCODE *opcodes; const OPCODE *opcodes;
TODO( Consider using script_source_size in lexer to check buffer boundaries ); TODO( Consider using script_source_size in lexer to check buffer boundaries );
@@ -41,7 +41,7 @@ main( int __unused argc,
const char *strings[] = { "a", const char *strings[] = { "a",
"b" }; "b" };
int nums [] = { 2 }; 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); serializer_dump_nums( nums, 1, offset, 2);
init_int( test_program); init_int( test_program);
+1 -1
View File
@@ -46,7 +46,7 @@ main( int __unused argc,
const char *strings[] = { "a", const char *strings[] = { "a",
"b" }; "b" };
int nums [] = { 2 }; 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); serializer_dump_nums( nums, 1, offset, 2);
init_int( test_program); init_int( test_program);
+1 -1
View File
@@ -41,7 +41,7 @@ main( int __unused argc,
const char *strings[] = { "a", const char *strings[] = { "a",
"b" }; "b" };
int nums [] = { 2 }; 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); serializer_dump_nums( nums, 1, offset, 2);
init_int( test_program); init_int( test_program);
+1 -1
View File
@@ -41,7 +41,7 @@ main( int __unused argc,
const char *strings[] = { "a", const char *strings[] = { "a",
"b" }; "b" };
int nums [] = { 2 }; 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); serializer_dump_nums( nums, 1, offset, 2);
init_int( test_program); init_int( test_program);
+1 -1
View File
@@ -41,7 +41,7 @@ main( int __unused argc,
const char *strings[] = { "a", const char *strings[] = { "a",
"b" }; "b" };
int nums [] = { 2 }; 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); serializer_dump_nums( nums, 1, offset, 2);
init_int( test_program); init_int( test_program);
+1 -1
View File
@@ -41,7 +41,7 @@ main( int __unused argc,
const char *strings[] = { "a", const char *strings[] = { "a",
"b" }; "b" };
int nums [] = { 2 }; 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); serializer_dump_nums( nums, 1, offset, 2);
init_int( test_program); init_int( test_program);
@@ -39,7 +39,7 @@ main( int __unused argc,
const char *strings[] = { "a", const char *strings[] = { "a",
"b" }; "b" };
int nums [] = { 2 }; 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); serializer_dump_nums( nums, 1, offset, 2);
init_int( test_program); init_int( test_program);