[perl #68658] attributes turn "state" into "my"
authorFather Chrysostomos <sprout@cpan.org>
Thu, 9 Dec 2010 00:52:08 +0000 (16:52 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 9 Dec 2010 00:52:32 +0000 (16:52 -0800)
commita1fba7eb664f6fea65549e94672040d8e47c905e
treee4796dcd38c011b1967e5c74c5d95d0d21f5de68
parent9f0564c6a634ece822d85183eb4065e894294d7f
[perl #68658] attributes turn "state" into "my"

This is for two reasons:

• In S_my_kid, the attribute-handling code comes before the code that
  marks the padop as being a state instead of a my, which it knows to
  do based on the value of PL_parser->in_my. The attribute-handling
  code begins by setting PL_parser->in_my to FALSE, preventing the
  code that follows from doing its job.

  So now PL_parser->in_my is read at the top of S_my_kid, before the
  attribute code, with the statehood recorded in a boolean. Then the
  code that marks the padop as being state checks that boolean
  instead of in_my.

• A lexical variable declaration that has an attribute and is assigned
  to in the same expression compiles to something similar to:

    (attributes->import(... \$x ...), my $x) = 3;

  where the list is actually in scalar context, returning the my $x
  which is then assigned to (something that cannot be expressed
  directly in Perl syntax). So Perl_ck_sassign needs to take that list
  op into account when creating the ‘once’ op that actually makes
  state assignment work. Up till now it was just looking for a padsv
  on its LHS. This commit makes it check also for a list op whose last
  item is a padsv.
op.c
t/op/attrs.t