Resurrection of whiteknight's eval_pmc branch
Patrick R. Michaud
pmichaud at pobox.com
Mon Feb 18 19:14:50 UTC 2013
On Mon, Feb 18, 2013 at 06:47:52PM +0100, Gerhard R. wrote:
> > No, it's not the same sub (see above). And in the case of NQP
> > and Rakudo, we generally need access to the first sub in order
> > to set its outer lexical context or other properties, not because
> > it's the "main" sub or the one that is to be executed.
> It *is* the same sub as long as there's no explicit :main as imcc
> considers the first sub it encounters the main one until a sub
> explicitly marked as such comes along.
> The question is: Does NQP/Rakudo ever emit code with a :main sub not
> in first position that gets passed to HLL::Compiler.compile()? If the
> answer is 'no', then whiteknight's patch is equivalent.
At the moment NQP/Rakudo do not emit :main subs, but they once did, and
if we ever attempt to do pre-compiled standalone .pbc/.exe files
instead of always invoking Perl 6 source code, then NQP/Rakudo will
again be generating subs with :main.
Such :main subs are *not* the mainline of the code being compiled,
they are auxiliary to simply load the rest of the Perl 6 compiler
and libraries prior to invoking the compiled mainline. Subs marked
:main must not be executed when run from an already-loaded compiler
instance, nor are they the ones that need their outer context set.
The HLL mainline (first) sub has to be reliably located so that
its outer context can be properly set when run from something like
eval(). It also has to appear ahead of any other lexically nested
subs (Parrot requires this in order for :outer to work).
> However, both solutions depend on imcc implementation details, which
> is probably not a good idea.
Somewhat false. The meanings of :main, :load, and :init have been
documented for quite some time (PDD 19), they aren't merely
"imcc implementation details".
> A more proper solution would be to use a
> custom tag to mark the sub we want to use explicitly (or an expixit
> :main if conflicts are impossible) instead of relying on source
Okay, as long as it's custom tag*s* to mark the sub*s* we want.
We need to be able to locate both the "Perl 6 mainline sub" and a
"Parrot sub to be automatically invoked when run via Parrot command line",
and they are generally not the same sub. The current pull requests
to NQP and Rakudo definitely confuse the two, thus I'm rejecting them
as they stand now.
More information about the parrot-dev