Embed questions
Andrew Whitworth
wknight8111 at gmail.com
Mon Oct 25 00:25:28 UTC 2010
Some people may have seen some recent traffic on my blog [1][2]. A
Parrot user is trying to do some stuff with embedding a Parrot
interpreter into a 3D game engine, and is having a hell of a lot of
trouble doing it. I would like to rectify these problems before the
next release, but I have two questions that I would either like
answers to, or would like to generate enough discussion that I can
confidently come up with my own [experimental] solutions. So, here
they are:
1) The most specific question that was generated on my blog is this:
How does an embedding application load a bytecode file into a Parrot
interpreter? There is function Parrot_load_bytecode, but that function
throws an exception on error and does not return a value. Is it
worthwhile to create a new API function for external uses that is
easier to use in cases where we have a PBC file and we just want to
load it without having to go through the hassle of registering a
C-level exception handler? Also, it looks like this function is only
ever really used from the load_bytecode opcode, there are no examples
of it being used elsewhere.
For comparison, IMCC goes through this kind of dance when a .pbc file
is specified from the commandline:
Packfile * pf = Parrot_pbc_read(interp, ...);
Parrot_pbc_load(interp, pf);
It looks to me like neither of these functions throw exceptions, and
both of which are available in embed.c, but are these the functions we
want to use for this purpose or can we come up with a better API?
2) How to we propagate unhandled errors and exceptions? That is, how
do we communicate an error condition to an embedding application?
Parrot *can not* just write error messages and unhandled exception
messages to STDERR. We do need a way to allow an embedding application
to detect an error and receive information about it. An example that
comes to mind immediately is the Win32 API, where most API functions
return a 0 on error, and the function GetLastError returns information
about it. I don't think we want to copy this model, but embedding
applications do need a way to redirect where error information goes,
including not writing it to any file. Simply overriding the PMC used
for the interpreter's STDERR handle doesn't work in all cases. Look in
the code for Parrot_io_eprintf for examples. To a search through the
codebase for "fprintf" and "stderr" for others.
We absolutely need a standard method for embedding applications to
detect fatal and otherwise unhandled errors generated by an
interpreter, and we need a method for the embedding application to get
information about that error and present it to the user in a
completely customizable way.
Thanks,
--Andrew Whitworth
More information about the parrot-dev
mailing list