Skip to content

Commit 0aba7db

Browse files
committed
Pass PADOFFSET integers in to subsignature_append_*() functions
This simplifies potential callsites from other locations, avoiding their need to create the special weird OP_ARGELEM fragments. Additionally this decouples the knowledge that these operations are run on OP_ARGELEM ops in the first place, allowing for a future version that operates differently.
1 parent 26d53a3 commit 0aba7db

File tree

7 files changed

+62
-67
lines changed

7 files changed

+62
-67
lines changed

embed.fnc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3111,12 +3111,12 @@ CRp |NV |str_to_version |NN SV *sv
31113111
p |void |sub_crush_depth|NN CV *cv
31123112
: Used in perly.y
31133113
p |void |subsignature_append_positional \
3114-
|NULLOK OP *varop \
3114+
|PADOFFSET padix \
31153115
|OPCODE defmode \
31163116
|NULLOK OP *defexpr
31173117
p |void |subsignature_append_slurpy \
31183118
|I32 sigil \
3119-
|NULLOK OP *varop
3119+
|PADOFFSET padix
31203120
p |OP * |subsignature_finish
31213121
p |void |subsignature_start
31223122
Adp |void |suspend_compcv |NN struct suspended_compcv *buffer

op.c

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16519,17 +16519,15 @@ Perl_subsignature_start(pTHX)
1651916519
}
1652016520

1652116521
/* Appends another positional scalar parameter to the accumulated set of
16522-
* subroutine params. `varop` may be NULL, but if not it must be an OP_ARGELEM
16523-
* whose op_targ refers to an already-declared pad lexical. That lexical must
16524-
* be a scalar. It is not necessary to set the argument index in the op_aux
16525-
* field; that will be filled in by this function.
16522+
* subroutine params. `padix` may be zero, but if not it must be the pad
16523+
* index of a scalar pad lexical to store the incoming argument value into.
1652616524
* If `defexpr` is not NULL, it gives a defaulting expression to be evaluated
1652716525
* if required, according to `defmode` - one of zero, `OP_DORASSIGN` or
1652816526
* `OP_ORASSIGN`.
1652916527
*/
1653016528

