parrotcode: Parrot Interpreter | |
Contents | C |
src/interpreter.c - Parrot Interpreter
The interpreter API handles running the operations.
The predereferenced code chunk is pre-initialized with the opcode function pointers,
addresses,
or opnumbers of the prederef__
opcode.
This opcode then calls the do_prederef()
function,
which then fills in the real function,
address or op number.
Because the prederef__
opcode returns the same pc_prederef
it was passed,
the runops loop will re-execute the same location,
which will then have the pointer to the real prederef
opfunc and prederef
args.
Pointer arithmetic is used to determine the index into the bytecode corresponding to the currect opcode. The bytecode and prederef arrays have the same number of elements because there is a one-to-one mapping.
static void prederef_args(NOTNULL(void **pc_prederef), PARROT_INTERP, NOTNULL(opcode_t *pc), ARGIN(const op_info_t *opinfo))
do_prederef()
to deal with any arguments.pc_prederef
is the current opcode.void do_prederef(void **pc_prederef, PARROT_INTERP, int type)
pc_prederef
is the current opcode,
and type
is the run core type.static void turn_ev_check(PARROT_INTERP, int on)
event_checker
opcode,
or restores original ops in all branch locations of the opcode stream.on
is true,
this is being called from the event handler thread.PARROT_WARN_UNUSED_RESULT PARROT_CANNOT_RETURN_NULL static oplib_init_f get_core_op_lib_init(PARROT_INTERP, int which)
op_lib
init function.which
is the run core type.PARROT_WARN_UNUSED_RESULT PARROT_CANNOT_RETURN_NULL static oplib_init_f get_dynamic_op_lib_init(PARROT_INTERP, ARGIN(const PMC *lib))
op_lib
init function.lib
will be a ParrotLibrary
PMC.static void load_prederef(PARROT_INTERP, int which)
interp->op_lib
= prederefed oplib.static void init_prederef(PARROT_INTERP, int which)
func_table
,
file prederef.code.static void stop_prederef(PARROT_INTERP)
void exec_init_prederef(PARROT_INTERP, void *prederef_arena)
interp->op_lib
= prederefed oplibop_lib
has a copy in the interpreter structure - but get the op_code
lookup function from standard core prederef has no op_info_table
PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL void *init_jit(PARROT_INTERP, NULLOK(opcode_t *pc))
void prepare_for_run(PARROT_INTERP)
PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL static opcode_t *runops_jit(PARROT_INTERP, NOTNULL(opcode_t *pc))
PARROT_WARN_UNUSED_RESULT PARROT_CAN_RETURN_NULL static opcode_t *runops_exec(PARROT_INTERP, NOTNULL(opcode_t *pc))
PARROT_WARN_UNUSED_RESULT PARROT_CANNOT_RETURN_NULL static opcode_t *runops_cgp(PARROT_INTERP, NOTNULL(opcode_t *pc))
goto
,
predereferenced core.PARROT_WARN_UNUSED_RESULT PARROT_CANNOT_RETURN_NULL static opcode_t *runops_switch(PARROT_INTERP, NOTNULL(opcode_t *pc))
switch
core.void runops_int(PARROT_INTERP, size_t offset)
Interp_flags
.
When a restart
opcode is encountered,
a different core may be selected and evaluation of opcode continues.void Parrot_setup_event_func_ptrs(PARROT_INTERP)
func_table
containing pointers (or addresses) of the check_event__
opcode.void dynop_register(PARROT_INTERP, PMC *lib_pmc)
static void dynop_register_xx(PARROT_INTERP, size_t n_old, size_t n_new, oplib_init_f init_func)
op_lib
with other cores.static void dynop_register_switch(size_t n_old, size_t n_new)
static void notify_func_table(PARROT_INTERP, NOTNULL(op_func_t *table), int on)
PARROT_API void disable_event_checking(PARROT_INTERP)
PARROT_API void enable_event_checking(PARROT_INTERP)
enable_event_checking()
is called async by the event handler thread.
All action done from here has to be async safe.include/parrot/interpreter.h, src/inter_cb.c, src/inter_create.c, src/inter_misc.c, src/inter_run.c.
|