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:
Andrey Shitov
2015-06-10 17:28:53 +03:00
parent 340a9ef002
commit 53801e3b41
36 changed files with 460 additions and 1097 deletions
@@ -63,12 +63,12 @@ opfunc_try_block (opcode_t opdata, /**< operation data */
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
JERRY_ASSERT (next_opcode.data.meta.type == OPCODE_META_TYPE_CATCH_EXCEPTION_IDENTIFIER);
const literal_index_t catch_exc_val_var_name_lit_idx = serializer_get_literal_id_by_uid (
next_opcode.data.meta.data_1,
int_data->pos);
lit_cpointer_t catch_exc_val_var_name_lit_cp = serializer_get_literal_cp_by_uid (
next_opcode.data.meta.data_1,
int_data->pos);
int_data->pos++;
ecma_string_t *catch_exc_var_name_str_p = ecma_new_ecma_string_from_lit_index (catch_exc_val_var_name_lit_idx);
ecma_string_t *catch_exc_var_name_str_p = ecma_new_ecma_string_from_lit_cp (catch_exc_val_var_name_lit_cp);
ecma_object_t *old_env_p = int_data->lex_env_p;
ecma_object_t *catch_env_p = ecma_create_decl_lex_env (old_env_p);
+6 -6
View File
@@ -91,9 +91,9 @@ get_variable_value (int_data_t *int_data, /**< interpreter context */
else
{
ecma_string_t var_name_string;
const literal_index_t lit_id = serializer_get_literal_id_by_uid (var_idx, int_data->pos);
JERRY_ASSERT (lit_id != INVALID_LITERAL);
ecma_new_ecma_string_on_stack_from_lit_index (&var_name_string, lit_id);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, int_data->pos);
JERRY_ASSERT (lit_cp.packed_value != MEM_CP_NULL);
ecma_new_ecma_string_on_stack_from_lit_cp (&var_name_string, lit_cp);
ecma_object_t *ref_base_lex_env_p = ecma_op_resolve_reference_base (int_data->lex_env_p,
&var_name_string);
@@ -158,9 +158,9 @@ set_variable_value (int_data_t *int_data, /**< interpreter context */
else
{
ecma_string_t var_name_string;
const literal_index_t lit_id = serializer_get_literal_id_by_uid (var_idx, lit_oc);
JERRY_ASSERT (lit_id != INVALID_LITERAL);
ecma_new_ecma_string_on_stack_from_lit_index (&var_name_string, lit_id);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, lit_oc);
JERRY_ASSERT (lit_cp.packed_value != MEM_CP_NULL);
ecma_new_ecma_string_on_stack_from_lit_cp (&var_name_string, lit_cp);
ecma_object_t *ref_base_lex_env_p = ecma_op_resolve_reference_base (int_data->lex_env_p,
&var_name_string);
+3 -3
View File
@@ -96,10 +96,10 @@ fill_params_list (int_data_t *int_data, /**< interpreter context */
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
JERRY_ASSERT (next_opcode.data.meta.type == OPCODE_META_TYPE_VARG);
const literal_index_t param_name_lit_idx = serializer_get_literal_id_by_uid (next_opcode.data.meta.data_1,
int_data->pos);
const lit_cpointer_t param_name_lit_idx = serializer_get_literal_cp_by_uid (next_opcode.data.meta.data_1,
int_data->pos);
params_names[param_index] = ecma_new_ecma_string_from_lit_index (param_name_lit_idx);
params_names[param_index] = ecma_new_ecma_string_from_lit_cp (param_name_lit_idx);
int_data->pos++;
}
+27 -33
View File
@@ -16,8 +16,6 @@
#include "jrt.h"
#include "opcodes.h"
#include "opcodes-ecma-support.h"
#include "serializer.h"
#include "vm.h"
/**
* Note:
@@ -98,8 +96,8 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
}
else if (type_value_right == OPCODE_ARG_TYPE_STRING)
{
const literal_index_t lit_id = serializer_get_literal_id_by_uid (src_val_descr, int_data->pos);
ecma_string_t *string_p = ecma_new_ecma_string_from_lit_index (lit_id);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->pos);
ecma_string_t *string_p = ecma_new_ecma_string_from_lit_cp (lit_cp);
ret_value = set_variable_value (int_data,
int_data->pos,
@@ -127,11 +125,11 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
{
ecma_number_t *num_p = int_data->tmp_num_p;
const literal_index_t lit_id = serializer_get_literal_id_by_uid (src_val_descr, int_data->pos);
const literal lit = serializer_get_literal_by_id (lit_id);
JERRY_ASSERT (lit.type == LIT_NUMBER);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->pos);
literal_t lit = lit_get_literal_by_cp (lit_cp);
JERRY_ASSERT (lit->get_type () == LIT_NUMBER_T);
*num_p = lit.data.num;
*num_p = lit_charset_literal_get_number (lit);
ret_value = set_variable_value (int_data,
int_data->pos,
@@ -142,11 +140,11 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
{
ecma_number_t *num_p = int_data->tmp_num_p;
const literal_index_t lit_id = serializer_get_literal_id_by_uid (src_val_descr, int_data->pos);
const literal lit = serializer_get_literal_by_id (lit_id);
JERRY_ASSERT (lit.type == LIT_NUMBER);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->pos);
literal_t lit = lit_get_literal_by_cp (lit_cp);
JERRY_ASSERT (lit->get_type () == LIT_NUMBER_T);
*num_p = ecma_number_negate (lit.data.num);
*num_p = lit_charset_literal_get_number (lit);
ret_value = set_variable_value (int_data,
int_data->pos,
@@ -397,11 +395,10 @@ ecma_completion_value_t
opfunc_var_decl (opcode_t opdata, /**< operation data */
int_data_t *int_data) /**< interpreter context */
{
const literal_index_t lit_id = serializer_get_literal_id_by_uid (opdata.data.var_decl.variable_name,
int_data->pos);
JERRY_ASSERT (lit_id != INVALID_LITERAL);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (opdata.data.var_decl.variable_name, int_data->pos);
JERRY_ASSERT (lit_cp.packed_value != MEM_CP_NULL);
ecma_string_t *var_name_string_p = ecma_new_ecma_string_from_lit_index (lit_id);
ecma_string_t *var_name_string_p = ecma_new_ecma_string_from_lit_cp (lit_cp);
if (!ecma_op_has_binding (int_data->lex_env_p, var_name_string_p))
{
@@ -437,8 +434,7 @@ opfunc_var_decl (opcode_t opdata, /**< operation data */
*/
static ecma_completion_value_t
function_declaration (int_data_t *int_data, /**< interpreter context */
literal_index_t function_name_lit_id, /**< index of literal
with function name */
lit_cpointer_t function_name_lit_cp, /**< compressed pointer to literal with function name */
ecma_string_t* args_names[], /**< names of arguments */
ecma_length_t args_number) /**< number of arguments */
{
@@ -465,7 +461,7 @@ function_declaration (int_data_t *int_data, /**< interpreter context */
do_instantiate_arguments_object = false;
}
ecma_string_t *function_name_string_p = ecma_new_ecma_string_from_lit_index (function_name_lit_id);
ecma_string_t *function_name_string_p = ecma_new_ecma_string_from_lit_cp (function_name_lit_cp);
ecma_completion_value_t ret_value = ecma_op_function_declaration (int_data->lex_env_p,
function_name_string_p,
@@ -495,8 +491,7 @@ opfunc_func_decl_n (opcode_t opdata, /**< operation data */
const idx_t function_name_idx = opdata.data.func_decl_n.name_lit_idx;
const ecma_length_t params_number = opdata.data.func_decl_n.arg_list;
literal_index_t function_name_lit_id = serializer_get_literal_id_by_uid (function_name_idx,
int_data->pos);
lit_cpointer_t function_name_lit_cp = serializer_get_literal_cp_by_uid (function_name_idx, int_data->pos);
int_data->pos++;
@@ -507,7 +502,7 @@ opfunc_func_decl_n (opcode_t opdata, /**< operation data */
fill_params_list (int_data, params_number, params_names);
ret_value = function_declaration (int_data,
function_name_lit_id,
function_name_lit_cp,
params_names,
params_number);
@@ -578,12 +573,11 @@ opfunc_func_expr_n (opcode_t opdata, /**< operation data */
{
scope_p = ecma_create_decl_lex_env (int_data->lex_env_p);
const literal_index_t lit_id = serializer_get_literal_id_by_uid (function_name_lit_idx, lit_oc);
JERRY_ASSERT (lit_id != INVALID_LITERAL);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (function_name_lit_idx, lit_oc);
JERRY_ASSERT (lit_cp.packed_value != MEM_CP_NULL);
function_name_string_p = ecma_new_ecma_string_from_lit_index (lit_id);
ecma_op_create_immutable_binding (scope_p,
function_name_string_p);
function_name_string_p = ecma_new_ecma_string_from_lit_cp (lit_cp);
ecma_op_create_immutable_binding (scope_p, function_name_string_p);
}
else
{
@@ -1413,10 +1407,10 @@ evaluate_arg_for_typeof (int_data_t *int_data, /**< interpreter context */
}
else
{
const literal_index_t lit_id = serializer_get_literal_id_by_uid (var_idx, int_data->pos);
JERRY_ASSERT (lit_id != INVALID_LITERAL);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, int_data->pos);
JERRY_ASSERT (lit_cp.packed_value != MEM_CP_NULL);
ecma_string_t *var_name_string_p = ecma_new_ecma_string_from_lit_index (lit_id);
ecma_string_t *var_name_string_p = ecma_new_ecma_string_from_lit_cp (lit_cp);
ecma_object_t *ref_base_lex_env_p = ecma_op_resolve_reference_base (int_data->lex_env_p,
var_name_string_p);
@@ -1529,10 +1523,10 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
const literal_index_t lit_id = serializer_get_literal_id_by_uid (name_lit_idx, lit_oc);
JERRY_ASSERT (lit_id != INVALID_LITERAL);
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (name_lit_idx, lit_oc);
JERRY_ASSERT (lit_cp.packed_value != MEM_CP_NULL);
ecma_string_t *name_string_p = ecma_new_ecma_string_from_lit_index (lit_id);
ecma_string_t *name_string_p = ecma_new_ecma_string_from_lit_cp (lit_cp);
ecma_reference_t ref = ecma_op_get_identifier_reference (int_data->lex_env_p,
name_string_p,
+30 -94
View File
@@ -23,6 +23,7 @@
#include "ecma-helpers.h"
#include "ecma-globals.h"
#include "serializer.h"
#include "lit-literal.h"
#define NAME_TO_ID(op) (__op__idx_##op)
@@ -44,57 +45,6 @@ static uint8_t opcode_sizes[] =
0
};
static void
dump_literal (literal lit)
{
switch (lit.type)
{
case LIT_NUMBER:
{
if (ecma_number_is_nan (lit.data.num))
{
printf ("%s : NUMBER", "NaN");
}
else
{
printf ("%d : Truncated NUMBER", (int) lit.data.num);
}
break;
}
case LIT_MAGIC_STR:
{
printf ("%s : MAGIC STRING", (const char *) ecma_get_magic_string_zt (lit.data.magic_str_id));
break;
}
case LIT_MAGIC_STR_EX:
{
printf ("%s : EXT MAGIC STRING", (const char *) ecma_get_magic_string_ex_zt (lit.data.magic_str_ex_id));
break;
}
case LIT_STR:
{
printf ("%s : STRING", (const char *) (lit.data.lp.str));
break;
}
default:
{
JERRY_UNREACHABLE ();
}
}
}
void
pp_literals (const literal *lits, literal_index_t size)
{
printf ("LITERALS %lu:\n", (unsigned long) size);
for (literal_index_t i = 0; i < size; i++)
{
printf ("%3lu ", (unsigned long) i);
dump_literal (lits[i]);
putchar ('\n');
}
}
static char buff[ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER];
static void
@@ -104,20 +54,10 @@ clear_temp_buffer (void)
}
static const char *
lit_id_to_str (literal_index_t id)
lit_cp_to_str (lit_cpointer_t cp)
{
literal lit = lexer_get_literal_by_id (id);
if (lit.type == LIT_STR || lit.type == LIT_MAGIC_STR || lit.type == LIT_MAGIC_STR_EX)
{
return (char *) literal_to_zt (lit);
}
else
{
JERRY_ASSERT (lit.type == LIT_NUMBER);
clear_temp_buffer ();
ecma_number_to_zt_string (lit.data.num, (ecma_char_t *) buff, ECMA_MAX_CHARS_IN_STRINGIFIED_NUMBER);
return buff;
}
literal_t lit = lit_get_literal_by_cp (cp);
return lit_literal_to_str_internal_buf (lit);
}
static const char *
@@ -146,7 +86,7 @@ tmp_id_to_str (idx_t id)
}
static const char *
var_to_str (opcode_t opcode, literal_index_t lit_ids[], opcode_counter_t oc, uint8_t current_arg)
var_to_str (opcode_t opcode, lit_cpointer_t lit_ids[], opcode_counter_t oc, uint8_t current_arg)
{
raw_opcode raw = *(raw_opcode*) &opcode;
if (raw.uids[current_arg] == LITERAL_TO_REWRITE)
@@ -155,9 +95,8 @@ var_to_str (opcode_t opcode, literal_index_t lit_ids[], opcode_counter_t oc, uin
{
return "hz";
}
JERRY_ASSERT (lit_ids[current_arg - 1] != NOT_A_LITERAL
&& lit_ids[current_arg - 1] != INVALID_LITERAL);
return lit_id_to_str (lit_ids[current_arg - 1]);
JERRY_ASSERT (lit_ids[current_arg - 1].packed_value != MEM_CP_NULL);
return lit_cp_to_str (lit_ids[current_arg - 1]);
}
else if (raw.uids[current_arg] >= 128)
{
@@ -165,14 +104,15 @@ var_to_str (opcode_t opcode, literal_index_t lit_ids[], opcode_counter_t oc, uin
}
else
{
return lit_id_to_str (serializer_get_literal_id_by_uid (raw.uids[current_arg], oc));
return lit_cp_to_str (serializer_get_literal_cp_by_uid (raw.uids[current_arg], oc));
}
}
static void
pp_printf (const char *format, opcode_t opcode, literal_index_t lit_ids[], opcode_counter_t oc)
pp_printf (const char *format, opcode_t opcode, lit_cpointer_t lit_ids[], opcode_counter_t oc, uint8_t start_arg)
{
uint8_t current_arg = 1;
uint8_t current_arg = start_arg;
JERRY_ASSERT (current_arg <= 3);
while (*format)
{
if (*format != '%')
@@ -187,12 +127,14 @@ pp_printf (const char *format, opcode_t opcode, literal_index_t lit_ids[], opcod
{
case 'd':
{
JERRY_ASSERT (current_arg <= 3);
raw_opcode raw = *(raw_opcode*) &opcode;
printf ("%d", raw.uids[current_arg]);
break;
}
case 's':
{
JERRY_ASSERT (current_arg <= 3);
printf ("%s", var_to_str (opcode, lit_ids, oc, current_arg));
break;
}
@@ -208,7 +150,7 @@ pp_printf (const char *format, opcode_t opcode, literal_index_t lit_ids[], opcod
}
#define PP_OP(op_name, format) \
case NAME_TO_ID (op_name): pp_printf (format, opm.op, opm.lit_id, oc); break;
case NAME_TO_ID (op_name): pp_printf (format, opm.op, opm.lit_id, oc, 1); break;
#define VAR(i) var_to_str (opm.op, opm.lit_id, oc, i)
#define OC(i, j) __extension__({ raw_opcode* raw = (raw_opcode *) &opm.op; \
calc_opcode_counter_from_idx_idx (raw->uids[i], raw->uids[j]); })
@@ -326,7 +268,7 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite)
{
if (opm.op.data.call_n.arg_list == 0)
{
printf ("%s = %s ();", VAR (1), VAR (2));
pp_printf ("%s = %s ();", opm.op, opm.lit_id, oc, 1);
}
else
{
@@ -362,7 +304,7 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite)
{
if (opm.op.data.construct_n.arg_list == 0)
{
printf ("%s = new %s;", VAR (1), VAR (2));
pp_printf ("%s = new %s;", opm.op, opm.lit_id, oc, 1);
}
else
{
@@ -394,7 +336,7 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite)
}
else
{
printf ("%s = function %s ();", VAR (1), VAR (2));
pp_printf ("%s = function %s ();", opm.op, opm.lit_id, oc, 1);
}
}
else
@@ -473,13 +415,12 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite)
{
case NAME_TO_ID (call_n):
{
printf ("%s = %s (", var_to_str (start_op, NULL, start, 1),
var_to_str (start_op, NULL, start, 2));
pp_printf ("%s = %s (", start_op, NULL, start, 1);
break;
}
case NAME_TO_ID (native_call):
{
printf ("%s = ", var_to_str (start_op, NULL, start, 1));
pp_printf ("%s = ", start_op, NULL, start, 1);
switch (start_op.data.native_call.name)
{
case OPCODE_NATIVE_CALL_LED_TOGGLE: printf ("LEDToggle ("); break;
@@ -494,36 +435,34 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite)
}
case NAME_TO_ID (construct_n):
{
printf ("%s = new %s (", var_to_str (start_op, NULL, start, 1),
var_to_str (start_op, NULL, start, 2));
pp_printf ("%s = new %s (", start_op, NULL, start, 1);
break;
}
case NAME_TO_ID (func_decl_n):
{
printf ("function %s (", var_to_str (start_op, NULL, start, 1));
pp_printf ("function %s (", start_op, NULL, start, 1);
break;
}
case NAME_TO_ID (func_expr_n):
{
if (start_op.data.func_expr_n.name_lit_idx == INVALID_VALUE)
{
printf ("%s = function (", var_to_str (start_op, NULL, start, 1));
pp_printf ("%s = function (", start_op, NULL, start, 1);
}
else
{
printf ("%s = function %s (", var_to_str (start_op, NULL, start, 1),
var_to_str (start_op, NULL, start, 2));
pp_printf ("%s = function %s (", start_op, NULL, start, 1);
}
break;
}
case NAME_TO_ID (array_decl):
{
printf ("%s = [", var_to_str (start_op, NULL, start, 1));
pp_printf ("%s = [", start_op, NULL, start, 1);
break;
}
case NAME_TO_ID (obj_decl):
{
printf ("%s = {", var_to_str (start_op, NULL, start, 1));
pp_printf ("%s = {", start_op, NULL, start, 1);
break;
}
default:
@@ -542,30 +481,27 @@ pp_op_meta (opcode_counter_t oc, op_meta opm, bool rewrite)
{
case OPCODE_META_TYPE_THIS_ARG:
{
printf ("this_arg = %s", var_to_str (meta_op, NULL, counter, 2));
pp_printf ("this_arg = %s", meta_op, NULL, counter, 2);
break;
}
case OPCODE_META_TYPE_VARG:
{
printf ("%s", var_to_str (meta_op, NULL, counter, 2));
pp_printf ("%s", meta_op, NULL, counter, 2);
break;
}
case OPCODE_META_TYPE_VARG_PROP_DATA:
{
printf ("%s:%s", var_to_str (meta_op, NULL, counter, 2),
var_to_str (meta_op, NULL, counter, 3));
pp_printf ("%s:%s", meta_op, NULL, counter, 2);
break;
}
case OPCODE_META_TYPE_VARG_PROP_GETTER:
{
printf ("%s = get %s ();", var_to_str (meta_op, NULL, counter, 2),
var_to_str (meta_op, NULL, counter, 3));
pp_printf ("%s = get %s ();", meta_op, NULL, counter, 2);
break;
}
case OPCODE_META_TYPE_VARG_PROP_SETTER:
{
printf ("%s = set (%s);", var_to_str (meta_op, NULL, counter, 2),
var_to_str (meta_op, NULL, counter, 3));
pp_printf ("%s = set (%s);", meta_op, NULL, counter, 2);
break;
}
default:
-2
View File
@@ -19,12 +19,10 @@
#include "jrt.h"
#ifdef JERRY_ENABLE_PRETTY_PRINTER
#include "vm.h"
#include "literal.h"
#include "scopes-tree.h"
void pp_opcode (opcode_counter_t, opcode_t, bool);
void pp_op_meta (opcode_counter_t, op_meta, bool);
void pp_literals (const literal *, literal_index_t);
#endif // JERRY_ENABLE_PRETTY_PRINTER
#endif // PRETTY_PRINTER