summaryrefslogtreecommitdiff
path: root/op.c
diff options
context:
space:
mode:
authorReini Urban <rurban@cpanel.net>2016-09-29 14:30:27 +0100
committerDavid Mitchell <davem@iabyn.com>2016-09-29 17:01:15 +0100
commit1257c0814cb385a65f4175daa8be8b51e151e4ec (patch)
treec2c9a651efdbebddea50f90c54bec0b4d447b071 /op.c
parent614f2ce4f49414577dec90f8c9bd3f0404bf2ebf (diff)
downloadperl-1257c0814cb385a65f4175daa8be8b51e151e4ec.tar.gz
sassign is wrongly declared as BASEOP, not BINOP.
[ DAPM: To clarify: OP_SASSIGN is always allocated as a BINOP (or occasionally as a UNOP - see the next commit), but is listed as a BASEOP in regen/opcodes. Because of this, various bits of code that rely on e.g. PL_opargs[] have to be special-cased for OP_SASSIGN. This commit changes the entry in regen/opcodes to list it as BINOP, and removes the special-casing. I've also added a temporary workaround marked by XXX to make the commit work under PERL_OP_PARENT, which is the default now. This will be removed in a couple if commits' time. ] This was wrong from the very beginning: added with 79072805bf lwall perl 5.0 alpha 2 1993 with class s, not 0, but missing the 2 S S args, which are present in aassign. Changed to BASEOP with db173bac9b6de7d by mbeattie in 1997. The '# sassign is special-cased for op class' comment is suspicious. Fix it in ck_sassign also, it is created as BINOP in newASSIGNOP. In 202206897 dapm 2014 complained about it also. Remove some special cases where it should be a BINOP but was not.
Diffstat (limited to 'op.c')
-rw-r--r--op.c7
1 files changed, 3 insertions, 4 deletions
diff --git a/op.c b/op.c
index 0fbee4834b..271c7143fe 100644
--- a/op.c
+++ b/op.c
@@ -2648,11 +2648,10 @@ S_finalize_op(pTHX_ OP* o)
|| family == OA_FILESTATOP
|| family == OA_LOOPEXOP
|| family == OA_METHOP
- /* I don't know why SASSIGN is tagged as OA_BASEOP - DAPM */
- || type == OP_SASSIGN
|| type == OP_CUSTOM
|| type == OP_NULL /* new_logop does this */
);
+ if (type == OP_SASSIGN) has_last = 0; /* XXX tmp hack for unary assign */
for (kid = cUNOPo->op_first; kid; kid = OpSIBLING(kid)) {
# ifdef PERL_OP_PARENT
@@ -5121,7 +5120,7 @@ Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
BINOP *binop;
ASSUME((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP
- || type == OP_SASSIGN || type == OP_NULL || type == OP_CUSTOM);
+ || type == OP_NULL || type == OP_CUSTOM);
NewOp(1101, binop, 1, BINOP);
@@ -10497,7 +10496,7 @@ OP *
Perl_ck_sassign(pTHX_ OP *o)
{
dVAR;
- OP * const kid = cLISTOPo->op_first;
+ OP * const kid = cBINOPo->op_first;
PERL_ARGS_ASSERT_CK_SASSIGN;