1653116529
void
16532-
Perl_subsignature_append_positional(pTHX_ OP *varop, OPCODE defmode, OP *defexpr)
16530+
Perl_subsignature_append_positional(pTHX_ PADOFFSET padix, OPCODE defmode, OP *defexpr)
1653316531
{
1653416532
PERL_ARGS_ASSERT_SUBSIGNATURE_APPEND_POSITIONAL;
1653516533
assert(PL_parser);
@@ -16541,13 +16539,13 @@ Perl_subsignature_append_positional(pTHX_ OP *varop, OPCODE defmode, OP *defexpr
1654116539

1654216540
UV argix = signature->elems;
1654316541

16544-
if(varop) {
16545-
assert(varop->op_type == OP_ARGELEM);
16546-
assert((varop->op_private & OPpARGELEM_MASK) == OPpARGELEM_SV);
16547-
assert(varop->op_targ);
16548-
assert(PadnamePV(PadnamelistARRAY(PL_comppad_name)[varop->op_targ])[0] == '$');
16542+
OP *varop = NULL;
16543+
if(padix) {
16544+
assert(PadnamePV(PadnamelistARRAY(PL_comppad_name)[padix])[0] == '$');
1654916545

16550-
/* Now fill in the argix */
16546+
varop = newUNOP_AUX(OP_ARGELEM, 0, NULL, NULL);
16547+
varop->op_private |= OPpARGELEM_SV;
16548+
varop->op_targ = padix;
1655116549
cUNOP_AUXx(varop)->op_aux = INT2PTR(UNOP_AUX_item *, argix);
1655216550
}
1655316551

@@ -16604,14 +16602,13 @@ Perl_subsignature_append_positional(pTHX_ OP *varop, OPCODE defmode, OP *defexpr
1660416602
}
1660516603

1660616604
/* Appends a final slurpy parameter to the accumulated set of subroutine
16607-
* params. `varop` may be NULL, but if not it must be an OP_ARGELEM whose
16608-
* op_targ refers to an already-declared pad lexical. That lexical must match
16609-
* the `sigil` parameter. It is not necessary to set the argument index in the
16610-
* op_aux field; that will be filled in by this function.
16605+
* params. `padix` may be zero, but if not it must be the pad index of an
16606+
* array or hash lexical to store the remaining argument values into. Its
16607+
* sigil must match the `sigil` parameter.
1661116608
*/
1661216609

1661316610
void
16614-
Perl_subsignature_append_slurpy(pTHX_ I32 sigil, OP *varop)
16611+
Perl_subsignature_append_slurpy(pTHX_ I32 sigil, PADOFFSET padix)
1661516612
{
1661616613
PERL_ARGS_ASSERT_SUBSIGNATURE_APPEND_SLURPY;
1661716614
assert(PL_parser);
@@ -16624,21 +16621,19 @@ Perl_subsignature_append_slurpy(pTHX_ I32 sigil, OP *varop)
1662416621

1662516622
UV argix = signature->elems;
1662616623

16627-
if(varop) {
16628-
assert(varop->op_type == OP_ARGELEM);
16629-
assert((varop->op_private & OPpARGELEM_MASK) ==
16630-
((sigil == '@') ? OPpARGELEM_AV : OPpARGELEM_HV));
16631-
assert(varop->op_targ);
16632-
assert(PadnamePV(PadnamelistARRAY(PL_comppad_name)[varop->op_targ])[0] == sigil);
16624+
signature->slurpy = (char)sigil;
1663316625

16634-
/* Now fill in the argix */
16635-
cUNOP_AUXx(varop)->op_aux = INT2PTR(UNOP_AUX_item *, argix);
16636-
}
16626+
if(padix) {
16627+
assert(PadnamePV(PadnamelistARRAY(PL_comppad_name)[padix])[0] == sigil);
1663716628

16638-
signature->slurpy = (char)sigil;
16629+
OP *varop = newUNOP_AUX(OP_ARGELEM, 0, NULL, NULL);
16630+
if(sigil == '@')
16631+
varop->op_private |= OPpARGELEM_AV;
16632+
if(sigil == '%')
16633+
varop->op_private |= OPpARGELEM_HV;
16634+
varop->op_targ = padix;
16635+
cUNOP_AUXx(varop)->op_aux = INT2PTR(UNOP_AUX_item *, argix);
1663916636

16640-
if(varop) {
16641-
/* TODO: assert() the sigil of the pad variable matches */
1664216637
signature->elemops = op_append_list(OP_LINESEQ, signature->elemops,
1664316638
newSTATEOP(0, NULL, varop));
1664416639
}

perly.act

Lines changed: 15 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

perly.h

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

perly.tab

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

perly.y

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@
114114
%type <opval> optfieldattrlist fielddecl
115115
%type <opval> termbinop termunop anonymous termdo
116116
%type <opval> termrelop relopchain termeqop eqopchain
117-
%type <ival> sigslurpsigil
118-
%type <opval> sigvarname sigscalarelem sigslurpelem
117+
%type <ival> sigslurpsigil sigvar
118+
%type <opval> sigscalarelem sigslurpelem
119119
%type <opval> sigelem siglist optsiglist subsigguts subsignature optsubsignature
120120
%type <opval> subbody optsubbody sigsubbody optsigsubbody
121121
%type <opval> formstmtseq formline formarg
@@ -822,10 +822,10 @@ myattrlist: COLONATTR THING
822822
*/
823823

824824
/* the '' or 'foo' part of a '$' or '@foo' etc signature variable */
825-
sigvarname: %empty
826-
{ parser->in_my = 0; $$ = NULL; }
825+
sigvar: %empty
826+
{ parser->in_my = 0; $$ = 0; }
827827
| PRIVATEREF
828-
{ parser->in_my = 0; $$ = $PRIVATEREF; }
828+
{ parser->in_my = 0; $$ = $PRIVATEREF->op_targ; op_free($PRIVATEREF); }
829829
;
830830

831831
sigslurpsigil:
@@ -835,36 +835,36 @@ sigslurpsigil:
835835
{ $$ = '%'; }
836836

837837
/* @, %, @foo, %foo */
838-
sigslurpelem: sigslurpsigil sigvarname
838+
sigslurpelem: sigslurpsigil sigvar
839839
{
840-
subsignature_append_slurpy($sigslurpsigil, $sigvarname);
840+
subsignature_append_slurpy($sigslurpsigil, $sigvar);
841841
$$ = NULL;
842842
}
843-
| sigslurpsigil sigvarname ASSIGNOP
843+
| sigslurpsigil sigvar ASSIGNOP
844844
{
845845
yyerror("A slurpy parameter may not have a default value");
846846
}
847-
| sigslurpsigil sigvarname ASSIGNOP term
847+
| sigslurpsigil sigvar ASSIGNOP term
848848
{
849849
yyerror("A slurpy parameter may not have a default value");
850850
}
851851
;
852852

853853
/* subroutine signature scalar element: e.g. '$x', '$=', '$x = $default' */
854854
sigscalarelem:
855-
PERLY_DOLLAR sigvarname
855+
PERLY_DOLLAR sigvar
856856
{
857-
subsignature_append_positional($sigvarname, 0, NULL);
857+
subsignature_append_positional($sigvar, 0, NULL);
858858
$$ = NULL;
859859
}
860-
| PERLY_DOLLAR sigvarname ASSIGNOP
860+
| PERLY_DOLLAR sigvar ASSIGNOP
861861
{
862-
subsignature_append_positional($sigvarname, $ASSIGNOP, newOP(OP_NULL, 0));
862+
subsignature_append_positional($sigvar, $ASSIGNOP, newOP(OP_NULL, 0));
863863
$$ = NULL;
864864
}
865-
| PERLY_DOLLAR sigvarname ASSIGNOP term[defop]
865+
| PERLY_DOLLAR sigvar ASSIGNOP term[defop]
866866
{
867-
subsignature_append_positional($sigvarname, $ASSIGNOP, $defop);
867+
subsignature_append_positional($sigvar, $ASSIGNOP, $defop);
868868
$$ = NULL;
869869
}
870870
;

proto.h

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)