Add support for eval in parser.
JerryScript-DCO-1.0-Signed-off-by: Andrey Shitov a.shitov@samsung.com
This commit is contained in:
committed by
Ruben Ayrapetyan
parent
57c6c377af
commit
3577261261
@@ -63,9 +63,9 @@ 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);
|
||||
|
||||
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);
|
||||
lit_cpointer_t catch_exc_val_var_name_lit_cp = serializer_get_literal_cp_by_uid (next_opcode.data.meta.data_1,
|
||||
int_data->opcodes_p,
|
||||
int_data->pos);
|
||||
int_data->pos++;
|
||||
|
||||
ecma_string_t *catch_exc_var_name_str_p = ecma_new_ecma_string_from_lit_cp (catch_exc_val_var_name_lit_cp);
|
||||
|
||||
@@ -91,7 +91,7 @@ get_variable_value (int_data_t *int_data, /**< interpreter context */
|
||||
else
|
||||
{
|
||||
ecma_string_t var_name_string;
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, int_data->pos);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, int_data->opcodes_p, 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);
|
||||
|
||||
@@ -158,7 +158,7 @@ set_variable_value (int_data_t *int_data, /**< interpreter context */
|
||||
else
|
||||
{
|
||||
ecma_string_t var_name_string;
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, lit_oc);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, int_data->opcodes_p, 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);
|
||||
|
||||
|
||||
@@ -97,6 +97,7 @@ fill_params_list (int_data_t *int_data, /**< interpreter context */
|
||||
JERRY_ASSERT (next_opcode.data.meta.type == OPCODE_META_TYPE_VARG);
|
||||
|
||||
const lit_cpointer_t param_name_lit_idx = serializer_get_literal_cp_by_uid (next_opcode.data.meta.data_1,
|
||||
int_data->opcodes_p,
|
||||
int_data->pos);
|
||||
|
||||
params_names[param_index] = ecma_new_ecma_string_from_lit_cp (param_name_lit_idx);
|
||||
|
||||
@@ -96,7 +96,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
|
||||
}
|
||||
else if (type_value_right == OPCODE_ARG_TYPE_STRING)
|
||||
{
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->pos);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->opcodes_p, int_data->pos);
|
||||
ecma_string_t *string_p = ecma_new_ecma_string_from_lit_cp (lit_cp);
|
||||
|
||||
ret_value = set_variable_value (int_data,
|
||||
@@ -125,7 +125,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
|
||||
{
|
||||
ecma_number_t *num_p = int_data->tmp_num_p;
|
||||
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->pos);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->opcodes_p, int_data->pos);
|
||||
literal_t lit = lit_get_literal_by_cp (lit_cp);
|
||||
JERRY_ASSERT (lit->get_type () == LIT_NUMBER_T);
|
||||
|
||||
@@ -140,7 +140,7 @@ opfunc_assignment (opcode_t opdata, /**< operation data */
|
||||
{
|
||||
ecma_number_t *num_p = int_data->tmp_num_p;
|
||||
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->pos);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (src_val_descr, int_data->opcodes_p, int_data->pos);
|
||||
literal_t lit = lit_get_literal_by_cp (lit_cp);
|
||||
JERRY_ASSERT (lit->get_type () == LIT_NUMBER_T);
|
||||
|
||||
@@ -395,7 +395,9 @@ ecma_completion_value_t
|
||||
opfunc_var_decl (opcode_t opdata, /**< operation data */
|
||||
int_data_t *int_data) /**< interpreter context */
|
||||
{
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (opdata.data.var_decl.variable_name, int_data->pos);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (opdata.data.var_decl.variable_name,
|
||||
int_data->opcodes_p,
|
||||
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_cp (lit_cp);
|
||||
@@ -491,7 +493,9 @@ 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;
|
||||
|
||||
lit_cpointer_t function_name_lit_cp = serializer_get_literal_cp_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->opcodes_p,
|
||||
int_data->pos);
|
||||
|
||||
int_data->pos++;
|
||||
|
||||
@@ -573,7 +577,9 @@ opfunc_func_expr_n (opcode_t opdata, /**< operation data */
|
||||
{
|
||||
scope_p = ecma_create_decl_lex_env (int_data->lex_env_p);
|
||||
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (function_name_lit_idx, lit_oc);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (function_name_lit_idx,
|
||||
int_data->opcodes_p,
|
||||
lit_oc);
|
||||
JERRY_ASSERT (lit_cp.packed_value != MEM_CP_NULL);
|
||||
|
||||
function_name_string_p = ecma_new_ecma_string_from_lit_cp (lit_cp);
|
||||
@@ -1407,7 +1413,7 @@ evaluate_arg_for_typeof (int_data_t *int_data, /**< interpreter context */
|
||||
}
|
||||
else
|
||||
{
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, int_data->pos);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (var_idx, int_data->opcodes_p, 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_cp (lit_cp);
|
||||
@@ -1523,7 +1529,7 @@ opfunc_delete_var (opcode_t opdata, /**< operation data */
|
||||
|
||||
ecma_completion_value_t ret_value = ecma_make_empty_completion_value ();
|
||||
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (name_lit_idx, lit_oc);
|
||||
lit_cpointer_t lit_cp = serializer_get_literal_cp_by_uid (name_lit_idx, int_data->opcodes_p, lit_oc);
|
||||
JERRY_ASSERT (lit_cp.packed_value != MEM_CP_NULL);
|
||||
|
||||
ecma_string_t *name_string_p = ecma_new_ecma_string_from_lit_cp (lit_cp);
|
||||
|
||||
@@ -87,11 +87,17 @@ typedef enum : idx_t
|
||||
* 'eval' identifier */
|
||||
} opcode_scope_code_flags_t;
|
||||
|
||||
/**
|
||||
* Forward declaration of opcode structure
|
||||
*/
|
||||
struct opcode_t;
|
||||
|
||||
/**
|
||||
* Interpreter context
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
const opcode_t *opcodes_p; /**< pointer to array containing currently executed bytecode */
|
||||
opcode_counter_t pos; /**< current opcode to execute */
|
||||
ecma_value_t this_binding; /**< this binding for current context */
|
||||
ecma_object_t *lex_env_p; /**< current lexical environment */
|
||||
@@ -257,7 +263,7 @@ opcode_counter_t read_meta_opcode_counter (opcode_meta_type expected_type, int_d
|
||||
OP_ARGS_LIST (OP_DATA)
|
||||
|
||||
#define __OP_STRUCT_FIELD(name, arg1, arg2, arg3) __op_##name name;
|
||||
typedef struct
|
||||
typedef struct opcode_t
|
||||
{
|
||||
idx_t op_idx;
|
||||
union
|
||||
|
||||
@@ -104,7 +104,7 @@ var_to_str (opcode_t opcode, lit_cpointer_t lit_ids[], opcode_counter_t oc, uint
|
||||
}
|
||||
else
|
||||
{
|
||||
return lit_cp_to_str (serializer_get_literal_cp_by_uid (raw.uids[current_arg], oc));
|
||||
return lit_cp_to_str (serializer_get_literal_cp_by_uid (raw.uids[current_arg], NULL, oc));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -534,6 +534,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.pos = (opcode_counter_t) (start_pos + 1);
|
||||
int_data.this_binding = this_binding_value;
|
||||
int_data.lex_env_p = lex_env_p;
|
||||
|
||||
Reference in New Issue
Block a user