Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Junction bind failover.
Gets almost all of the junction tests passing that to on Rakudo Parrot
as well as helping many other test files that depend on this somehow.
  • Loading branch information
jnthn committed Jun 22, 2013
1 parent 01fc34b commit 51f4ebe
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
11 changes: 11 additions & 0 deletions src/vm/jvm/Perl6/Ops.nqp
Expand Up @@ -50,10 +50,21 @@ $ops.add_hll_op('perl6', 'p6bindsig', -> $qastcomp, $op {
$il.append(JAST::Instruction.new( :op('aload'), '__args' ));
$il.append(JAST::Instruction.new( :op('invokestatic'), $TYPE_P6OPS,
"p6bindsig", $TYPE_CSD, $TYPE_TC, $TYPE_CSD, "[$TYPE_OBJ" ));
$il.append(JAST::Instruction.new( :op('dup') ));

my $natlbl := JAST::Label.new( :name('p6bindsig_no_autothread') );
$il.append(JAST::Instruction.new( :op('ifnonnull'), $natlbl ));
$il.append(JAST::Instruction.new( :op('aload'), 'cf' ));
$il.append(JAST::Instruction.new( :op('invokevirtual'),
$TYPE_CF, 'leave', 'Void' ));
$il.append(JAST::Instruction.new( :op('return') ));
$il.append($natlbl);

$il.append(JAST::Instruction.new( :op('astore'), 'csd' ));
$il.append(JAST::Instruction.new( :op('aload_1') ));
$il.append(JAST::Instruction.new( :op('getfield'), $TYPE_TC, 'flatArgs', "[$TYPE_OBJ" ));
$il.append(JAST::Instruction.new( :op('astore'), '__args' ));

$ops.result($il, $RT_VOID);
});
$ops.map_classlib_hll_op('perl6', 'p6isbindable', $TYPE_P6OPS, 'p6isbindable', [$RT_OBJ, $RT_OBJ], $RT_INT, :tc);
Expand Down
10 changes: 9 additions & 1 deletion src/vm/jvm/runtime/org/perl6/rakudo/Ops.java
Expand Up @@ -270,7 +270,15 @@ public static CallSiteDescriptor p6bindsig(ThreadContext tc, CallSiteDescriptor
case Binder.BIND_RESULT_FAIL:
throw ExceptionHandling.dieInternal(tc, error[0]);
case Binder.BIND_RESULT_JUNCTION:
throw ExceptionHandling.dieInternal(tc, "Junction re-dispatch NYI");
/* Invoke the auto-threader. */
csd = csd.injectInvokee(tc, args, cf.codeRef.codeObject);
args = tc.flatArgs;
org.perl6.nqp.runtime.Ops.invokeDirect(tc, gcx.AutoThreader, csd, args);
org.perl6.nqp.runtime.Ops.return_o(
org.perl6.nqp.runtime.Ops.result_o(cf), cf);

/* Return null to indicate immediate return to the routine. */
return null;
}

/* The binder may, for a variety of reasons, wind up calling Perl 6 code and overwriting flatArgs, so it needs to be set at the end to return reliably */
Expand Down

0 comments on commit 51f4ebe

Please sign in to comment.