Hi,

Chris Fields wrote:
The PGE::Match appears to be converted to a Str, regardless of the invoking object type. The following is .match (in any-str.pir, with the builtins). Also, .ACCEPTS now uses .match to retrieve the Match object.

# any-str.pir

.sub 'match' :method :multi(_)
    .param pmc x
    .local pmc match
    match = x(self)
    .return (match)
.end

# Code.pir

.sub 'ACCEPTS' :method
    .param pmc topic
    .local pmc match
    match = topic.'match'(self)
    $P0 = getinterp
    $P1 = $P0['lexpad';1]
    $P1['$/'] = match
    .return (match)
.end

the following is a test p6 script (results in comments):

my $x = '123.456';
my $y = $x.match(/\d+/);
say $x;        # 123.456
say $x.WHAT;   # Str
say $y;        # 123
say $y.WHAT;   # Str <- Should be Match
Ouch! But I've tracked it down. :-) The interesting thing is that:

my $x = "foo"; say ($x.match(/o+/)).WHAT; # Match

So it fails in the assignment. And that's because infix:= to a scalar does:

.sub 'infix:=' :method
   .param pmc source
   $P0 = source.'item'()
   assign self, $P0
   .return (self)
.end

And calling item on a Match object gets the string that matched. Thus why we don't get the Match object. So, that's the cause; I'm not sure what the correct fix is, so I'll delegate to pmichaud on that one. We could special case it, but it doesn't feel very clean, and special cases in a hot code patch like infix:= probably ain't so desirable.

Thanks,

Jonathan

Reply via email to