parrotcode: Exceptions | |
Contents | C |
src/exceptions.c - Exceptions
Define the internal interpreter exceptions.
enum_class
of the Exception isn't fixed.void internal_exception(int exitcode, const char *format, ...)
Parrot_exit
to invoke exit handlers and exit the process with the given exitcode.
No error handlers are used,
so it is not possible for Parrot bytecode to intercept a fatal error (cf.
real_exception
).
Furthermore,
no stack unwinding is done,
so the exit handlers run in the current dynamic environment.void do_panic(Interp *interp, const char *message, const char *file, int line)
void push_exception(Interp *interp, PMC *handler)
void Parrot_push_action(Interp *interp, PMC *sub)
void Parrot_push_mark(Interp *interp, INTVAL mark)
void Parrot_pop_mark(Interp *interp, INTVAL mark)
static PMC *find_exception_handler(Interp *interp, PMC *exception)
exception
.void pop_exception(Interp *interp)
PMC *new_c_exception_handler(Interp *interp, Parrot_exception *jb)
void push_new_c_exception_handler(Interp *interp, Parrot_exception *jb)
void *throw_exception(Interp *interp, PMC *exception, void *dest)
void *rethrow_exception(Interp *interp, PMC *exception)
void rethrow_c_exception(Interp *interp)
TODO
and that this is called from within a handler setup with new_c_exception
.static size_t dest2offset(Interp *interp, const opcode_t *dest)
static opcode_t *create_exception(Interp *interp)
size_t handle_exception(Interp *interp)
void new_internal_exception(Interp *interp)
void free_internal_exception(Interp *interp)
void do_exception(Interp *interp, exception_severity severity, long error)
longjmp
in front of the runloop,
which calls handle_exception()
,
returning the handler address where execution then resumes.void real_exception(Interp *interp, void *ret_addr, int exitcode, const char *format, ...)
ret_addr
is the address from which to resume,
if some handler decides that is appropriate,
or zero to make the error non-resumable.
exitcode
is a exception_type_enum
value.internal_exception()
,
which signals fatal errors,
and throw_exception
,
which calls the handler.void Parrot_init_exceptions(Interp *interp)
interp->exception_list = mem_sys_allocate(
sizeof(PMC*) * (E_LAST_PYTHON_E + 1));
for (i = 0; i <= E_LAST_PYTHON_E; ++i) {
PMC * const ex = pmc_new(interp, enum_class_Exception);
interp->exception_list[i] = ex;
VTABLE_set_integer_keyed_int(interp, ex, 1, i);
}
}
include/parrot/exceptions.h.
|