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 <[email protected]>
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
>
>
>

Reply via email to