Lazy initialization in deserializer

This commit is contained in:
Ilmir Usmanov
2014-07-24 15:24:51 +04:00
parent ea4278184c
commit b4404578ca
4 changed files with 47 additions and 16 deletions
+3 -1
View File
@@ -17,9 +17,11 @@
#define DESERIALIZER_H #define DESERIALIZER_H
#include "globals.h" #include "globals.h"
#include "ecma-globals.h"
const char *deserialize_string_by_id (uint8_t); const ecma_char_t *deserialize_string_by_id (uint8_t);
int deserialize_num_by_id (uint8_t); int deserialize_num_by_id (uint8_t);
const void *deserialize_bytecode (void); const void *deserialize_bytecode (void);
uint8_t deserialize_min_temp (void);
#endif //DESERIALIZER_H #endif //DESERIALIZER_H
+33 -12
View File
@@ -16,7 +16,10 @@
#include "deserializer.h" #include "deserializer.h"
#include "bytecode-linux.h" #include "bytecode-linux.h"
const char * int *num_data = NULL;
uint8_t num_size = 0;
const ecma_char_t *
deserialize_string_by_id (uint8_t id) deserialize_string_by_id (uint8_t id)
{ {
uint8_t size = *bytecode_data, *data = bytecode_data, offset; uint8_t size = *bytecode_data, *data = bytecode_data, offset;
@@ -28,28 +31,33 @@ deserialize_string_by_id (uint8_t id)
offset = *data; offset = *data;
return (char*) (bytecode_data + offset); return bytecode_data + offset;
} }
int int
deserialize_num_by_id (uint8_t id) deserialize_num_by_id (uint8_t id)
{ {
int *num_data; uint8_t str_size, str_offset, *data;
uint8_t str_size, str_offset, *data, num_size;
str_size = *bytecode_data; str_size = *bytecode_data;
data = bytecode_data + str_size;
if (id < str_size) if (id < str_size)
return 0; {
return 0;
}
id = (uint8_t) (id - str_size); id = (uint8_t) (id - str_size);
str_offset = *data;
data = bytecode_data + str_offset;
while (*data) if (num_data == NULL)
data++; {
data = bytecode_data + str_size;
str_offset = *data;
data = bytecode_data + str_offset;
num_size = *(++data); while (*data)
num_data = (int *) ++data; data++;
num_size = *(++data);
num_data = (int *) ++data;
}
if (id >= num_size) if (id >= num_size)
return 0; return 0;
@@ -62,3 +70,16 @@ deserialize_bytecode (void)
{ {
return bytecode_opcodes; return bytecode_opcodes;
} }
uint8_t
deserialize_min_temp (void)
{
uint8_t str_size = *bytecode_data;
if (num_size == 0)
{
deserialize_num_by_id (str_size); // Init num_data and num_size
}
return (uint8_t) (str_size + num_size);
}
+3 -1
View File
@@ -71,7 +71,7 @@ serializer_dump_strings (const char *strings[], uint8_t size)
#ifndef JERRY_NDEBUG #ifndef JERRY_NDEBUG
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
{ {
JERRY_ASSERT (!__strcmp (strings[i], deserialize_string_by_id (i))); JERRY_ASSERT (!__strcmp (strings[i], (const char *) deserialize_string_by_id (i)));
} }
#endif #endif
@@ -112,6 +112,8 @@ serializer_dump_nums (const int nums[], uint8_t size, uint8_t offset, uint8_t st
{ {
JERRY_ASSERT (nums[i] == deserialize_num_by_id ((uint8_t) (i + strings_num))); JERRY_ASSERT (nums[i] == deserialize_num_by_id ((uint8_t) (i + strings_num)));
} }
JERRY_ASSERT (deserialize_min_temp () == (uint8_t) (size + strings_num));
#endif #endif
} }
+7 -1
View File
@@ -17,7 +17,7 @@
TODO (Implement) TODO (Implement)
const char * const ecma_char_t *
deserialize_string_by_id (uint8_t id) deserialize_string_by_id (uint8_t id)
{ {
JERRY_UNIMPLEMENTED_REF_UNUSED_VARS (id); JERRY_UNIMPLEMENTED_REF_UNUSED_VARS (id);
@@ -34,3 +34,9 @@ deserialize_bytecode (void)
{ {
JERRY_UNIMPLEMENTED (); JERRY_UNIMPLEMENTED ();
} }
uint8_t
deserialize_min_temp (void)
{
JERRY_UNIMPLEMENTED ();
}