petdance/scratch — Issue #260: NQP-rx generates bad access code for non-twigiled attribute
Author: petdance
Created: 2011-11-01 04:25:30+00:00
State: open

This code, with twigil:
{{{
austin@andLinux:~/kakapo$ cat test.nqp
method foo() {
has @!attr;

for my @a {
say(@!attr);
}
}
}}}
Generates this pir:
{{{
.annotate "line", 5
find_lex $P24, "self"
getattribute $P25, $P24, "@!attr"
unless_null $P25, vivify_14
new $P25, "ResizablePMCArray"
vivify_14:
}}}
Whereas this code, sans twigil:
{{{
austin@andLinux:~/kakapo$ cat test.nqp
method foo() {
has @attr;

for my @a {
say(@attr);
}
}
}}}
Generates this output:
{{{
.annotate "line", 5
getattribute $P24, self, "@attr"
$P25 = "say"($P24)
.annotate "line", 4
}}}

Because the sub is a nested block, it has no method declaration and so must do a find-lex lookup to get 'self'. This is not happening.

Since the grammar does not support '.' as a twigil, which I think it should, I'm not sure if an attribute with no twigil is or isn't valid. If it's not valid, then the `has @attr` declaration should throw an error. If it's valid, then the access code should work.