This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
put signature ops in their own subtree.
authorDavid Mitchell <davem@iabyn.com>
Fri, 20 Sep 2019 13:43:01 +0000 (14:43 +0100)
committerDavid Mitchell <davem@iabyn.com>
Mon, 23 Sep 2019 13:52:04 +0000 (14:52 +0100)
commit4df857782a14d0973f58f6a629019d29259b2aad
treeb2d36c690e1ea63e4e319316ed37b5418407736b
parent64265ceb0b05ed7f7348ea0fa46d968aadb286a2
put signature ops in their own subtree.

The following code:

    sub f ($x,$y) {
        study;
    }

used to compile as:

    a  <1> leavesub[1 ref] K/REFC,1 ->(end)
    -     <@> lineseq KP ->a
    1        <;> nextstate(main 5 p:5) v:%,fea=7 ->2
    2        <+> argcheck(2,0) v ->3
    3        <;> nextstate(main 3 p:5) v:%,fea=7 ->4
    4        <+> argelem(0)[$x:3,5] v/SV ->5
    5        <;> nextstate(main 4 p:5) v:%,fea=7 ->6
    6        <+> argelem(1)[$y:4,5] v/SV ->7
    -        <;> ex-nextstate(main 5 p:5) v:%,fea=7 ->7
    7        <;> nextstate(main 5 p:6) v:%,fea=7 ->8
    9        <1> study sK/1 ->a
    -           <1> ex-rv2sv sK/1 ->9
    8              <$> gvsv(*_) s ->9

Following this commit, it compiles as:

    a  <1> leavesub[1 ref] K/REFC,1 ->(end)
    -     <@> lineseq KP ->a
    -        <1> ex-argcheck vK/1 ->7
    -           <@> lineseq vK ->-
    1              <;> nextstate(main 5 p:5) v:%,fea=7 ->2
    2              <+> argcheck(2,0) v ->3
    3              <;> nextstate(main 3 p:5) v:%,fea=7 ->4
    4              <+> argelem(0)[$x:3,5] v/SV ->5
    5              <;> nextstate(main 4 p:5) v:%,fea=7 ->6
    6              <+> argelem(1)[$y:4,5] v/SV ->7
    -              <;> ex-nextstate(main 5 p:5) v:%,fea=7 ->-
    7        <;> nextstate(main 5 p:6) v:%,fea=7 ->8
    9        <1> study sK/1 ->a
    -           <1> ex-rv2sv sK/1 ->9
    8              <#> gvsv[*_] s ->9

All the ops associated with the signature have been put in their own
subtree, with an extra NULL ex-argcheck op "on top". The op on top
serves two purposes: first, it makes it easier for Deparse.pm etc to
spot siganure code; secondly, it may at some point in the future be
upgraded to OP_SIGNATURE when signatures get optimised. It's of type
ex-argcheck only because when being created it needs to be an op type
that's in class UNOP_AUX so that the created op will be suitable for
later optimising, and making it an ex-type associated with signatures
helps flag it as such.

There should be no functional changes apart from the shape of the
optree.
ext/XS-APItest/APItest.pm
ext/XS-APItest/APItest.xs
ext/XS-APItest/t/subsignature.t
lib/B/Deparse.pm
perly.act
perly.h
perly.tab
perly.y