Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Optimize calls to P5 methods without args
No need to set up @Args and @svs arrays. Just pass the self $obj instead of
the argument list.
Saves about 2 % in csv-ip5xs.pl
  • Loading branch information
niner committed Sep 29, 2016
1 parent 101bf73 commit e2d9f94
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 7 deletions.
30 changes: 26 additions & 4 deletions lib/Inline/Perl5.pm6
Expand Up @@ -187,7 +187,7 @@ sub p5_hv_exists(Perl5Interpreter, Pointer, size_t, Blob) is native($p5helper)
sub p5_call_function(Perl5Interpreter, Str, int32, CArray[Pointer], int32 is rw, int32 is rw, int32 is rw) is native($p5helper)
returns Pointer { ... }

sub p5_call_method(Perl5Interpreter, Str, Pointer, int32, Str, int32, CArray[Pointer], int32 is rw, int32 is rw, int32 is rw) is native($p5helper)
sub p5_call_method(Perl5Interpreter, Str, Pointer, int32, Str, int32, Pointer, int32 is rw, int32 is rw, int32 is rw) is native($p5helper)
returns Pointer { ... }

sub p5_call_package_method(Perl5Interpreter, Str, Str, int32, CArray[Pointer], int32 is rw, int32 is rw, int32 is rw) is native($p5helper)
Expand Down Expand Up @@ -694,7 +694,7 @@ method !unpack_return_values($av, int32 $count, int32 $type = 0) {
}
}
else {
@
Empty
}
}

Expand Down Expand Up @@ -738,13 +738,15 @@ method invoke-parent(Str $package, Pointer $obj, Bool $context, Str $function, *
my int32 $retvals;
my int32 $err;
my int32 $type;
my ($j, @svs) := self!setup_arguments([flat @args.list, %args.list]);
my $av = p5_call_method(
$!p5,
$package,
$obj,
$context ?? 1 !! 0,
$function,
|self!setup_arguments([flat @args.list, %args.list]),
$j,
nativecast(Pointer, $j == 1 ?? @svs[0] !! @svs),
$retvals,
$err,
$type,
Expand Down Expand Up @@ -777,7 +779,27 @@ multi method invoke(Str $package, Pointer $obj, Bool $context, Str $function, *@
$context ?? 1 !! 0,
$function,
$j,
@svs,
nativecast(Pointer, @svs),
$retvals,
$err,
$type,
);
self.handle_p5_exception() if $err;
self!unpack_return_values($av, $retvals, $type);
}

multi method invoke(Str $package, Pointer $obj, Bool $context, Str $function) {
my int32 $retvals;
my int32 $err;
my int32 $type;
my $av = p5_call_method(
$!p5,
$package,
$obj,
$context ?? 1 !! 0,
$function,
1,
$obj,
$retvals,
$err,
$type,
Expand Down
10 changes: 7 additions & 3 deletions p5helper.c
Expand Up @@ -450,10 +450,14 @@ SV *p5_call_method(PerlInterpreter *my_perl, char *package, SV *obj, I32 context
if (gv && isGV(gv)) {
PUSHMARK(SP);

XPUSHs(package != NULL ? sv_2mortal(args[0]) : args[0]);
for (i = 1; i < len; i++) {
XPUSHs(sv_2mortal(args[i]));
if (len > 1) {
XPUSHs(package != NULL ? sv_2mortal(args[0]) : args[0]);
for (i = 1; i < len; i++) {
XPUSHs(sv_2mortal(args[i]));
}
}
else if (len > 0)
XPUSHs(package != NULL ? sv_2mortal((SV*)args) : (SV*)args);

PUTBACK;

Expand Down

0 comments on commit e2d9f94

Please sign in to comment.