Support of multiple bytecode arrays in interpreter and ecma-runtime.

JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
This commit is contained in:
Ruben Ayrapetyan
2015-06-09 21:14:08 +03:00
parent 3577261261
commit 8ea0e23ea3
10 changed files with 65 additions and 38 deletions
@@ -43,7 +43,7 @@ opfunc_try_block (opcode_t opdata, /**< operation data */
|| (ecma_is_completion_value_empty (try_completion) && int_data->pos == try_end_oc));
int_data->pos = try_end_oc;
opcode_t next_opcode = vm_get_opcode (int_data->pos);
opcode_t next_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos);
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
if (ecma_is_completion_value_exit (try_completion))
@@ -59,7 +59,7 @@ opfunc_try_block (opcode_t opdata, /**< operation data */
if (ecma_is_completion_value_throw (try_completion))
{
next_opcode = vm_get_opcode (int_data->pos);
next_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos);
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
JERRY_ASSERT (next_opcode.data.meta.type == OPCODE_META_TYPE_CATCH_EXCEPTION_IDENTIFIER);
@@ -103,7 +103,7 @@ opfunc_try_block (opcode_t opdata, /**< operation data */
int_data->pos = catch_end_oc;
}
next_opcode = vm_get_opcode (int_data->pos);
next_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos);
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
if (ecma_is_completion_value_exit (try_completion))
@@ -131,7 +131,7 @@ opfunc_try_block (opcode_t opdata, /**< operation data */
}
}
next_opcode = vm_get_opcode (int_data->pos++);
next_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos++);
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
JERRY_ASSERT (next_opcode.data.meta.type == OPCODE_META_TYPE_END_TRY_CATCH_FINALLY);
+2 -2
View File
@@ -44,7 +44,7 @@ fill_varg_list (int_data_t *int_data, /**< interpreter context */
if (ecma_is_completion_value_normal (evaluate_arg_completion))
{
opcode_t next_opcode = vm_get_opcode (int_data->pos);
opcode_t next_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos);
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
JERRY_ASSERT (next_opcode.data.meta.type == OPCODE_META_TYPE_VARG);
@@ -92,7 +92,7 @@ fill_params_list (int_data_t *int_data, /**< interpreter context */
param_index < params_number;
param_index++)
{
opcode_t next_opcode = vm_get_opcode (int_data->pos);
opcode_t next_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos);
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
JERRY_ASSERT (next_opcode.data.meta.type == OPCODE_META_TYPE_VARG);
+9 -6
View File
@@ -448,7 +448,7 @@ function_declaration (int_data_t *int_data, /**< interpreter context */
read_meta_opcode_counter (OPCODE_META_TYPE_FUNCTION_END, int_data) + int_data->pos);
int_data->pos++;
opcode_scope_code_flags_t scope_flags = vm_get_scope_flags (int_data->pos++);
opcode_scope_code_flags_t scope_flags = vm_get_scope_flags (int_data->opcodes_p, int_data->pos++);
if (scope_flags & OPCODE_SCOPE_CODE_FLAGS_STRICT)
{
@@ -467,6 +467,7 @@ function_declaration (int_data_t *int_data, /**< interpreter context */
ecma_completion_value_t ret_value = ecma_op_function_declaration (int_data->lex_env_p,
function_name_string_p,
int_data->opcodes_p,
int_data->pos,
args_names,
args_number,
@@ -556,7 +557,8 @@ opfunc_func_expr_n (opcode_t opdata, /**< operation data */
int_data) + int_data->pos);
int_data->pos++;
opcode_scope_code_flags_t scope_flags = vm_get_scope_flags (int_data->pos++);
opcode_scope_code_flags_t scope_flags = vm_get_scope_flags (int_data->opcodes_p,
int_data->pos++);
if (scope_flags & OPCODE_SCOPE_CODE_FLAGS_STRICT)
{
@@ -596,6 +598,7 @@ opfunc_func_expr_n (opcode_t opdata, /**< operation data */
scope_p,
is_strict,
do_instantiate_arguments_object,
int_data->opcodes_p,
int_data->pos);
ret_value = set_variable_value (int_data, lit_oc,
@@ -654,7 +657,7 @@ opfunc_call_n (opcode_t opdata, /**< operation data */
idx_t this_arg_var_idx = INVALID_VALUE;
idx_t args_number;
opcode_t next_opcode = vm_get_opcode (int_data->pos);
opcode_t next_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos);
if (next_opcode.op_idx == __op__idx_meta
&& next_opcode.data.meta.type == OPCODE_META_TYPE_THIS_ARG)
{
@@ -918,7 +921,7 @@ opfunc_obj_decl (opcode_t opdata, /**< operation data */
{
JERRY_ASSERT (ecma_is_completion_value_empty (evaluate_prop_completion));
opcode_t next_opcode = vm_get_opcode (int_data->pos);
opcode_t next_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos);
JERRY_ASSERT (next_opcode.op_idx == __op__idx_meta);
const opcode_meta_type type = (opcode_meta_type) next_opcode.data.meta.type;
@@ -1326,7 +1329,7 @@ opfunc_with (opcode_t opdata, /**< operation data */
int_data->lex_env_p = new_env_p;
#ifndef JERRY_NDEBUG
opcode_t meta_opcode = vm_get_opcode (with_end_oc);
opcode_t meta_opcode = vm_get_opcode (int_data->opcodes_p, with_end_oc);
JERRY_ASSERT (meta_opcode.op_idx == __op__idx_meta);
JERRY_ASSERT (meta_opcode.data.meta.type == OPCODE_META_TYPE_END_WITH);
#endif /* !JERRY_NDEBUG */
@@ -1714,7 +1717,7 @@ opcode_counter_t
read_meta_opcode_counter (opcode_meta_type expected_type, /**< expected type of meta opcode */
int_data_t *int_data) /**< interpreter context */
{
opcode_t meta_opcode = vm_get_opcode (int_data->pos);
opcode_t meta_opcode = vm_get_opcode (int_data->opcodes_p, int_data->pos);
JERRY_ASSERT (meta_opcode.data.meta.type == expected_type);
const idx_t data_1 = meta_opcode.data.meta.data_1;
+21 -14
View File
@@ -214,7 +214,8 @@ interp_mem_stats_context_exit (int_data_t *int_data_p,
}
static void
interp_mem_stats_opcode_enter (opcode_counter_t opcode_position,
interp_mem_stats_opcode_enter (const opcode_t *opcodes_p,
opcode_counter_t opcode_position,
mem_heap_stats_t *out_heap_stats_p,
mem_pools_stats_t *out_pools_stats_p)
{
@@ -235,7 +236,7 @@ interp_mem_stats_opcode_enter (opcode_counter_t opcode_position,
out_pools_stats_p,
true, false);
opcode_t opcode = vm_get_opcode (opcode_position);
opcode_t opcode = vm_get_opcode (opcodes_p, opcode_position);
printf ("%s-- Opcode: %s (position %u) --\n",
indent_prefix, __op_names[opcode.op_idx], (uint32_t) opcode_position);
@@ -280,7 +281,7 @@ interp_mem_stats_opcode_exit (int_data_t *int_data_p,
int_data_p->context_peak_allocated_pool_chunks = JERRY_MAX (int_data_p->context_peak_allocated_pool_chunks,
pools_stats_after.allocated_chunks);
opcode_t opcode = vm_get_opcode (opcode_position);
opcode_t opcode = vm_get_opcode (int_data_p->opcodes_p, opcode_position);
printf ("%s Allocated heap bytes: %5u -> %5u (%+5d, local %5u, peak %5u)\n",
indent_prefix,
@@ -375,7 +376,8 @@ vm_run_global (void)
bool is_strict = false;
opcode_counter_t start_pos = 0;
opcode_scope_code_flags_t scope_flags = vm_get_scope_flags (start_pos++);
opcode_scope_code_flags_t scope_flags = vm_get_scope_flags (__program,
start_pos++);
if (scope_flags & OPCODE_SCOPE_CODE_FLAGS_STRICT)
{
@@ -385,7 +387,8 @@ vm_run_global (void)
ecma_object_t *glob_obj_p = ecma_builtin_get (ECMA_BUILTIN_ID_GLOBAL);
ecma_object_t *lex_env_p = ecma_get_global_environment ();
ecma_completion_value_t completion = vm_run_from_pos (start_pos,
ecma_completion_value_t completion = vm_run_from_pos (__program,
start_pos,
ecma_make_object_value (glob_obj_p),
lex_env_p,
is_strict,
@@ -454,12 +457,13 @@ vm_loop (int_data_t *int_data_p, /**< interpreter context */
|| (run_scope_p->start_oc <= int_data_p->pos
&& int_data_p->pos <= run_scope_p->end_oc));
const opcode_t *curr = &__program[int_data_p->pos];
const opcode_t *curr = &int_data_p->opcodes_p[int_data_p->pos];
#ifdef MEM_STATS
const opcode_counter_t opcode_pos = int_data_p->pos;
interp_mem_stats_opcode_enter (opcode_pos,
interp_mem_stats_opcode_enter (int_data_p->opcodes_p,
opcode_pos,
&heap_stats_before,
&pools_stats_before);
#endif /* MEM_STATS */
@@ -514,7 +518,8 @@ vm_loop (int_data_t *int_data_p, /**< interpreter context */
* Run the code, starting from specified opcode
*/
ecma_completion_value_t
vm_run_from_pos (opcode_counter_t start_pos, /**< identifier of starting opcode */
vm_run_from_pos (const opcode_t *opcodes_p, /**< byte-code array */
opcode_counter_t start_pos, /**< identifier of starting opcode */
ecma_value_t this_binding_value, /**< value of 'ThisBinding' */
ecma_object_t *lex_env_p, /**< lexical environment to use */
bool is_strict, /**< is the code is strict mode code (ECMA-262 v5, 10.1.1) */
@@ -522,7 +527,7 @@ vm_run_from_pos (opcode_counter_t start_pos, /**< identifier of starting opcode
{
ecma_completion_value_t completion;
const opcode_t *curr = &__program[start_pos];
const opcode_t *curr = &opcodes_p[start_pos];
JERRY_ASSERT (curr->op_idx == __op__idx_reg_var_decl);
const idx_t min_reg_num = curr->data.reg_var_decl.min;
@@ -534,7 +539,7 @@ vm_run_from_pos (opcode_counter_t start_pos, /**< identifier of starting opcode
MEM_DEFINE_LOCAL_ARRAY (regs, regs_num, ecma_value_t);
int_data_t int_data;
int_data.opcodes_p = __program;
int_data.opcodes_p = opcodes_p;
int_data.pos = (opcode_counter_t) (start_pos + 1);
int_data.this_binding = this_binding_value;
int_data.lex_env_p = lex_env_p;
@@ -578,9 +583,10 @@ vm_run_from_pos (opcode_counter_t start_pos, /**< identifier of starting opcode
* Get specified opcode from the program.
*/
opcode_t
vm_get_opcode (opcode_counter_t counter) /**< opcode counter */
vm_get_opcode (const opcode_t *opcodes_p, /**< byte-code array */
opcode_counter_t counter) /**< opcode counter */
{
return __program[ counter ];
return opcodes_p[ counter ];
} /* vm_get_opcode */
/**
@@ -589,9 +595,10 @@ vm_get_opcode (opcode_counter_t counter) /**< opcode counter */
* @return mask of scope code flags
*/
opcode_scope_code_flags_t
vm_get_scope_flags (opcode_counter_t counter) /**< opcode counter */
vm_get_scope_flags (const opcode_t *opcodes_p, /**< byte-code array */
opcode_counter_t counter) /**< opcode counter */
{
opcode_t flags_opcode = vm_get_opcode (counter);
opcode_t flags_opcode = vm_get_opcode (opcodes_p, counter);
JERRY_ASSERT (flags_opcode.op_idx == __op__idx_meta
&& flags_opcode.data.meta.type == OPCODE_META_TYPE_SCOPE_CODE_FLAGS);
return (opcode_scope_code_flags_t) flags_opcode.data.meta.data_1;
+4 -3
View File
@@ -24,14 +24,15 @@ extern void vm_init (const opcode_t* program_p, bool dump_mem_stats);
extern void vm_finalize (void);
extern jerry_completion_code_t vm_run_global (void);
extern ecma_completion_value_t vm_loop (int_data_t *int_data, vm_run_scope_t *run_scope_p);
extern ecma_completion_value_t vm_run_from_pos (opcode_counter_t start_pos,
extern ecma_completion_value_t vm_run_from_pos (const opcode_t *opcodes_p,
opcode_counter_t start_pos,
ecma_value_t this_binding_value,
ecma_object_t *lex_env_p,
bool is_strict,
bool is_eval_code);
extern opcode_t vm_get_opcode (opcode_counter_t counter);
extern opcode_scope_code_flags_t vm_get_scope_flags (opcode_counter_t counter);
extern opcode_t vm_get_opcode (const opcode_t*, opcode_counter_t counter);
extern opcode_scope_code_flags_t vm_get_scope_flags (const opcode_t*, opcode_counter_t counter);
extern ecma_value_t vm_get_this_binding (void);
extern ecma_object_t* vm_get_lex_env (void);