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
#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);
const void *deserialize_bytecode (void);
uint8_t deserialize_min_temp (void);
#endif //DESERIALIZER_H
+34 -13
View File
@@ -16,7 +16,10 @@
#include "deserializer.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)
{
uint8_t size = *bytecode_data, *data = bytecode_data, offset;
@@ -28,28 +31,33 @@ deserialize_string_by_id (uint8_t id)
offset = *data;
return (char*) (bytecode_data + offset);
return bytecode_data + offset;
}
int
deserialize_num_by_id (uint8_t id)
{
int *num_data;
uint8_t str_size, str_offset, *data, num_size;
uint8_t str_size, str_offset, *data;
str_size = *bytecode_data;
data = bytecode_data + str_size;
if (id < str_size)
return 0;
{
return 0;
}
id = (uint8_t) (id - str_size);
str_offset = *data;
data = bytecode_data + str_offset;
if (num_data == NULL)
{
data = bytecode_data + str_size;
str_offset = *data;
data = bytecode_data + str_offset;
while (*data)
data++;
num_size = *(++data);
num_data = (int *) ++data;
while (*data)
data++;
num_size = *(++data);
num_data = (int *) ++data;
}
if (id >= num_size)
return 0;
@@ -62,3 +70,16 @@ deserialize_bytecode (void)
{
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
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
@@ -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 (deserialize_min_temp () == (uint8_t) (size + strings_num));
#endif
}
+7 -1
View File
@@ -17,7 +17,7 @@
TODO (Implement)
const char *
const ecma_char_t *
deserialize_string_by_id (uint8_t id)
{
JERRY_UNIMPLEMENTED_REF_UNUSED_VARS (id);
@@ -34,3 +34,9 @@ deserialize_bytecode (void)
{
JERRY_UNIMPLEMENTED ();
}
uint8_t
deserialize_min_temp (void)
{
JERRY_UNIMPLEMENTED ();
}