Skip Menu |
Report information
Id: 127860
Status: open
Priority: 0/
Queue: perl6

Owner: Nobody
Requestors: jns+bc [at] gellyfish.co.uk
Cc:
AdminCc:

Severity: (no value)
Tag: Bug
Platform: (no value)
Patch Status: (no value)
VM: (no value)



Subject: [BUG][PRECOMP] Wrapped method fails when precompiled
Download (untitled) / with headers
text/plain 2.2k
It appears that the Metamodel::WrapDispatcher can't find the candidate to execute when the wrapped method is pre-compiled. This can be recreated in several ways, first by wrapping the method in an over-ridden add_method: lib/Vum.pm: class MetamodelX::FooHOW is Metamodel::ClassHOW { method add_method(Mu \type, $name, &code) { say "adding $name"; my &wrapper = method (|c) { say "running $name"; callsame; }; &code.wrap( &wrapper ); self.Metamodel::ClassHOW::add_method(type, $name, &code); } method compose(Mu \type) { self.Metamodel::ClassHOW::compose(type); } } my package EXPORTHOW { package SUPERSEDE { constant class = MetamodelX::FooHOW; } } And lib/Boo.pm : use Vum; #no precompilation; class Boo { has $.rabble; method rack() { say "rabble : "; } } And exercised with "perl6 -Ilib ...": use Boo; my $b = Boo.new(rabble => "hoodoo"); say $b.rack; This will fail with: Cannot invoke this object in method <anon> at /home/jonathan/devel/perl6/Vum/lib/Vum.pm (Vum) line 4 in any enter at gen/moar/m-Metamodel.nqp line 3947 in block <unit> at tt line 5 (Which points to the enter method of WrapDispatch.) Which would appear that it is not getting the appropriate Callable from .candidates[0]. With the "no precompilation" un-commented in Boo.pm this will work fine. Just to check that this wasn't something mysterious in the MOP it can also be replicated with: lib/Wom.pm: module Wom { multi sub trait_mod:<is>(Method $m, :$brapped!) is export { $m.wrap(method (|c) { say "wrapped"; callsame }); } } lib/Bok.pm: use Wom; #no precompilation; class Bok { has $.rabble; method rack() is brapped { say "rabble : "; } } And exercised with the similar script run with "perl6 -Ilib ..." : use Bok; my $b = Bok.new(rabble => "hoodoo"); say $b.rack; Then this will also fail identically without the "no precompilation". This afflicts OO::Monitors in the ecosystem which cannot be used in a module that will be precompiled, and I suspect this is also at the heart of a problem with Staticish which similarly doesn't work if used in a module which is precompiled. This is with: This is Rakudo version 2016.03-98-g61d231c built on MoarVM version 2016.03-84-g4afd7b6
Subject: Re: [perl #127860] [BUG][PRECOMP] Wrapped method fails when precompiled
Date: Sat, 09 Apr 2016 10:23:37 +0000
To: perl6-compiler [...] perl.org, bugs-bitbucket [...] rt.perl.org
From: Lloyd Fournier <lloyd.fourn [...] gmail.com>
Download (untitled) / with headers
text/plain 2.8k
For reference this is another related to:


On Sat, Apr 9, 2016 at 7:10 AM Jonathan Stowe <perl6-bugs-followup@perl.org> wrote:
Show quoted text
# New Ticket Created by  Jonathan Stowe
# Please include the string:  [perl #127860]
# in the subject line of all future correspondence about this issue.
# <URL: https://rt.perl.org/Ticket/Display.html?id=127860 >


It appears that the Metamodel::WrapDispatcher can't find the candidate to execute when the wrapped method is pre-compiled.

This can be recreated in several ways, first by wrapping the method in an over-ridden add_method:

lib/Vum.pm:

class MetamodelX::FooHOW is Metamodel::ClassHOW {
    method add_method(Mu \type, $name, &code) {
        say "adding $name";
        my &wrapper = method (|c) { say "running $name"; callsame; };
        &code.wrap( &wrapper );
        self.Metamodel::ClassHOW::add_method(type, $name, &code);
   }
   method compose(Mu \type) {
       self.Metamodel::ClassHOW::compose(type);
   }
}

my package EXPORTHOW {
    package SUPERSEDE {
       constant class = MetamodelX::FooHOW;
    }
}

And lib/Boo.pm :

use Vum;

#no precompilation;

class Boo {
   has $.rabble;
   method rack() {
      say "rabble : ";
   }
}

And exercised with "perl6 -Ilib ...":


use Boo;

my $b = Boo.new(rabble => "hoodoo");

say $b.rack;

This will fail with:

Cannot invoke this object
  in method <anon> at /home/jonathan/devel/perl6/Vum/lib/Vum.pm (Vum) line 4
  in any enter at gen/moar/m-Metamodel.nqp line 3947
  in block <unit> at tt line 5

(Which points to the enter method of WrapDispatch.) Which would appear that it is not getting the appropriate Callable from .candidates[0]. With the "no precompilation" un-commented in Boo.pm this will work fine.

Just to check that this wasn't something mysterious in the MOP it can also be replicated with:

lib/Wom.pm:

module Wom {
   multi sub trait_mod:<is>(Method $m, :$brapped!) is export {
      $m.wrap(method (|c) { say "wrapped"; callsame });
   }
}

lib/Bok.pm:

use Wom;

#no precompilation;

class Bok {
   has $.rabble;
   method rack() is brapped {
      say "rabble : ";
   }
}

And exercised with the similar script run with "perl6 -Ilib ..." :

use Bok;

my $b = Bok.new(rabble => "hoodoo");

say $b.rack;

Then this will also fail identically without the "no precompilation".

This afflicts OO::Monitors in the ecosystem which cannot be used in a module that will be precompiled, and I suspect this is also at the heart of a problem with Staticish which similarly doesn't work if used in a module which is precompiled.



This is with:

This is Rakudo version 2016.03-98-g61d231c built on MoarVM version 2016.03-84-g4afd7b6


From: Jonathan Stowe <jns [...] gellyfish.co.uk>
To: perl6-bugs-followup [...] perl.org, jns+bc [...] gellyfish.co.uk
Date: Sat, 09 Apr 2016 13:36:46 +0100
Subject: Re: [perl #127860] [BUG][PRECOMP] Wrapped method fails when precompiled
Download (untitled) / with headers
text/plain 3.6k
I'm actually surprised there are as few "Cannot invoke this object" tickets: https://rt.perl.org/Search/Simple.html?q=%22Cannot+invoke+this+object%2 2 A cursory survey of those would suggest that they all fall in a wider category of "code attribute of some type not surviving precompilation" On Sat, 2016-04-09 at 03:24 -0700, Lloyd Fournier via RT wrote: Show quoted text
> For reference this is another related to: > > https://rt.perl.org/Public/Bug/Display.html?id=125634 > > On Sat, Apr 9, 2016 at 7:10 AM Jonathan Stowe <perl6-bugs-followup@pe > rl.org> > wrote: >
> > > > # New Ticket Created by  Jonathan Stowe > > # Please include the string:  [perl #127860] > > # in the subject line of all future correspondence about this > > issue. > > # <URL: https://rt.perl.org/Ticket/Display.html?id=127860 > > > > > > > It appears that the Metamodel::WrapDispatcher can't find the > > candidate to > > execute when the wrapped method is pre-compiled. > > > > This can be recreated in several ways, first by wrapping the method > > in an > > over-ridden add_method: > > > > lib/Vum.pm: > > > > class MetamodelX::FooHOW is Metamodel::ClassHOW { > >     method add_method(Mu \type, $name, &code) { > >         say "adding $name"; > >         my &wrapper = method (|c) { say "running $name"; callsame; > > }; > >         &code.wrap( &wrapper ); > >         self.Metamodel::ClassHOW::add_method(type, $name, &code); > >    } > >    method compose(Mu \type) { > >        self.Metamodel::ClassHOW::compose(type); > >    } > > } > > > > my package EXPORTHOW { > >     package SUPERSEDE { > >        constant class = MetamodelX::FooHOW; > >     } > > } > > > > And lib/Boo.pm : > > > > use Vum; > > > > #no precompilation; > > > > class Boo { > >    has $.rabble; > >    method rack() { > >       say "rabble : "; > >    } > > } > > > > And exercised with "perl6 -Ilib ...": > > > > > > use Boo; > > > > my $b = Boo.new(rabble => "hoodoo"); > > > > say $b.rack; > > > > This will fail with: > > > > Cannot invoke this object > >   in method <anon> at /home/jonathan/devel/perl6/Vum/lib/Vum.pm > > (Vum) line > > 4 > >   in any enter at gen/moar/m-Metamodel.nqp line 3947 > >   in block <unit> at tt line 5 > > > > (Which points to the enter method of WrapDispatch.) Which would > > appear > > that it is not getting the appropriate Callable from > > .candidates[0]. With > > the "no precompilation" un-commented in Boo.pm this will work fine. > > > > Just to check that this wasn't something mysterious in the MOP it > > can also > > be replicated with: > > > > lib/Wom.pm: > > > > module Wom { > >    multi sub trait_mod:<is>(Method $m, :$brapped!) is export { > >       $m.wrap(method (|c) { say "wrapped"; callsame }); > >    } > > } > > > > lib/Bok.pm: > > > > use Wom; > > > > #no precompilation; > > > > class Bok { > >    has $.rabble; > >    method rack() is brapped { > >       say "rabble : "; > >    } > > } > > > > And exercised with the similar script run with "perl6 -Ilib ..." : > > > > use Bok; > > > > my $b = Bok.new(rabble => "hoodoo"); > > > > say $b.rack; > > > > Then this will also fail identically without the "no > > precompilation". > > > > This afflicts OO::Monitors in the ecosystem which cannot be used in > > a > > module that will be precompiled, and I suspect this is also at the > > heart of > > a problem with Staticish which similarly doesn't work if used in a > > module > > which is precompiled. > > > > > > > > This is with: > > > > This is Rakudo version 2016.03-98-g61d231c built on MoarVM version > > 2016.03-84-g4afd7b6 > > > > > >


This service is sponsored and maintained by Best Practical Solutions and runs on Perl.org infrastructure.

For issues related to this RT instance (aka "perlbug"), please contact perlbug-admin at perl.org