Skip to content

Commit

Permalink
Use multi dispatch to differentiate between one simple and one pair a…
Browse files Browse the repository at this point in the history
…rgument

A Pair is a single argument for Perl 6 but actually two arguments for Perl 5.
The optimized code for handling a single argument can become even faster when
guaranteed that the argument is not a Pair.
  • Loading branch information
niner committed Jun 9, 2018
1 parent 63f3a2d commit 314f435
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
22 changes: 21 additions & 1 deletion lib/Inline/Perl5.pm6
Original file line number Diff line number Diff line change
Expand Up @@ -479,9 +479,29 @@ method invoke-gv(Pointer $obj, Pointer $function) {
self.unpack_return_values($av, $retvals, $type);
}

method invoke-gv-simple-arg(Pointer $obj, Pointer $function, $arg) {
my @svs := CArray[Pointer].new();
@svs.ASSIGN-POS(0, $obj);
@svs.ASSIGN-POS(1, self.p6_to_p5($arg));
my int32 $retvals;
my int32 $err;
my int32 $type;
my $av = $!p5.p5_call_gv(
$obj,
0,
$function,
2,
nativecast(Pointer, @svs),
$retvals,
$err,
$type,
);
self.handle_p5_exception() if $err;
self.unpack_return_values($av, $retvals, $type);
}

method invoke-gv-arg(Pointer $obj, Pointer $function, $arg) {
my @svs := CArray[Pointer].new();
my Int $j = 0;
@svs[0] = $obj;
if $arg.WHAT =:= Pair {
@svs[1] = self.p6_to_p5($arg.key);
Expand Down
8 changes: 7 additions & 1 deletion lib/Inline/Perl5/ClassHOW.pm6
Original file line number Diff line number Diff line change
Expand Up @@ -151,11 +151,17 @@ class Inline::Perl5::ClassHOW
!! $p5.invoke-gv(self.wrapped-perl5-object, $gv)
};
$proto.add_dispatchee($generic-no-args.instantiate_generic(%(:T($defined_type))));
my $one-arg := my method one-arg(Any:D: \arg) {
my $one-pair-arg := my method one-pair-arg(Any:D: Pair \arg) {
%_.elems
?? $p5.invoke-gv-args(self.wrapped-perl5-object, $gv, Capture.new(:list([arg]), :hash(%_)))
!! $p5.invoke-gv-arg(self.wrapped-perl5-object, $gv, arg)
};
$proto.add_dispatchee($one-pair-arg);
my $one-arg := my method one-arg(Any:D: \arg) {
%_.elems
?? $p5.invoke-gv-args(self.wrapped-perl5-object, $gv, Capture.new(:list([arg]), :hash(%_)))
!! $p5.invoke-gv-simple-arg(self.wrapped-perl5-object, $gv, arg)
};
$proto.add_dispatchee($one-arg);

self.add_method($type, $name, $proto)
Expand Down

0 comments on commit 314f435

Please sign in to comment.