Change strings offset size from 8 bits to 16 bits
This commit is contained in:
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
+1
-1
@@ -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 );
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user