Replace array of literals with literal storage.
JerryScript-DCO-1.0-Signed-off-by: Evgeny Gavrin e.gavrin@samsung.com JerryScript-DCO-1.0-Signed-off-by: Andrey Shitov a.shitov@samsung.com
This commit is contained in:
@@ -15,6 +15,7 @@
|
||||
|
||||
#include "lit-literal-storage.h"
|
||||
#include "ecma-helpers.h"
|
||||
#include "lit-literal.h"
|
||||
|
||||
/**
|
||||
* Literal storage
|
||||
@@ -258,12 +259,25 @@ lit_magic_record_t *
|
||||
lit_literal_storage_t::create_magic_record (ecma_magic_string_id_t id) /**< id of a magic string */
|
||||
{
|
||||
lit_magic_record_t *ret = alloc_record<lit_magic_record_t> (LIT_MAGIC_STR);
|
||||
|
||||
ret->set_magic_str_id (id);
|
||||
|
||||
return ret;
|
||||
} /* lit_literal_storage_t::create_magic_record */
|
||||
|
||||
/**
|
||||
* Create external magic string record in the literal storage
|
||||
*
|
||||
* @return pointer to the created record
|
||||
*/
|
||||
lit_magic_record_t *
|
||||
lit_literal_storage_t::create_magic_record_ex (ecma_magic_string_ex_id_t id) /**< id of a magic string */
|
||||
{
|
||||
lit_magic_record_t *ret = alloc_record<lit_magic_record_t> (LIT_MAGIC_STR_EX);
|
||||
ret->set_magic_str_id (id);
|
||||
|
||||
return ret;
|
||||
} /* lit_literal_storage_t::create_magic_record_ex */
|
||||
|
||||
/**
|
||||
* Create number record in the literal storage
|
||||
*
|
||||
@@ -315,10 +329,17 @@ lit_literal_storage_t::dump ()
|
||||
}
|
||||
case LIT_MAGIC_STR:
|
||||
{
|
||||
lit_magic_record_t *lit_p = static_cast<lit_magic_record_t *> (rec_p);
|
||||
ecma_magic_string_id_t id = lit_magic_record_get_magic_str_id (rec_p);
|
||||
printf ("%s : MAGIC STRING", ecma_get_magic_string_zt (id));
|
||||
printf (" [id=%d] ", id);
|
||||
|
||||
printf ("%s : MAGIC STRING", ecma_get_magic_string_zt (lit_p->get_magic_str_id ()));
|
||||
printf (" [id=%d] ", lit_p->get_magic_str_id ());
|
||||
break;
|
||||
}
|
||||
case LIT_MAGIC_STR_EX:
|
||||
{
|
||||
ecma_magic_string_ex_id_t id = lit_magic_record_ex_get_magic_str_id (rec_p);
|
||||
printf ("%s : EXT MAGIC STRING", ecma_get_magic_string_ex_zt (id));
|
||||
printf (" [id=%d] ", id);
|
||||
|
||||
break;
|
||||
}
|
||||
@@ -364,6 +385,7 @@ lit_literal_storage_t::get_prev (rcs_record_t *rec_p) /**< record, relative to w
|
||||
return (static_cast<lit_charset_record_t *> (rec_p))->get_prev ();
|
||||
}
|
||||
case LIT_MAGIC_STR:
|
||||
case LIT_MAGIC_STR_EX:
|
||||
{
|
||||
return (static_cast<lit_magic_record_t *> (rec_p))->get_prev ();
|
||||
}
|
||||
@@ -394,6 +416,7 @@ lit_literal_storage_t::set_prev (rcs_record_t *rec_p, /**< record to modify */
|
||||
return (static_cast<lit_charset_record_t *> (rec_p))->set_prev (prev_rec_p);
|
||||
}
|
||||
case LIT_MAGIC_STR:
|
||||
case LIT_MAGIC_STR_EX:
|
||||
{
|
||||
return (static_cast<lit_magic_record_t *> (rec_p))->set_prev (prev_rec_p);
|
||||
}
|
||||
@@ -425,6 +448,7 @@ lit_literal_storage_t::get_record_size (rcs_record_t* rec_p) /**< pointer to a r
|
||||
return (static_cast<lit_charset_record_t *> (rec_p))->get_size ();
|
||||
}
|
||||
case LIT_MAGIC_STR:
|
||||
case LIT_MAGIC_STR_EX:
|
||||
{
|
||||
return lit_magic_record_t::size ();
|
||||
}
|
||||
@@ -454,7 +478,13 @@ template ecma_number_t rcs_record_iterator_t::read<ecma_number_t> ();
|
||||
template void rcs_record_iterator_t::write<uint16_t> (uint16_t);
|
||||
template uint16_t rcs_record_iterator_t::read<uint16_t> ();
|
||||
|
||||
template ecma_magic_string_id_t lit_magic_record_t::get_magic_str_id<ecma_magic_string_id_t>() const;
|
||||
template ecma_magic_string_ex_id_t lit_magic_record_t::get_magic_str_id<ecma_magic_string_ex_id_t>() const;
|
||||
template void lit_magic_record_t::set_magic_str_id<ecma_magic_string_id_t>(ecma_magic_string_id_t);
|
||||
template void lit_magic_record_t::set_magic_str_id<ecma_magic_string_ex_id_t>(ecma_magic_string_ex_id_t);
|
||||
|
||||
template lit_charset_record_t *rcs_recordset_t::alloc_record<lit_charset_record_t> (rcs_record_t::type_t type,
|
||||
size_t size);
|
||||
template lit_magic_record_t *rcs_recordset_t::alloc_record<lit_magic_record_t> (rcs_record_t::type_t type);
|
||||
template lit_number_record_t *rcs_recordset_t::alloc_record<lit_number_record_t> (rcs_record_t::type_t type);
|
||||
|
||||
|
||||
@@ -238,11 +238,12 @@ public:
|
||||
*
|
||||
* @return magic string id
|
||||
*/
|
||||
ecma_magic_string_id_t get_magic_str_id () const
|
||||
template <typename magic_string_id_t>
|
||||
magic_string_id_t get_magic_str_id () const
|
||||
{
|
||||
uint32_t id = get_field (magic_field_pos, magic_field_width);
|
||||
JERRY_ASSERT (id < ECMA_MAGIC_STRING__COUNT);
|
||||
return (ecma_magic_string_id_t) id;
|
||||
// JERRY_ASSERT (id < ECMA_MAGIC_STRING__COUNT);
|
||||
return (magic_string_id_t) id;
|
||||
} /* get_magic_str_id */
|
||||
|
||||
private:
|
||||
@@ -254,7 +255,8 @@ private:
|
||||
JERRY_ASSERT (size == get_size ());
|
||||
} /* set_size */
|
||||
|
||||
void set_magic_str_id (ecma_magic_string_id_t id)
|
||||
template <typename magic_string_id_t>
|
||||
void set_magic_str_id (magic_string_id_t id)
|
||||
{
|
||||
set_field (magic_field_pos, magic_field_width, id);
|
||||
} /* set_magic_str_id */
|
||||
@@ -294,7 +296,6 @@ private:
|
||||
static const size_t _size = RCS_DYN_STORAGE_LENGTH_UNIT;
|
||||
}; /* lit_magic_record_t */
|
||||
|
||||
|
||||
/**
|
||||
* Number record
|
||||
* Doesn't hold any characters, holds a number. Numbers from source code are represented as number literals.
|
||||
@@ -412,11 +413,13 @@ public:
|
||||
{
|
||||
LIT_STR = _first_type_id,
|
||||
LIT_MAGIC_STR,
|
||||
LIT_MAGIC_STR_EX,
|
||||
LIT_NUMBER
|
||||
};
|
||||
|
||||
lit_charset_record_t *create_charset_record (const ecma_char_t *, size_t);
|
||||
lit_magic_record_t *create_magic_record (ecma_magic_string_id_t);
|
||||
lit_magic_record_t *create_magic_record_ex (ecma_magic_string_ex_id_t);
|
||||
lit_number_record_t *create_number_record (ecma_number_t);
|
||||
|
||||
void dump ();
|
||||
@@ -429,6 +432,7 @@ private:
|
||||
|
||||
#define LIT_STR_T (lit_literal_storage_t::LIT_STR)
|
||||
#define LIT_MAGIC_STR_T (lit_literal_storage_t::LIT_MAGIC_STR)
|
||||
#define LIT_MAGIC_STR_EX_T (lit_literal_storage_t::LIT_MAGIC_STR_EX)
|
||||
#define LIT_NUMBER_T (lit_literal_storage_t::LIT_NUMBER)
|
||||
|
||||
#endif /* LIT_LITERAL_STORAGE_H */
|
||||
|
||||
@@ -72,6 +72,21 @@ lit_create_literal_from_charset (const ecma_char_t *str, /**< string to initiali
|
||||
}
|
||||
}
|
||||
|
||||
for (ecma_magic_string_ex_id_t msi = (ecma_magic_string_ex_id_t) 0;
|
||||
msi < ecma_get_magic_string_ex_count ();
|
||||
msi = (ecma_magic_string_ex_id_t) (msi + 1))
|
||||
{
|
||||
if (ecma_zt_string_length (ecma_get_magic_string_ex_zt (msi)) != len)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strncmp ((const char *) str, (const char *) ecma_get_magic_string_ex_zt (msi), len))
|
||||
{
|
||||
return lit_storage.create_magic_record_ex (msi);
|
||||
}
|
||||
}
|
||||
|
||||
return lit_storage.create_charset_record (str, len * sizeof (ecma_char_t));
|
||||
} /* lit_create_literal_from_charset */
|
||||
|
||||
@@ -104,8 +119,23 @@ lit_find_literal_by_charset (const ecma_char_t *str, /**< a string to search for
|
||||
}
|
||||
else if (type == LIT_MAGIC_STR_T)
|
||||
{
|
||||
ecma_magic_string_id_t magic_id = static_cast<lit_magic_record_t *>(lit)->get_magic_str_id ();
|
||||
const char *magic_str = (const char *)ecma_get_magic_string_zt (magic_id);
|
||||
ecma_magic_string_id_t magic_id = lit_magic_record_get_magic_str_id (lit);
|
||||
const char *magic_str = (const char *) ecma_get_magic_string_zt (magic_id);
|
||||
|
||||
if (strlen (magic_str) != len)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!strncmp (magic_str, (const char *) str, strlen (magic_str)))
|
||||
{
|
||||
return lit;
|
||||
}
|
||||
}
|
||||
else if (type == LIT_MAGIC_STR_EX_T)
|
||||
{
|
||||
ecma_magic_string_ex_id_t magic_id = lit_magic_record_ex_get_magic_str_id (lit);
|
||||
const char *magic_str = (const char *) ecma_get_magic_string_ex_zt (magic_id);
|
||||
|
||||
if (strlen (magic_str) != len)
|
||||
{
|
||||
@@ -218,7 +248,11 @@ lit_literal_equal_charset_rec (literal_t lit, /**< literal to com
|
||||
}
|
||||
case LIT_MAGIC_STR_T:
|
||||
{
|
||||
return record->equal_zt (ecma_get_magic_string_zt (static_cast<lit_magic_record_t *>(lit)->get_magic_str_id ()));
|
||||
return record->equal_zt (ecma_get_magic_string_zt (lit_magic_record_get_magic_str_id (lit)));
|
||||
}
|
||||
case LIT_MAGIC_STR_EX_T:
|
||||
{
|
||||
return record->equal_zt (ecma_get_magic_string_ex_zt (lit_magic_record_ex_get_magic_str_id (lit)));
|
||||
}
|
||||
case LIT_NUMBER_T:
|
||||
{
|
||||
@@ -254,10 +288,14 @@ lit_literal_equal_zt (literal_t lit, /**< literal to compare */
|
||||
}
|
||||
case LIT_MAGIC_STR_T:
|
||||
{
|
||||
ecma_magic_string_id_t magic_id = static_cast<lit_magic_record_t *>(lit)->get_magic_str_id ();
|
||||
|
||||
ecma_magic_string_id_t magic_id = lit_magic_record_get_magic_str_id (lit);
|
||||
return ecma_compare_zt_strings (str, ecma_get_magic_string_zt (magic_id));
|
||||
}
|
||||
case LIT_MAGIC_STR_EX_T:
|
||||
{
|
||||
ecma_magic_string_ex_id_t magic_id = lit_magic_record_ex_get_magic_str_id (lit);
|
||||
return ecma_compare_zt_strings (str, ecma_get_magic_string_ex_zt (magic_id));
|
||||
}
|
||||
case LIT_NUMBER_T:
|
||||
{
|
||||
ecma_char_t buff[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER];
|
||||
@@ -308,9 +346,11 @@ lit_literal_equal (literal_t lit1, /**< first literal */
|
||||
}
|
||||
case lit_literal_storage_t::LIT_MAGIC_STR:
|
||||
{
|
||||
ecma_magic_string_id_t magic_id = static_cast<lit_magic_record_t *>(lit2)->get_magic_str_id ();
|
||||
|
||||
return lit_literal_equal_zt (lit1, ecma_get_magic_string_zt (magic_id));
|
||||
return lit_literal_equal_zt (lit1, ecma_get_magic_string_zt (lit_magic_record_get_magic_str_id (lit2)));
|
||||
}
|
||||
case lit_literal_storage_t::LIT_MAGIC_STR_EX:
|
||||
{
|
||||
return lit_literal_equal_zt (lit1, ecma_get_magic_string_ex_zt (lit_magic_record_ex_get_magic_str_id (lit2)));
|
||||
}
|
||||
case lit_literal_storage_t::LIT_NUMBER:
|
||||
{
|
||||
@@ -335,7 +375,8 @@ lit_literal_equal_type_zt (literal_t lit, /**< literal to compare */
|
||||
const ecma_char_t *str) /**< zero-terminated string */
|
||||
{
|
||||
if (lit->get_type () != LIT_STR_T
|
||||
&& lit->get_type () != LIT_MAGIC_STR_T)
|
||||
&& lit->get_type () != LIT_MAGIC_STR_T
|
||||
&& lit->get_type () != LIT_MAGIC_STR_EX_T)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
@@ -414,7 +455,11 @@ lit_literal_to_charset (literal_t lit, /**< literal to be processed */
|
||||
}
|
||||
case LIT_MAGIC_STR_T:
|
||||
{
|
||||
return ecma_get_magic_string_zt (static_cast<lit_magic_record_t *> (lit)->get_magic_str_id ());
|
||||
return ecma_get_magic_string_zt (lit_magic_record_get_magic_str_id (lit));
|
||||
}
|
||||
case LIT_MAGIC_STR_EX_T:
|
||||
{
|
||||
return ecma_get_magic_string_ex_zt (lit_magic_record_ex_get_magic_str_id (lit));
|
||||
}
|
||||
case LIT_NUMBER_T:
|
||||
{
|
||||
@@ -488,9 +533,15 @@ lit_charset_literal_get_hash (literal_t lit) /**< literal */
|
||||
ecma_magic_string_id_t
|
||||
lit_magic_record_get_magic_str_id (literal_t lit) /**< literal */
|
||||
{
|
||||
return static_cast<lit_magic_record_t *> (lit)->get_magic_str_id ();
|
||||
return static_cast<lit_magic_record_t *> (lit)->get_magic_str_id<ecma_magic_string_id_t> ();
|
||||
} /* lit_magic_record_get_magic_str_id */
|
||||
|
||||
ecma_magic_string_ex_id_t
|
||||
lit_magic_record_ex_get_magic_str_id (literal_t lit) /**< literal */
|
||||
{
|
||||
return static_cast<lit_magic_record_t *> (lit)->get_magic_str_id<ecma_magic_string_ex_id_t> ();
|
||||
} /* lit_magic_record_ex_get_magic_str_id */
|
||||
|
||||
int32_t
|
||||
lit_charset_record_get_length (literal_t lit) /**< literal */
|
||||
{
|
||||
|
||||
@@ -51,5 +51,6 @@ ecma_number_t lit_charset_literal_get_number (literal_t);
|
||||
int32_t lit_charset_record_get_length (literal_t);
|
||||
|
||||
ecma_magic_string_id_t lit_magic_record_get_magic_str_id (literal_t);
|
||||
ecma_magic_string_ex_id_t lit_magic_record_ex_get_magic_str_id (literal_t);
|
||||
|
||||
#endif /* LIT_LITERAL_H */
|
||||
|
||||
Reference in New Issue
Block a user