NAME ^

src/interpreter.c - Parrot Interpreter

DESCRIPTION ^

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.

Functions ^

prederef_args

Called from do_prederef() to deal with any arguments.

pc_prederef is the current opcode.

do_prederef

This is called from within the run cores to predereference the current opcode.

pc_prederef is the current opcode, and type is the run core type.

turn_ev_check

Turn on or off event checking for prederefed cores.

Fills in the event_checker opcode, or restores original ops in all branch locations of the opcode stream.

Note that when on is true, this is being called from the event handler thread.

get_op_lib_init

Returns an opcode's library op_lib init function.

core_op indicates whether the opcode represents a core Parrot operation.

which is the run core type.

For dynamic oplibs core_op will be 0 and lib will be a ParrotLibrary PMC.

load_prederef

interp->op_lib = prederefed oplib.

init_prederef

Initialize: load prederef func_table, file prederef.code.

stop_prederef

Restore the interpreter's op function tables to their initial state. Also recreate the event function pointers. This is only necessary for run-core changes, but we don't know the old run core.

exec_init_prederef

interp->op_lib = prederefed oplib

The "normal" op_lib has a copy in the interpreter structure - but get the op_code lookup function from standard core prederef has no op_info_table

init_jit

Initializes JIT function for the specified opcode and returns it.

prepare_for_run

Prepares to run the interpreter's run core.

runops_jit

Runs the JIT code for the specified opcode.

runops_exec

Runs the native executable version of the specified opcode.

runops_cgp

Runs the C goto, predereferenced core.

runops_switch

Runs the switch core.

runops_int

Run Parrot operations of loaded code segment until an end opcode is reached. Run core is selected depending on the Interp_flags. When a restart opcode is encountered, a different core may be selected and evaluation of opcode continues.

Parrot_setup_event_func_ptrs

Setup a func_table containing pointers (or addresses) of the check_event__ opcode.

TODO: Free it at destroy. Handle run-core changes.

Dynamic Loading Functions ^

dynop_register

Register a dynamic oplib.

dynop_register_xx

Register op_lib with other cores.

notify_func_table

Tell the interpreter's running core about the new function table.

disable_event_checking

Restore old function table.

XXX This is only implemented for the function core at present.

enable_event_checking

Replace func table with one that does event checking for all opcodes.

NOTE: enable_event_checking() is called async by the event handler thread. All action done from here has to be async safe.

XXX This is only implemented for the function core at present.

SEE ALSO ^

include/parrot/interpreter.h, src/inter_cb.c, src/inter_create.c, src/inter_misc.c, src/inter_run.c.


parrot