Ticket #150 (closed bug: fixed)
load_bytecode, loadlib, and HLL
| Reported by: | tene | Owned by: | |
|---|---|---|---|
| Priority: | normal | Milestone: | |
| Component: | hll_interop | Version: | |
| Severity: | medium | Keywords: | |
| Cc: | coke, NotFound | Language: | |
| Patch status: | Platform: |
Description (last modified by coke) (diff)
This works fine:
# demo.pir
.sub main :main
load_bytecode 'perl6.pbc'
.end
This fails, due to Perl6Str not existing
# demo.pir
.HLL 'foo'
.sub main :main
load_bytecode 'perl6.pbc'
.end
The runtime version using the 'loadlib' op can work, kind of.
Adding this to perl6.pir doesn't help:
# perl6.pir
.HLL 'parrot'
.sub '' :anon :load :init :immediate
$P0 = loadlib 'perl6_group'
$P0 = loadlib 'perl6_ops'
.end
Adding that same code to the example does work:
# demo.pir
.HLL 'parrot'
.sub '' :anon :load :init :immediate
$P0 = loadlib 'perl6_group'
$P0 = loadlib 'perl6_ops'
.end
.HLL 'foo'
.sub main :main
load_bytecode 'perl6.pbc'
.end
This rather complicates attempts to use rakudo from another HLL.
I did a little bit of digging, and found this:
.loadlib is handled by do_loadlib in imcparser.c, which is:
/* imcparser.c */
do_loadlib(PARROT_INTERP, ARGIN(const char *lib))
{
ASSERT_ARGS(do_loadlib);
STRING * const s = string_unescape_cstring(interp, lib + 1, '"', NULL);
PMC *ignored = Parrot_load_lib(interp, s, NULL);
UNUSED(ignored);
Parrot_register_HLL_lib(interp, s);
}
The loadlib op is handled by 'op loadlib' in core.ops:
/* core.ops */
inline op loadlib(out PMC, in STR) {
$1 = Parrot_load_lib(interp, $2, NULL);
}
You'll notice that the op version doesn't call Parrot_register_HLL_lib, but adding that to 'op loadlib' doesn't help. That's as far as I got in investigating this issue.
Attachments
Change History
Note: See
TracTickets for help on using
tickets.

