This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Merge branch 'blead' of ssh://perl5.git.perl.org/gitroot/perl into blead
[perl5.git] / op.c
CommitLineData
4b88f280 1#line 2 "op.c"
a0d0e21e 2/* op.c
79072805 3 *
1129b882
NC
4 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
5 * 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 by Larry Wall and others
79072805
LW
6 *
7 * You may distribute under the terms of either the GNU General Public
8 * License or the Artistic License, as specified in the README file.
9 *
a0d0e21e
LW
10 */
11
12/*
4ac71550
TC
13 * 'You see: Mr. Drogo, he married poor Miss Primula Brandybuck. She was
14 * our Mr. Bilbo's first cousin on the mother's side (her mother being the
15 * youngest of the Old Took's daughters); and Mr. Drogo was his second
16 * cousin. So Mr. Frodo is his first *and* second cousin, once removed
17 * either way, as the saying is, if you follow me.' --the Gaffer
18 *
19 * [p.23 of _The Lord of the Rings_, I/i: "A Long-Expected Party"]
79072805
LW
20 */
21
166f8a29
DM
22/* This file contains the functions that create, manipulate and optimize
23 * the OP structures that hold a compiled perl program.
24 *
25 * A Perl program is compiled into a tree of OPs. Each op contains
26 * structural pointers (eg to its siblings and the next op in the
27 * execution sequence), a pointer to the function that would execute the
28 * op, plus any data specific to that op. For example, an OP_CONST op
29 * points to the pp_const() function and to an SV containing the constant
30 * value. When pp_const() is executed, its job is to push that SV onto the
31 * stack.
32 *
33 * OPs are mainly created by the newFOO() functions, which are mainly
34 * called from the parser (in perly.y) as the code is parsed. For example
35 * the Perl code $a + $b * $c would cause the equivalent of the following
36 * to be called (oversimplifying a bit):
37 *
38 * newBINOP(OP_ADD, flags,
39 * newSVREF($a),
40 * newBINOP(OP_MULTIPLY, flags, newSVREF($b), newSVREF($c))
41 * )
42 *
43 * Note that during the build of miniperl, a temporary copy of this file
44 * is made, called opmini.c.
45 */
ccfc67b7 46
61b743bb
DM
47/*
48Perl's compiler is essentially a 3-pass compiler with interleaved phases:
49
50 A bottom-up pass
51 A top-down pass
52 An execution-order pass
53
54The bottom-up pass is represented by all the "newOP" routines and
55the ck_ routines. The bottom-upness is actually driven by yacc.
56So at the point that a ck_ routine fires, we have no idea what the
57context is, either upward in the syntax tree, or either forward or
58backward in the execution order. (The bottom-up parser builds that
59part of the execution order it knows about, but if you follow the "next"
60links around, you'll find it's actually a closed loop through the
ef9da979 61top level node.)
61b743bb
DM
62
63Whenever the bottom-up parser gets to a node that supplies context to
64its components, it invokes that portion of the top-down pass that applies
65to that part of the subtree (and marks the top node as processed, so
66if a node further up supplies context, it doesn't have to take the
67plunge again). As a particular subcase of this, as the new node is
68built, it takes all the closed execution loops of its subcomponents
69and links them into a new closed loop for the higher level node. But
70it's still not the real execution order.
71
72The actual execution order is not known till we get a grammar reduction
73to a top-level unit like a subroutine or file that will be called by
74"name" rather than via a "next" pointer. At that point, we can call
75into peep() to do that code's portion of the 3rd pass. It has to be
76recursive, but it's recursive on basic blocks, not on tree nodes.
77*/
78
06e0342d 79/* To implement user lexical pragmas, there needs to be a way at run time to
b3ca2e83
NC
80 get the compile time state of %^H for that block. Storing %^H in every
81 block (or even COP) would be very expensive, so a different approach is
82 taken. The (running) state of %^H is serialised into a tree of HE-like
83 structs. Stores into %^H are chained onto the current leaf as a struct
84 refcounted_he * with the key and the value. Deletes from %^H are saved
85 with a value of PL_sv_placeholder. The state of %^H at any point can be
86 turned back into a regular HV by walking back up the tree from that point's
06e0342d 87 leaf, ignoring any key you've already seen (placeholder or not), storing
b3ca2e83
NC
88 the rest into the HV structure, then removing the placeholders. Hence
89 memory is only used to store the %^H deltas from the enclosing COP, rather
90 than the entire %^H on each COP.
91
92 To cause actions on %^H to write out the serialisation records, it has
93 magic type 'H'. This magic (itself) does nothing, but its presence causes
94 the values to gain magic type 'h', which has entries for set and clear.
c28fe1ec 95 C<Perl_magic_sethint> updates C<PL_compiling.cop_hints_hash> with a store
34795b44 96 record, with deletes written by C<Perl_magic_clearhint>. C<SAVEHINTS>
c28fe1ec
NC
97 saves the current C<PL_compiling.cop_hints_hash> on the save stack, so that
98 it will be correctly restored when any inner compiling scope is exited.
b3ca2e83
NC
99*/
100
79072805 101#include "EXTERN.h"
864dbfa3 102#define PERL_IN_OP_C
79072805 103#include "perl.h"
77ca0c92 104#include "keywords.h"
79072805 105
a07e034d 106#define CALL_PEEP(o) CALL_FPTR(PL_peepp)(aTHX_ o)
f37b8c3f 107#define CALL_OPFREEHOOK(o) if (PL_opfreehook) CALL_FPTR(PL_opfreehook)(aTHX_ o)
a2efc822 108
238a4c30
NIS
109#if defined(PL_OP_SLAB_ALLOC)
110
f1fac472
NC
111#ifdef PERL_DEBUG_READONLY_OPS
112# define PERL_SLAB_SIZE 4096
113# include <sys/mman.h>
114#endif
115
238a4c30
NIS
116#ifndef PERL_SLAB_SIZE
117#define PERL_SLAB_SIZE 2048
118#endif
119
c7e45529 120void *
e91d68d5 121Perl_Slab_Alloc(pTHX_ size_t sz)
1c846c1f 122{
5186cc12 123 dVAR;
5a8e194f
NIS
124 /*
125 * To make incrementing use count easy PL_OpSlab is an I32 *
126 * To make inserting the link to slab PL_OpPtr is I32 **
127 * So compute size in units of sizeof(I32 *) as that is how Pl_OpPtr increments
128 * Add an overhead for pointer to slab and round up as a number of pointers
129 */
130 sz = (sz + 2*sizeof(I32 *) -1)/sizeof(I32 *);
238a4c30 131 if ((PL_OpSpace -= sz) < 0) {
f1fac472
NC
132#ifdef PERL_DEBUG_READONLY_OPS
133 /* We need to allocate chunk by chunk so that we can control the VM
134 mapping */
5186cc12 135 PL_OpPtr = (I32**) mmap(0, PERL_SLAB_SIZE*sizeof(I32*), PROT_READ|PROT_WRITE,
f1fac472
NC
136 MAP_ANON|MAP_PRIVATE, -1, 0);
137
138 DEBUG_m(PerlIO_printf(Perl_debug_log, "mapped %lu at %p\n",
139 (unsigned long) PERL_SLAB_SIZE*sizeof(I32*),
140 PL_OpPtr));
141 if(PL_OpPtr == MAP_FAILED) {
142 perror("mmap failed");
143 abort();
144 }
145#else
277e868c
NC
146
147 PL_OpPtr = (I32 **) PerlMemShared_calloc(PERL_SLAB_SIZE,sizeof(I32*));
f1fac472 148#endif
083fcd59 149 if (!PL_OpPtr) {
238a4c30
NIS
150 return NULL;
151 }
5a8e194f
NIS
152 /* We reserve the 0'th I32 sized chunk as a use count */
153 PL_OpSlab = (I32 *) PL_OpPtr;
154 /* Reduce size by the use count word, and by the size we need.
155 * Latter is to mimic the '-=' in the if() above
156 */
157 PL_OpSpace = PERL_SLAB_SIZE - (sizeof(I32)+sizeof(I32 **)-1)/sizeof(I32 **) - sz;
238a4c30
NIS
158 /* Allocation pointer starts at the top.
159 Theory: because we build leaves before trunk allocating at end
160 means that at run time access is cache friendly upward
161 */
5a8e194f 162 PL_OpPtr += PERL_SLAB_SIZE;
f1fac472
NC
163
164#ifdef PERL_DEBUG_READONLY_OPS
165 /* We remember this slab. */
166 /* This implementation isn't efficient, but it is simple. */
5186cc12 167 PL_slabs = (I32**) realloc(PL_slabs, sizeof(I32**) * (PL_slab_count + 1));
f1fac472
NC
168 PL_slabs[PL_slab_count++] = PL_OpSlab;
169 DEBUG_m(PerlIO_printf(Perl_debug_log, "Allocate %p\n", PL_OpSlab));
170#endif
238a4c30
NIS
171 }
172 assert( PL_OpSpace >= 0 );
173 /* Move the allocation pointer down */
174 PL_OpPtr -= sz;
5a8e194f 175 assert( PL_OpPtr > (I32 **) PL_OpSlab );
238a4c30
NIS
176 *PL_OpPtr = PL_OpSlab; /* Note which slab it belongs to */
177 (*PL_OpSlab)++; /* Increment use count of slab */
5a8e194f 178 assert( PL_OpPtr+sz <= ((I32 **) PL_OpSlab + PERL_SLAB_SIZE) );
238a4c30
NIS
179 assert( *PL_OpSlab > 0 );
180 return (void *)(PL_OpPtr + 1);
181}
182
f1fac472
NC
183#ifdef PERL_DEBUG_READONLY_OPS
184void
185Perl_pending_Slabs_to_ro(pTHX) {
186 /* Turn all the allocated op slabs read only. */
187 U32 count = PL_slab_count;
188 I32 **const slabs = PL_slabs;
189
190 /* Reset the array of pending OP slabs, as we're about to turn this lot
191 read only. Also, do it ahead of the loop in case the warn triggers,
192 and a warn handler has an eval */
193
f1fac472
NC
194 PL_slabs = NULL;
195 PL_slab_count = 0;
196
197 /* Force a new slab for any further allocation. */
198 PL_OpSpace = 0;
199
200 while (count--) {
5892a4d4 201 void *const start = slabs[count];
f1fac472
NC
202 const size_t size = PERL_SLAB_SIZE* sizeof(I32*);
203 if(mprotect(start, size, PROT_READ)) {
204 Perl_warn(aTHX_ "mprotect for %p %lu failed with %d",
205 start, (unsigned long) size, errno);
206 }
207 }
5892a4d4
NC
208
209 free(slabs);
f1fac472
NC
210}
211
212STATIC void
213S_Slab_to_rw(pTHX_ void *op)
214{
215 I32 * const * const ptr = (I32 **) op;
216 I32 * const slab = ptr[-1];
7918f24d
NC
217
218 PERL_ARGS_ASSERT_SLAB_TO_RW;
219
f1fac472
NC
220 assert( ptr-1 > (I32 **) slab );
221 assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
222 assert( *slab > 0 );
223 if(mprotect(slab, PERL_SLAB_SIZE*sizeof(I32*), PROT_READ|PROT_WRITE)) {
224 Perl_warn(aTHX_ "mprotect RW for %p %lu failed with %d",
225 slab, (unsigned long) PERL_SLAB_SIZE*sizeof(I32*), errno);
226 }
227}
fc97af9c
NC
228
229OP *
230Perl_op_refcnt_inc(pTHX_ OP *o)
231{
232 if(o) {
233 Slab_to_rw(o);
234 ++o->op_targ;
235 }
236 return o;
237
238}
239
240PADOFFSET
241Perl_op_refcnt_dec(pTHX_ OP *o)
242{
7918f24d 243 PERL_ARGS_ASSERT_OP_REFCNT_DEC;
fc97af9c
NC
244 Slab_to_rw(o);
245 return --o->op_targ;
246}
f1fac472
NC
247#else
248# define Slab_to_rw(op)
249#endif
250
c7e45529
AE
251void
252Perl_Slab_Free(pTHX_ void *op)
238a4c30 253{
551405c4 254 I32 * const * const ptr = (I32 **) op;
aec46f14 255 I32 * const slab = ptr[-1];
7918f24d 256 PERL_ARGS_ASSERT_SLAB_FREE;
5a8e194f
NIS
257 assert( ptr-1 > (I32 **) slab );
258 assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
238a4c30 259 assert( *slab > 0 );
f1fac472 260 Slab_to_rw(op);
238a4c30 261 if (--(*slab) == 0) {
7e4e8c89
NC
262# ifdef NETWARE
263# define PerlMemShared PerlMem
264# endif
083fcd59 265
f1fac472 266#ifdef PERL_DEBUG_READONLY_OPS
782a40f1 267 U32 count = PL_slab_count;
f1fac472 268 /* Need to remove this slab from our list of slabs */
782a40f1 269 if (count) {
f1fac472
NC
270 while (count--) {
271 if (PL_slabs[count] == slab) {
5186cc12 272 dVAR;
f1fac472
NC
273 /* Found it. Move the entry at the end to overwrite it. */
274 DEBUG_m(PerlIO_printf(Perl_debug_log,
275 "Deallocate %p by moving %p from %lu to %lu\n",
276 PL_OpSlab,
277 PL_slabs[PL_slab_count - 1],
278 PL_slab_count, count));
279 PL_slabs[count] = PL_slabs[--PL_slab_count];
280 /* Could realloc smaller at this point, but probably not
281 worth it. */
fc97af9c
NC
282 if(munmap(slab, PERL_SLAB_SIZE*sizeof(I32*))) {
283 perror("munmap failed");
284 abort();
285 }
286 break;
f1fac472 287 }
f1fac472
NC
288 }
289 }
290#else
083fcd59 291 PerlMemShared_free(slab);
f1fac472 292#endif
238a4c30
NIS
293 if (slab == PL_OpSlab) {
294 PL_OpSpace = 0;
295 }
296 }
b7dc083c 297}
b7dc083c 298#endif
e50aee73 299/*
ce6f1cbc 300 * In the following definition, the ", (OP*)0" is just to make the compiler
a5f75d66 301 * think the expression is of the right type: croak actually does a Siglongjmp.
e50aee73 302 */
11343788 303#define CHECKOP(type,o) \
ce6f1cbc 304 ((PL_op_mask && PL_op_mask[type]) \
5dc0d613 305 ? ( op_free((OP*)o), \
cb77fdf0 306 Perl_croak(aTHX_ "'%s' trapped by operation mask", PL_op_desc[type]), \
ce6f1cbc 307 (OP*)0 ) \
fc0dc3b3 308 : CALL_FPTR(PL_check[type])(aTHX_ (OP*)o))
e50aee73 309
e6438c1a 310#define RETURN_UNLIMITED_NUMBER (PERL_INT_MAX / 2)
c53d7c7d 311
8b6b16e7 312STATIC const char*
cea2e8a9 313S_gv_ename(pTHX_ GV *gv)
4633a7c4 314{
46c461b5 315 SV* const tmpsv = sv_newmortal();
7918f24d
NC
316
317 PERL_ARGS_ASSERT_GV_ENAME;
318
bd61b366 319 gv_efullname3(tmpsv, gv, NULL);
8b6b16e7 320 return SvPV_nolen_const(tmpsv);
4633a7c4
LW
321}
322
76e3520e 323STATIC OP *
cea2e8a9 324S_no_fh_allowed(pTHX_ OP *o)
79072805 325{
7918f24d
NC
326 PERL_ARGS_ASSERT_NO_FH_ALLOWED;
327
cea2e8a9 328 yyerror(Perl_form(aTHX_ "Missing comma after first argument to %s function",
53e06cf0 329 OP_DESC(o)));
11343788 330 return o;
79072805
LW
331}
332
76e3520e 333STATIC OP *
bfed75c6 334S_too_few_arguments(pTHX_ OP *o, const char *name)
79072805 335{
7918f24d
NC
336 PERL_ARGS_ASSERT_TOO_FEW_ARGUMENTS;
337
cea2e8a9 338 yyerror(Perl_form(aTHX_ "Not enough arguments for %s", name));
11343788 339 return o;
79072805
LW
340}
341
76e3520e 342STATIC OP *
bfed75c6 343S_too_many_arguments(pTHX_ OP *o, const char *name)
79072805 344{
7918f24d
NC
345 PERL_ARGS_ASSERT_TOO_MANY_ARGUMENTS;
346
cea2e8a9 347 yyerror(Perl_form(aTHX_ "Too many arguments for %s", name));
11343788 348 return o;
79072805
LW
349}
350
76e3520e 351STATIC void
6867be6d 352S_bad_type(pTHX_ I32 n, const char *t, const char *name, const OP *kid)
8990e307 353{
7918f24d
NC
354 PERL_ARGS_ASSERT_BAD_TYPE;
355
cea2e8a9 356 yyerror(Perl_form(aTHX_ "Type of arg %d to %s must be %s (not %s)",
53e06cf0 357 (int)n, name, t, OP_DESC(kid)));
8990e307
LW
358}
359
7a52d87a 360STATIC void
6867be6d 361S_no_bareword_allowed(pTHX_ const OP *o)
7a52d87a 362{
7918f24d
NC
363 PERL_ARGS_ASSERT_NO_BAREWORD_ALLOWED;
364
eb8433b7
NC
365 if (PL_madskills)
366 return; /* various ok barewords are hidden in extra OP_NULL */
5a844595 367 qerror(Perl_mess(aTHX_
35c1215d 368 "Bareword \"%"SVf"\" not allowed while \"strict subs\" in use",
be2597df 369 SVfARG(cSVOPo_sv)));
7a52d87a
GS
370}
371
79072805
LW
372/* "register" allocation */
373
374PADOFFSET
d6447115 375Perl_allocmy(pTHX_ const char *const name, const STRLEN len, const U32 flags)
93a17b20 376{
97aff369 377 dVAR;
a0d0e21e 378 PADOFFSET off;
12bd6ede 379 const bool is_our = (PL_parser->in_my == KEY_our);
a0d0e21e 380
7918f24d
NC
381 PERL_ARGS_ASSERT_ALLOCMY;
382
d6447115
NC
383 if (flags)
384 Perl_croak(aTHX_ "panic: allocmy illegal flag bits 0x%" UVxf,
385 (UV)flags);
386
387 /* Until we're using the length for real, cross check that we're being
388 told the truth. */
389 assert(strlen(name) == len);
390
59f00321 391 /* complain about "my $<special_var>" etc etc */
d6447115 392 if (len &&
3edf23ff 393 !(is_our ||
155aba94 394 isALPHA(name[1]) ||
39e02b42 395 (USE_UTF8_IN_NAMES && UTF8_IS_START(name[1])) ||
d6447115 396 (name[1] == '_' && (*name == '$' || len > 2))))
834a4ddd 397 {
6b58708b 398 /* name[2] is true if strlen(name) > 2 */
c4d0567e 399 if (!isPRINT(name[1]) || strchr("\t\n\r\f", name[1])) {
d6447115
NC
400 yyerror(Perl_form(aTHX_ "Can't use global %c^%c%.*s in \"%s\"",
401 name[0], toCTRL(name[1]), (int)(len - 2), name + 2,
aab6a793 402 PL_parser->in_my == KEY_state ? "state" : "my"));
d1544d85 403 } else {
d6447115 404 yyerror(Perl_form(aTHX_ "Can't use global %.*s in \"%s\"", (int) len, name,
aab6a793 405 PL_parser->in_my == KEY_state ? "state" : "my"));
46fc3d4c 406 }
a0d0e21e 407 }
748a9306 408
dd2155a4 409 /* allocate a spare slot and store the name in that slot */
93a17b20 410
cca43f78 411 off = pad_add_name(name, len,
59cfed7d
NC
412 is_our ? padadd_OUR :
413 PL_parser->in_my == KEY_state ? padadd_STATE : 0,
12bd6ede 414 PL_parser->in_my_stash,
3edf23ff 415 (is_our
133706a6
RGS
416 /* $_ is always in main::, even with our */
417 ? (PL_curstash && !strEQ(name,"$_") ? PL_curstash : PL_defstash)
5c284bb0 418 : NULL
cca43f78 419 )
dd2155a4 420 );
a74073ad
DM
421 /* anon sub prototypes contains state vars should always be cloned,
422 * otherwise the state var would be shared between anon subs */
423
424 if (PL_parser->in_my == KEY_state && CvANON(PL_compcv))
425 CvCLONE_on(PL_compcv);
426
dd2155a4 427 return off;
79072805
LW
428}
429
d2c837a0
DM
430/* free the body of an op without examining its contents.
431 * Always use this rather than FreeOp directly */
432
4136a0f7 433static void
d2c837a0
DM
434S_op_destroy(pTHX_ OP *o)
435{
436 if (o->op_latefree) {
437 o->op_latefreed = 1;
438 return;
439 }
440 FreeOp(o);
441}
442
c4bd3ae5
NC
443#ifdef USE_ITHREADS
444# define forget_pmop(a,b) S_forget_pmop(aTHX_ a,b)
445#else
446# define forget_pmop(a,b) S_forget_pmop(aTHX_ a)
447#endif
d2c837a0 448
79072805
LW
449/* Destructor */
450
451void
864dbfa3 452Perl_op_free(pTHX_ OP *o)
79072805 453{
27da23d5 454 dVAR;
acb36ea4 455 OPCODE type;
79072805 456
85594c31 457 if (!o)
79072805 458 return;
670f3923
DM
459 if (o->op_latefreed) {
460 if (o->op_latefree)
461 return;
462 goto do_free;
463 }
79072805 464
67566ccd 465 type = o->op_type;
7934575e 466 if (o->op_private & OPpREFCOUNTED) {
67566ccd 467 switch (type) {
7934575e
GS
468 case OP_LEAVESUB:
469 case OP_LEAVESUBLV:
470 case OP_LEAVEEVAL:
471 case OP_LEAVE:
472 case OP_SCOPE:
473 case OP_LEAVEWRITE:
67566ccd
AL
474 {
475 PADOFFSET refcnt;
7934575e 476 OP_REFCNT_LOCK;
4026c95a 477 refcnt = OpREFCNT_dec(o);
7934575e 478 OP_REFCNT_UNLOCK;
bfd0ff22
NC
479 if (refcnt) {
480 /* Need to find and remove any pattern match ops from the list
481 we maintain for reset(). */
482 find_and_forget_pmops(o);
4026c95a 483 return;
67566ccd 484 }
bfd0ff22 485 }
7934575e
GS
486 break;
487 default:
488 break;
489 }
490 }
491
f37b8c3f
VP
492 /* Call the op_free hook if it has been set. Do it now so that it's called
493 * at the right time for refcounted ops, but still before all of the kids
494 * are freed. */
495 CALL_OPFREEHOOK(o);
496
11343788 497 if (o->op_flags & OPf_KIDS) {
6867be6d 498 register OP *kid, *nextkid;
11343788 499 for (kid = cUNOPo->op_first; kid; kid = nextkid) {
85e6fe83 500 nextkid = kid->op_sibling; /* Get before next freeing kid */
79072805 501 op_free(kid);
85e6fe83 502 }
79072805 503 }
acb36ea4 504
fc97af9c
NC
505#ifdef PERL_DEBUG_READONLY_OPS
506 Slab_to_rw(o);
507#endif
508
acb36ea4
GS
509 /* COP* is not cleared by op_clear() so that we may track line
510 * numbers etc even after null() */
cc93af5f
RGS
511 if (type == OP_NEXTSTATE || type == OP_DBSTATE
512 || (type == OP_NULL /* the COP might have been null'ed */
513 && ((OPCODE)o->op_targ == OP_NEXTSTATE
514 || (OPCODE)o->op_targ == OP_DBSTATE))) {
acb36ea4 515 cop_free((COP*)o);
3235b7a3 516 }
acb36ea4 517
c53f1caa
RU
518 if (type == OP_NULL)
519 type = (OPCODE)o->op_targ;
520
acb36ea4 521 op_clear(o);
670f3923
DM
522 if (o->op_latefree) {
523 o->op_latefreed = 1;
524 return;
525 }
526 do_free:
238a4c30 527 FreeOp(o);
4d494880
DM
528#ifdef DEBUG_LEAKING_SCALARS
529 if (PL_op == o)
5f66b61c 530 PL_op = NULL;
4d494880 531#endif
acb36ea4 532}
79072805 533
93c66552
DM
534void
535Perl_op_clear(pTHX_ OP *o)
acb36ea4 536{
13137afc 537
27da23d5 538 dVAR;
7918f24d
NC
539
540 PERL_ARGS_ASSERT_OP_CLEAR;
541
eb8433b7
NC
542#ifdef PERL_MAD
543 /* if (o->op_madprop && o->op_madprop->mad_next)
544 abort(); */
3cc8d589
NC
545 /* FIXME for MAD - if I uncomment these two lines t/op/pack.t fails with
546 "modification of a read only value" for a reason I can't fathom why.
547 It's the "" stringification of $_, where $_ was set to '' in a foreach
04a4d38e
NC
548 loop, but it defies simplification into a small test case.
549 However, commenting them out has caused ext/List/Util/t/weak.t to fail
550 the last test. */
3cc8d589
NC
551 /*
552 mad_free(o->op_madprop);
553 o->op_madprop = 0;
554 */
eb8433b7
NC
555#endif
556
557 retry:
11343788 558 switch (o->op_type) {
acb36ea4 559 case OP_NULL: /* Was holding old type, if any. */
eb8433b7 560 if (PL_madskills && o->op_targ != OP_NULL) {
61a59f30 561 o->op_type = (Optype)o->op_targ;
eb8433b7
NC
562 o->op_targ = 0;
563 goto retry;
564 }
acb36ea4 565 case OP_ENTEREVAL: /* Was holding hints. */
acb36ea4 566 o->op_targ = 0;
a0d0e21e 567 break;
a6006777 568 default:
ac4c12e7 569 if (!(o->op_flags & OPf_REF)
0b94c7bb 570 || (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)))
a6006777 571 break;
572 /* FALL THROUGH */
463ee0b2 573 case OP_GVSV:
79072805 574 case OP_GV:
a6006777 575 case OP_AELEMFAST:
6a077020
DM
576 if (! (o->op_type == OP_AELEMFAST && o->op_flags & OPf_SPECIAL)) {
577 /* not an OP_PADAV replacement */
f7461760
Z
578 GV *gv = (o->op_type == OP_GV || o->op_type == OP_GVSV)
579#ifdef USE_ITHREADS
580 && PL_curpad
581#endif
582 ? cGVOPo_gv : NULL;
b327b36f
NC
583 /* It's possible during global destruction that the GV is freed
584 before the optree. Whilst the SvREFCNT_inc is happy to bump from
585 0 to 1 on a freed SV, the corresponding SvREFCNT_dec from 1 to 0
586 will trigger an assertion failure, because the entry to sv_clear
587 checks that the scalar is not already freed. A check of for
588 !SvIS_FREED(gv) turns out to be invalid, because during global
589 destruction the reference count can be forced down to zero
590 (with SVf_BREAK set). In which case raising to 1 and then
591 dropping to 0 triggers cleanup before it should happen. I
592 *think* that this might actually be a general, systematic,
593 weakness of the whole idea of SVf_BREAK, in that code *is*
594 allowed to raise and lower references during global destruction,
595 so any *valid* code that happens to do this during global
596 destruction might well trigger premature cleanup. */
597 bool still_valid = gv && SvREFCNT(gv);
598
599 if (still_valid)
600 SvREFCNT_inc_simple_void(gv);
350de78d 601#ifdef USE_ITHREADS
6a077020
DM
602 if (cPADOPo->op_padix > 0) {
603 /* No GvIN_PAD_off(cGVOPo_gv) here, because other references
604 * may still exist on the pad */
605 pad_swipe(cPADOPo->op_padix, TRUE);
606 cPADOPo->op_padix = 0;
607 }
350de78d 608#else
6a077020 609 SvREFCNT_dec(cSVOPo->op_sv);
a0714e2c 610 cSVOPo->op_sv = NULL;
350de78d 611#endif
b327b36f 612 if (still_valid) {
f7461760
Z
613 int try_downgrade = SvREFCNT(gv) == 2;
614 SvREFCNT_dec(gv);
615 if (try_downgrade)
616 gv_try_downgrade(gv);
617 }
6a077020 618 }
79072805 619 break;
a1ae71d2 620 case OP_METHOD_NAMED:
79072805 621 case OP_CONST:
996c9baa 622 case OP_HINTSEVAL:
11343788 623 SvREFCNT_dec(cSVOPo->op_sv);
a0714e2c 624 cSVOPo->op_sv = NULL;
3b1c21fa
AB
625#ifdef USE_ITHREADS
626 /** Bug #15654
627 Even if op_clear does a pad_free for the target of the op,
6a077020 628 pad_free doesn't actually remove the sv that exists in the pad;
3b1c21fa
AB
629 instead it lives on. This results in that it could be reused as
630 a target later on when the pad was reallocated.
631 **/
632 if(o->op_targ) {
633 pad_swipe(o->op_targ,1);
634 o->op_targ = 0;
635 }
636#endif
79072805 637 break;
748a9306
LW
638 case OP_GOTO:
639 case OP_NEXT:
640 case OP_LAST:
641 case OP_REDO:
11343788 642 if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
748a9306
LW
643 break;
644 /* FALL THROUGH */
a0d0e21e 645 case OP_TRANS:
acb36ea4 646 if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
043e41b8
DM
647#ifdef USE_ITHREADS
648 if (cPADOPo->op_padix > 0) {
649 pad_swipe(cPADOPo->op_padix, TRUE);
650 cPADOPo->op_padix = 0;
651 }
652#else
a0ed51b3 653 SvREFCNT_dec(cSVOPo->op_sv);
a0714e2c 654 cSVOPo->op_sv = NULL;
043e41b8 655#endif
acb36ea4
GS
656 }
657 else {
ea71c68d 658 PerlMemShared_free(cPVOPo->op_pv);
bd61b366 659 cPVOPo->op_pv = NULL;
acb36ea4 660 }
a0d0e21e
LW
661 break;
662 case OP_SUBST:
20e98b0f 663 op_free(cPMOPo->op_pmreplrootu.op_pmreplroot);
971a9dd3 664 goto clear_pmop;
748a9306 665 case OP_PUSHRE:
971a9dd3 666#ifdef USE_ITHREADS
20e98b0f 667 if (cPMOPo->op_pmreplrootu.op_pmtargetoff) {
dd2155a4
DM
668 /* No GvIN_PAD_off here, because other references may still
669 * exist on the pad */
20e98b0f 670 pad_swipe(cPMOPo->op_pmreplrootu.op_pmtargetoff, TRUE);
971a9dd3
GS
671 }
672#else
ad64d0ec 673 SvREFCNT_dec(MUTABLE_SV(cPMOPo->op_pmreplrootu.op_pmtargetgv));
971a9dd3
GS
674#endif
675 /* FALL THROUGH */
a0d0e21e 676 case OP_MATCH:
8782bef2 677 case OP_QR:
971a9dd3 678clear_pmop:
c2b1997a 679 forget_pmop(cPMOPo, 1);
20e98b0f 680 cPMOPo->op_pmreplrootu.op_pmreplroot = NULL;
9cddf794
NC
681 /* we use the same protection as the "SAFE" version of the PM_ macros
682 * here since sv_clean_all might release some PMOPs
5f8cb046
DM
683 * after PL_regex_padav has been cleared
684 * and the clearing of PL_regex_padav needs to
685 * happen before sv_clean_all
686 */
13137afc
AB
687#ifdef USE_ITHREADS
688 if(PL_regex_pad) { /* We could be in destruction */
402d2eb1 689 const IV offset = (cPMOPo)->op_pmoffset;
9cddf794 690 ReREFCNT_dec(PM_GETRE(cPMOPo));
402d2eb1
NC
691 PL_regex_pad[offset] = &PL_sv_undef;
692 sv_catpvn_nomg(PL_regex_pad[0], (const char *)&offset,
693 sizeof(offset));
13137afc 694 }
9cddf794
NC
695#else
696 ReREFCNT_dec(PM_GETRE(cPMOPo));
697 PM_SETRE(cPMOPo, NULL);
1eb1540c 698#endif
13137afc 699
a0d0e21e 700 break;
79072805
LW
701 }
702
743e66e6 703 if (o->op_targ > 0) {
11343788 704 pad_free(o->op_targ);
743e66e6
GS
705 o->op_targ = 0;
706 }
79072805
LW
707}
708
76e3520e 709STATIC void
3eb57f73
HS
710S_cop_free(pTHX_ COP* cop)
711{
7918f24d
NC
712 PERL_ARGS_ASSERT_COP_FREE;
713
05ec9bb3
NIS
714 CopFILE_free(cop);
715 CopSTASH_free(cop);
0453d815 716 if (! specialWARN(cop->cop_warnings))
72dc9ed5 717 PerlMemShared_free(cop->cop_warnings);
c28fe1ec 718 Perl_refcounted_he_free(aTHX_ cop->cop_hints_hash);
3eb57f73
HS
719}
720
c2b1997a 721STATIC void
c4bd3ae5
NC
722S_forget_pmop(pTHX_ PMOP *const o
723#ifdef USE_ITHREADS
724 , U32 flags
725#endif
726 )
c2b1997a
NC
727{
728 HV * const pmstash = PmopSTASH(o);
7918f24d
NC
729
730 PERL_ARGS_ASSERT_FORGET_PMOP;
731
c2b1997a 732 if (pmstash && !SvIS_FREED(pmstash)) {
ad64d0ec 733 MAGIC * const mg = mg_find((const SV *)pmstash, PERL_MAGIC_symtab);
c2b1997a
NC
734 if (mg) {
735 PMOP **const array = (PMOP**) mg->mg_ptr;
736 U32 count = mg->mg_len / sizeof(PMOP**);
737 U32 i = count;
738
739 while (i--) {
740 if (array[i] == o) {
741 /* Found it. Move the entry at the end to overwrite it. */
742 array[i] = array[--count];
743 mg->mg_len = count * sizeof(PMOP**);
744 /* Could realloc smaller at this point always, but probably
745 not worth it. Probably worth free()ing if we're the
746 last. */
747 if(!count) {
748 Safefree(mg->mg_ptr);
749 mg->mg_ptr = NULL;
750 }
751 break;
752 }
753 }
754 }
755 }
1cdf7faf
NC
756 if (PL_curpm == o)
757 PL_curpm = NULL;
c4bd3ae5 758#ifdef USE_ITHREADS
c2b1997a
NC
759 if (flags)
760 PmopSTASH_free(o);
c4bd3ae5 761#endif
c2b1997a
NC
762}
763
bfd0ff22
NC
764STATIC void
765S_find_and_forget_pmops(pTHX_ OP *o)
766{
7918f24d
NC
767 PERL_ARGS_ASSERT_FIND_AND_FORGET_PMOPS;
768
bfd0ff22
NC
769 if (o->op_flags & OPf_KIDS) {
770 OP *kid = cUNOPo->op_first;
771 while (kid) {
772 switch (kid->op_type) {
773 case OP_SUBST:
774 case OP_PUSHRE:
775 case OP_MATCH:
776 case OP_QR:
777 forget_pmop((PMOP*)kid, 0);
778 }
779 find_and_forget_pmops(kid);
780 kid = kid->op_sibling;
781 }
782 }
783}
784
93c66552
DM
785void
786Perl_op_null(pTHX_ OP *o)
8990e307 787{
27da23d5 788 dVAR;
7918f24d
NC
789
790 PERL_ARGS_ASSERT_OP_NULL;
791
acb36ea4
GS
792 if (o->op_type == OP_NULL)
793 return;
eb8433b7
NC
794 if (!PL_madskills)
795 op_clear(o);
11343788
MB
796 o->op_targ = o->op_type;
797 o->op_type = OP_NULL;
22c35a8c 798 o->op_ppaddr = PL_ppaddr[OP_NULL];
8990e307
LW
799}
800
4026c95a
SH
801void
802Perl_op_refcnt_lock(pTHX)
803{
27da23d5 804 dVAR;
96a5add6 805 PERL_UNUSED_CONTEXT;
4026c95a
SH
806 OP_REFCNT_LOCK;
807}
808
809void
810Perl_op_refcnt_unlock(pTHX)
811{
27da23d5 812 dVAR;
96a5add6 813 PERL_UNUSED_CONTEXT;
4026c95a
SH
814 OP_REFCNT_UNLOCK;
815}
816
79072805
LW
817/* Contextualizers */
818
463ee0b2 819#define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o))
79072805 820
1f676739 821static OP *
12e93c28 822S_linklist(pTHX_ OP *o)
79072805 823{
3edf23ff 824 OP *first;
79072805 825
7918f24d
NC
826 PERL_ARGS_ASSERT_LINKLIST;
827
11343788
MB
828 if (o->op_next)
829 return o->op_next;
79072805
LW
830
831 /* establish postfix order */
3edf23ff
AL
832 first = cUNOPo->op_first;
833 if (first) {
6867be6d 834 register OP *kid;
3edf23ff
AL
835 o->op_next = LINKLIST(first);
836 kid = first;
837 for (;;) {
838 if (kid->op_sibling) {
79072805 839 kid->op_next = LINKLIST(kid->op_sibling);
3edf23ff
AL
840 kid = kid->op_sibling;
841 } else {
11343788 842 kid->op_next = o;
3edf23ff
AL
843 break;
844 }
79072805
LW
845 }
846 }
847 else
11343788 848 o->op_next = o;
79072805 849
11343788 850 return o->op_next;
79072805
LW
851}
852
1f676739 853static OP *
2dd5337b 854S_scalarkids(pTHX_ OP *o)
79072805 855{
11343788 856 if (o && o->op_flags & OPf_KIDS) {
bfed75c6 857 OP *kid;
11343788 858 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
859 scalar(kid);
860 }
11343788 861 return o;
79072805
LW
862}
863
76e3520e 864STATIC OP *
cea2e8a9 865S_scalarboolean(pTHX_ OP *o)
8990e307 866{
97aff369 867 dVAR;
7918f24d
NC
868
869 PERL_ARGS_ASSERT_SCALARBOOLEAN;
870
d008e5eb 871 if (o->op_type == OP_SASSIGN && cBINOPo->op_first->op_type == OP_CONST) {
d008e5eb 872 if (ckWARN(WARN_SYNTAX)) {
6867be6d 873 const line_t oldline = CopLINE(PL_curcop);
a0d0e21e 874
53a7735b
DM
875 if (PL_parser && PL_parser->copline != NOLINE)
876 CopLINE_set(PL_curcop, PL_parser->copline);
9014280d 877 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Found = in conditional, should be ==");
57843af0 878 CopLINE_set(PL_curcop, oldline);
d008e5eb 879 }
a0d0e21e 880 }
11343788 881 return scalar(o);
8990e307
LW
882}
883
884OP *
864dbfa3 885Perl_scalar(pTHX_ OP *o)
79072805 886{
27da23d5 887 dVAR;
79072805
LW
888 OP *kid;
889
a0d0e21e 890 /* assumes no premature commitment */
13765c85
DM
891 if (!o || (PL_parser && PL_parser->error_count)
892 || (o->op_flags & OPf_WANT)
5dc0d613 893 || o->op_type == OP_RETURN)
7e363e51 894 {
11343788 895 return o;
7e363e51 896 }
79072805 897
5dc0d613 898 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_SCALAR;
79072805 899
11343788 900 switch (o->op_type) {
79072805 901 case OP_REPEAT:
11343788 902 scalar(cBINOPo->op_first);
8990e307 903 break;
79072805
LW
904 case OP_OR:
905 case OP_AND:
906 case OP_COND_EXPR:
11343788 907 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
8990e307 908 scalar(kid);
79072805 909 break;
a0d0e21e 910 /* FALL THROUGH */
a6d8037e 911 case OP_SPLIT:
79072805 912 case OP_MATCH:
8782bef2 913 case OP_QR:
79072805
LW
914 case OP_SUBST:
915 case OP_NULL:
8990e307 916 default:
11343788
MB
917 if (o->op_flags & OPf_KIDS) {
918 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
8990e307
LW
919 scalar(kid);
920 }
79072805
LW
921 break;
922 case OP_LEAVE:
923 case OP_LEAVETRY:
5dc0d613 924 kid = cLISTOPo->op_first;
54310121 925 scalar(kid);
155aba94 926 while ((kid = kid->op_sibling)) {
54310121 927 if (kid->op_sibling)
928 scalarvoid(kid);
929 else
930 scalar(kid);
931 }
11206fdd 932 PL_curcop = &PL_compiling;
54310121 933 break;
748a9306 934 case OP_SCOPE:
79072805 935 case OP_LINESEQ:
8990e307 936 case OP_LIST:
11343788 937 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
79072805
LW
938 if (kid->op_sibling)
939 scalarvoid(kid);
940 else
941 scalar(kid);
942 }
11206fdd 943 PL_curcop = &PL_compiling;
79072805 944 break;
a801c63c 945 case OP_SORT:
a2a5de95 946 Perl_ck_warner(aTHX_ packWARN(WARN_VOID), "Useless use of sort in scalar context");
553e7bb0 947 break;
79072805 948 }
11343788 949 return o;
79072805
LW
950}
951
952OP *
864dbfa3 953Perl_scalarvoid(pTHX_ OP *o)
79072805 954{
27da23d5 955 dVAR;
79072805 956 OP *kid;
c445ea15 957 const char* useless = NULL;
8990e307 958 SV* sv;
2ebea0a1
GS
959 U8 want;
960
7918f24d
NC
961 PERL_ARGS_ASSERT_SCALARVOID;
962
eb8433b7
NC
963 /* trailing mad null ops don't count as "there" for void processing */
964 if (PL_madskills &&
965 o->op_type != OP_NULL &&
966 o->op_sibling &&
967 o->op_sibling->op_type == OP_NULL)
968 {
969 OP *sib;
970 for (sib = o->op_sibling;
971 sib && sib->op_type == OP_NULL;
972 sib = sib->op_sibling) ;
973
974 if (!sib)
975 return o;
976 }
977
acb36ea4 978 if (o->op_type == OP_NEXTSTATE
acb36ea4
GS
979 || o->op_type == OP_DBSTATE
980 || (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
acb36ea4 981 || o->op_targ == OP_DBSTATE)))
2ebea0a1 982 PL_curcop = (COP*)o; /* for warning below */
79072805 983
54310121 984 /* assumes no premature commitment */
2ebea0a1 985 want = o->op_flags & OPf_WANT;
13765c85
DM
986 if ((want && want != OPf_WANT_SCALAR)
987 || (PL_parser && PL_parser->error_count)
5dc0d613 988 || o->op_type == OP_RETURN)
7e363e51 989 {
11343788 990 return o;
7e363e51 991 }
79072805 992
b162f9ea 993 if ((o->op_private & OPpTARGET_MY)
7e363e51
GS
994 && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
995 {
b162f9ea 996 return scalar(o); /* As if inside SASSIGN */
7e363e51 997 }
1c846c1f 998
5dc0d613 999 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
79072805 1000
11343788 1001 switch (o->op_type) {
79072805 1002 default:
22c35a8c 1003 if (!(PL_opargs[o->op_type] & OA_FOLDCONST))
8990e307 1004 break;
36477c24 1005 /* FALL THROUGH */
1006 case OP_REPEAT:
11343788 1007 if (o->op_flags & OPf_STACKED)
8990e307 1008 break;
5d82c453
GA
1009 goto func_ops;
1010 case OP_SUBSTR:
1011 if (o->op_private == 4)
1012 break;
8990e307
LW
1013 /* FALL THROUGH */
1014 case OP_GVSV:
1015 case OP_WANTARRAY:
1016 case OP_GV:
74295f0b 1017 case OP_SMARTMATCH:
8990e307
LW
1018 case OP_PADSV:
1019 case OP_PADAV:
1020 case OP_PADHV:
1021 case OP_PADANY:
1022 case OP_AV2ARYLEN:
8990e307 1023 case OP_REF:
a0d0e21e
LW
1024 case OP_REFGEN:
1025 case OP_SREFGEN:
8990e307
LW
1026 case OP_DEFINED:
1027 case OP_HEX:
1028 case OP_OCT:
1029 case OP_LENGTH:
8990e307
LW
1030 case OP_VEC:
1031 case OP_INDEX:
1032 case OP_RINDEX:
1033 case OP_SPRINTF:
1034 case OP_AELEM:
1035 case OP_AELEMFAST:
1036 case OP_ASLICE:
8990e307
LW
1037 case OP_HELEM:
1038 case OP_HSLICE:
1039 case OP_UNPACK:
1040 case OP_PACK:
8990e307
LW
1041 case OP_JOIN:
1042 case OP_LSLICE:
1043 case OP_ANONLIST:
1044 case OP_ANONHASH:
1045 case OP_SORT:
1046 case OP_REVERSE:
1047 case OP_RANGE:
1048 case OP_FLIP:
1049 case OP_FLOP:
1050 case OP_CALLER:
1051 case OP_FILENO:
1052 case OP_EOF:
1053 case OP_TELL:
1054 case OP_GETSOCKNAME:
1055 case OP_GETPEERNAME:
1056 case OP_READLINK:
1057 case OP_TELLDIR:
1058 case OP_GETPPID:
1059 case OP_GETPGRP:
1060 case OP_GETPRIORITY:
1061 case OP_TIME:
1062 case OP_TMS:
1063 case OP_LOCALTIME:
1064 case OP_GMTIME:
1065 case OP_GHBYNAME:
1066 case OP_GHBYADDR:
1067 case OP_GHOSTENT:
1068 case OP_GNBYNAME:
1069 case OP_GNBYADDR:
1070 case OP_GNETENT:
1071 case OP_GPBYNAME:
1072 case OP_GPBYNUMBER:
1073 case OP_GPROTOENT:
1074 case OP_GSBYNAME:
1075 case OP_GSBYPORT:
1076 case OP_GSERVENT:
1077 case OP_GPWNAM:
1078 case OP_GPWUID:
1079 case OP_GGRNAM:
1080 case OP_GGRGID:
1081 case OP_GETLOGIN:
78e1b766 1082 case OP_PROTOTYPE:
5d82c453 1083 func_ops:
64aac5a9 1084 if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)))
74295f0b 1085 /* Otherwise it's "Useless use of grep iterator" */
f5df4782 1086 useless = OP_DESC(o);
8990e307
LW
1087 break;
1088
9f82cd5f
YST
1089 case OP_NOT:
1090 kid = cUNOPo->op_first;
1091 if (kid->op_type != OP_MATCH && kid->op_type != OP_SUBST &&
1092 kid->op_type != OP_TRANS) {
1093 goto func_ops;
1094 }
1095 useless = "negative pattern binding (!~)";
1096 break;
1097
8990e307
LW
1098 case OP_RV2GV:
1099 case OP_RV2SV:
1100 case OP_RV2AV:
1101 case OP_RV2HV:
192587c2 1102 if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)) &&
11343788 1103 (!o->op_sibling || o->op_sibling->op_type != OP_READLINE))
8990e307
LW
1104 useless = "a variable";
1105 break;
79072805
LW
1106
1107 case OP_CONST:
7766f137 1108 sv = cSVOPo_sv;
7a52d87a
GS
1109 if (cSVOPo->op_private & OPpCONST_STRICT)
1110 no_bareword_allowed(o);
1111 else {
d008e5eb 1112 if (ckWARN(WARN_VOID)) {
fa01e093
RGS
1113 if (SvOK(sv)) {
1114 SV* msv = sv_2mortal(Perl_newSVpvf(aTHX_
1115 "a constant (%"SVf")", sv));
1116 useless = SvPV_nolen(msv);
1117 }
1118 else
1119 useless = "a constant (undef)";
2e0ae2d3 1120 if (o->op_private & OPpCONST_ARYBASE)
d4c19fe8 1121 useless = NULL;
e7fec78e 1122 /* don't warn on optimised away booleans, eg
b5a930ec 1123 * use constant Foo, 5; Foo || print; */
e7fec78e 1124 if (cSVOPo->op_private & OPpCONST_SHORTCIRCUIT)
d4c19fe8 1125 useless = NULL;
960b4253
MG
1126 /* the constants 0 and 1 are permitted as they are
1127 conventionally used as dummies in constructs like
1128 1 while some_condition_with_side_effects; */
e7fec78e 1129 else if (SvNIOK(sv) && (SvNV(sv) == 0.0 || SvNV(sv) == 1.0))
d4c19fe8 1130 useless = NULL;
d008e5eb 1131 else if (SvPOK(sv)) {
a52fe3ac
A
1132 /* perl4's way of mixing documentation and code
1133 (before the invention of POD) was based on a
1134 trick to mix nroff and perl code. The trick was
1135 built upon these three nroff macros being used in
1136 void context. The pink camel has the details in
1137 the script wrapman near page 319. */
6136c704
AL
1138 const char * const maybe_macro = SvPVX_const(sv);
1139 if (strnEQ(maybe_macro, "di", 2) ||
1140 strnEQ(maybe_macro, "ds", 2) ||
1141 strnEQ(maybe_macro, "ig", 2))
d4c19fe8 1142 useless = NULL;
d008e5eb 1143 }
8990e307
LW
1144 }
1145 }
93c66552 1146 op_null(o); /* don't execute or even remember it */
79072805
LW
1147 break;
1148
1149 case OP_POSTINC:
11343788 1150 o->op_type = OP_PREINC; /* pre-increment is faster */
22c35a8c 1151 o->op_ppaddr = PL_ppaddr[OP_PREINC];
79072805
LW
1152 break;
1153
1154 case OP_POSTDEC:
11343788 1155 o->op_type = OP_PREDEC; /* pre-decrement is faster */
22c35a8c 1156 o->op_ppaddr = PL_ppaddr[OP_PREDEC];
79072805
LW
1157 break;
1158
679d6c4e
HS
1159 case OP_I_POSTINC:
1160 o->op_type = OP_I_PREINC; /* pre-increment is faster */
1161 o->op_ppaddr = PL_ppaddr[OP_I_PREINC];
1162 break;
1163
1164 case OP_I_POSTDEC:
1165 o->op_type = OP_I_PREDEC; /* pre-decrement is faster */
1166 o->op_ppaddr = PL_ppaddr[OP_I_PREDEC];
1167 break;
1168
79072805
LW
1169 case OP_OR:
1170 case OP_AND:
edbe35ea
VP
1171 kid = cLOGOPo->op_first;
1172 if (kid->op_type == OP_NOT
1173 && (kid->op_flags & OPf_KIDS)
1174 && !PL_madskills) {
1175 if (o->op_type == OP_AND) {
1176 o->op_type = OP_OR;
1177 o->op_ppaddr = PL_ppaddr[OP_OR];
1178 } else {
1179 o->op_type = OP_AND;
1180 o->op_ppaddr = PL_ppaddr[OP_AND];
1181 }
1182 op_null(kid);
1183 }
1184
c963b151 1185 case OP_DOR:
79072805 1186 case OP_COND_EXPR:
0d863452
RH
1187 case OP_ENTERGIVEN:
1188 case OP_ENTERWHEN:
11343788 1189 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
79072805
LW
1190 scalarvoid(kid);
1191 break;
5aabfad6 1192
a0d0e21e 1193 case OP_NULL:
11343788 1194 if (o->op_flags & OPf_STACKED)
a0d0e21e 1195 break;
5aabfad6 1196 /* FALL THROUGH */
2ebea0a1
GS
1197 case OP_NEXTSTATE:
1198 case OP_DBSTATE:
79072805
LW
1199 case OP_ENTERTRY:
1200 case OP_ENTER:
11343788 1201 if (!(o->op_flags & OPf_KIDS))
79072805 1202 break;
54310121 1203 /* FALL THROUGH */
463ee0b2 1204 case OP_SCOPE:
79072805
LW
1205 case OP_LEAVE:
1206 case OP_LEAVETRY:
a0d0e21e 1207 case OP_LEAVELOOP:
79072805 1208 case OP_LINESEQ:
79072805 1209 case OP_LIST:
0d863452
RH
1210 case OP_LEAVEGIVEN:
1211 case OP_LEAVEWHEN:
11343788 1212 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
1213 scalarvoid(kid);
1214 break;
c90c0ff4 1215 case OP_ENTEREVAL:
5196be3e 1216 scalarkids(o);
c90c0ff4 1217 break;
5aabfad6 1218 case OP_REQUIRE:
c90c0ff4 1219 /* all requires must return a boolean value */
5196be3e 1220 o->op_flags &= ~OPf_WANT;
d6483035
GS
1221 /* FALL THROUGH */
1222 case OP_SCALAR:
5196be3e 1223 return scalar(o);
79072805 1224 }
a2a5de95
NC
1225 if (useless)
1226 Perl_ck_warner(aTHX_ packWARN(WARN_VOID), "Useless use of %s in void context", useless);
11343788 1227 return o;
79072805
LW
1228}
1229
1f676739 1230static OP *
412da003 1231S_listkids(pTHX_ OP *o)
79072805 1232{
11343788 1233 if (o && o->op_flags & OPf_KIDS) {
6867be6d 1234 OP *kid;
11343788 1235 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
1236 list(kid);
1237 }
11343788 1238 return o;
79072805
LW
1239}
1240
1241OP *
864dbfa3 1242Perl_list(pTHX_ OP *o)
79072805 1243{
27da23d5 1244 dVAR;
79072805
LW
1245 OP *kid;
1246
a0d0e21e 1247 /* assumes no premature commitment */
13765c85
DM
1248 if (!o || (o->op_flags & OPf_WANT)
1249 || (PL_parser && PL_parser->error_count)
5dc0d613 1250 || o->op_type == OP_RETURN)
7e363e51 1251 {
11343788 1252 return o;
7e363e51 1253 }
79072805 1254
b162f9ea 1255 if ((o->op_private & OPpTARGET_MY)
7e363e51
GS
1256 && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
1257 {
b162f9ea 1258 return o; /* As if inside SASSIGN */
7e363e51 1259 }
1c846c1f 1260
5dc0d613 1261 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
79072805 1262
11343788 1263 switch (o->op_type) {
79072805
LW
1264 case OP_FLOP:
1265 case OP_REPEAT:
11343788 1266 list(cBINOPo->op_first);
79072805
LW
1267 break;
1268 case OP_OR:
1269 case OP_AND:
1270 case OP_COND_EXPR:
11343788 1271 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
79072805
LW
1272 list(kid);
1273 break;
1274 default:
1275 case OP_MATCH:
8782bef2 1276 case OP_QR:
79072805
LW
1277 case OP_SUBST:
1278 case OP_NULL:
11343788 1279 if (!(o->op_flags & OPf_KIDS))
79072805 1280 break;
11343788
MB
1281 if (!o->op_next && cUNOPo->op_first->op_type == OP_FLOP) {
1282 list(cBINOPo->op_first);
1283 return gen_constant_list(o);
79072805
LW
1284 }
1285 case OP_LIST:
11343788 1286 listkids(o);
79072805
LW
1287 break;
1288 case OP_LEAVE:
1289 case OP_LEAVETRY:
5dc0d613 1290 kid = cLISTOPo->op_first;
54310121 1291 list(kid);
155aba94 1292 while ((kid = kid->op_sibling)) {
54310121 1293 if (kid->op_sibling)
1294 scalarvoid(kid);
1295 else
1296 list(kid);
1297 }
11206fdd 1298 PL_curcop = &PL_compiling;
54310121 1299 break;
748a9306 1300 case OP_SCOPE:
79072805 1301 case OP_LINESEQ:
11343788 1302 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
79072805
LW
1303 if (kid->op_sibling)
1304 scalarvoid(kid);
1305 else
1306 list(kid);
1307 }
11206fdd 1308 PL_curcop = &PL_compiling;
79072805 1309 break;
c90c0ff4 1310 case OP_REQUIRE:
1311 /* all requires must return a boolean value */
5196be3e
MB
1312 o->op_flags &= ~OPf_WANT;
1313 return scalar(o);
79072805 1314 }
11343788 1315 return o;
79072805
LW
1316}
1317
1f676739 1318static OP *
2dd5337b 1319S_scalarseq(pTHX_ OP *o)
79072805 1320{
97aff369 1321 dVAR;
11343788 1322 if (o) {
1496a290
AL
1323 const OPCODE type = o->op_type;
1324
1325 if (type == OP_LINESEQ || type == OP_SCOPE ||
1326 type == OP_LEAVE || type == OP_LEAVETRY)
463ee0b2 1327 {
6867be6d 1328 OP *kid;
11343788 1329 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
ed6116ce 1330 if (kid->op_sibling) {
463ee0b2 1331 scalarvoid(kid);
ed6116ce 1332 }
463ee0b2 1333 }
3280af22 1334 PL_curcop = &PL_compiling;
79072805 1335 }
11343788 1336 o->op_flags &= ~OPf_PARENS;
3280af22 1337 if (PL_hints & HINT_BLOCK_SCOPE)
11343788 1338 o->op_flags |= OPf_PARENS;
79072805 1339 }
8990e307 1340 else
11343788
MB
1341 o = newOP(OP_STUB, 0);
1342 return o;
79072805
LW
1343}
1344
76e3520e 1345STATIC OP *
cea2e8a9 1346S_modkids(pTHX_ OP *o, I32 type)
79072805 1347{
11343788 1348 if (o && o->op_flags & OPf_KIDS) {
6867be6d 1349 OP *kid;
11343788 1350 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2 1351 mod(kid, type);
79072805 1352 }
11343788 1353 return o;
79072805
LW
1354}
1355
ff7298cb 1356/* Propagate lvalue ("modifiable") context to an op and its children.
ddeae0f1
DM
1357 * 'type' represents the context type, roughly based on the type of op that
1358 * would do the modifying, although local() is represented by OP_NULL.
1359 * It's responsible for detecting things that can't be modified, flag
1360 * things that need to behave specially in an lvalue context (e.g., "$$x = 5"
1361 * might have to vivify a reference in $x), and so on.
1362 *
1363 * For example, "$a+1 = 2" would cause mod() to be called with o being
1364 * OP_ADD and type being OP_SASSIGN, and would output an error.
1365 */
1366
79072805 1367OP *
864dbfa3 1368Perl_mod(pTHX_ OP *o, I32 type)
79072805 1369{
27da23d5 1370 dVAR;
79072805 1371 OP *kid;
ddeae0f1
DM
1372 /* -1 = error on localize, 0 = ignore localize, 1 = ok to localize */
1373 int localize = -1;
79072805 1374
13765c85 1375 if (!o || (PL_parser && PL_parser->error_count))
11343788 1376 return o;
79072805 1377
b162f9ea 1378 if ((o->op_private & OPpTARGET_MY)
7e363e51
GS
1379 && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
1380 {
b162f9ea 1381 return o;
7e363e51 1382 }
1c846c1f 1383
11343788 1384 switch (o->op_type) {
68dc0745 1385 case OP_UNDEF:
ddeae0f1 1386 localize = 0;
3280af22 1387 PL_modcount++;
5dc0d613 1388 return o;
a0d0e21e 1389 case OP_CONST:
2e0ae2d3 1390 if (!(o->op_private & OPpCONST_ARYBASE))
a0d0e21e 1391 goto nomod;
54dc0f91 1392 localize = 0;
3280af22 1393 if (PL_eval_start && PL_eval_start->op_type == OP_CONST) {
fc15ae8f
NC
1394 CopARYBASE_set(&PL_compiling,
1395 (I32)SvIV(cSVOPx(PL_eval_start)->op_sv));
3280af22 1396 PL_eval_start = 0;
a0d0e21e
LW
1397 }
1398 else if (!type) {
fc15ae8f
NC
1399 SAVECOPARYBASE(&PL_compiling);
1400 CopARYBASE_set(&PL_compiling, 0);
a0d0e21e
LW
1401 }
1402 else if (type == OP_REFGEN)
1403 goto nomod;
1404 else
cea2e8a9 1405 Perl_croak(aTHX_ "That use of $[ is unsupported");
a0d0e21e 1406 break;
5f05dabc 1407 case OP_STUB:
58bde88d 1408 if ((o->op_flags & OPf_PARENS) || PL_madskills)
5f05dabc 1409 break;
1410 goto nomod;
a0d0e21e
LW
1411 case OP_ENTERSUB:
1412 if ((type == OP_UNDEF || type == OP_REFGEN) &&
11343788
MB
1413 !(o->op_flags & OPf_STACKED)) {
1414 o->op_type = OP_RV2CV; /* entersub => rv2cv */
e26df76a
NC
1415 /* The default is to set op_private to the number of children,
1416 which for a UNOP such as RV2CV is always 1. And w're using
1417 the bit for a flag in RV2CV, so we need it clear. */
1418 o->op_private &= ~1;
22c35a8c 1419 o->op_ppaddr = PL_ppaddr[OP_RV2CV];
11343788 1420 assert(cUNOPo->op_first->op_type == OP_NULL);
93c66552 1421 op_null(((LISTOP*)cUNOPo->op_first)->op_first);/* disable pushmark */
79072805
LW
1422 break;
1423 }
95f0a2f1
SB
1424 else if (o->op_private & OPpENTERSUB_NOMOD)
1425 return o;
cd06dffe
GS
1426 else { /* lvalue subroutine call */
1427 o->op_private |= OPpLVAL_INTRO;
e6438c1a 1428 PL_modcount = RETURN_UNLIMITED_NUMBER;
4978d6d9 1429 if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN) {
cd06dffe
GS
1430 /* Backward compatibility mode: */
1431 o->op_private |= OPpENTERSUB_INARGS;
1432 break;
1433 }
1434 else { /* Compile-time error message: */
1435 OP *kid = cUNOPo->op_first;
1436 CV *cv;
1437 OP *okid;
1438
3ea285d1
AL
1439 if (kid->op_type != OP_PUSHMARK) {
1440 if (kid->op_type != OP_NULL || kid->op_targ != OP_LIST)
1441 Perl_croak(aTHX_
1442 "panic: unexpected lvalue entersub "
1443 "args: type/targ %ld:%"UVuf,
1444 (long)kid->op_type, (UV)kid->op_targ);
1445 kid = kLISTOP->op_first;
1446 }
cd06dffe
GS
1447 while (kid->op_sibling)
1448 kid = kid->op_sibling;
1449 if (!(kid->op_type == OP_NULL && kid->op_targ == OP_RV2CV)) {
1450 /* Indirect call */
1451 if (kid->op_type == OP_METHOD_NAMED
1452 || kid->op_type == OP_METHOD)
1453 {
87d7fd28 1454 UNOP *newop;
b2ffa427 1455
87d7fd28 1456 NewOp(1101, newop, 1, UNOP);
349fd7b7
GS
1457 newop->op_type = OP_RV2CV;
1458 newop->op_ppaddr = PL_ppaddr[OP_RV2CV];
5f66b61c 1459 newop->op_first = NULL;
87d7fd28
GS
1460 newop->op_next = (OP*)newop;
1461 kid->op_sibling = (OP*)newop;
349fd7b7 1462 newop->op_private |= OPpLVAL_INTRO;
e26df76a 1463 newop->op_private &= ~1;
cd06dffe
GS
1464 break;
1465 }
b2ffa427 1466
cd06dffe
GS
1467 if (kid->op_type != OP_RV2CV)
1468 Perl_croak(aTHX_
1469 "panic: unexpected lvalue entersub "
55140b79 1470 "entry via type/targ %ld:%"UVuf,
3d811634 1471 (long)kid->op_type, (UV)kid->op_targ);
cd06dffe
GS
1472 kid->op_private |= OPpLVAL_INTRO;
1473 break; /* Postpone until runtime */
1474 }
b2ffa427
NIS
1475
1476 okid = kid;
cd06dffe
GS
1477 kid = kUNOP->op_first;
1478 if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV)
1479 kid = kUNOP->op_first;
b2ffa427 1480 if (kid->op_type == OP_NULL)
cd06dffe
GS
1481 Perl_croak(aTHX_
1482 "Unexpected constant lvalue entersub "
55140b79 1483 "entry via type/targ %ld:%"UVuf,
3d811634 1484 (long)kid->op_type, (UV)kid->op_targ);
cd06dffe
GS
1485 if (kid->op_type != OP_GV) {
1486 /* Restore RV2CV to check lvalueness */
1487 restore_2cv:
1488 if (kid->op_next && kid->op_next != kid) { /* Happens? */
1489 okid->op_next = kid->op_next;
1490 kid->op_next = okid;
1491 }
1492 else
5f66b61c 1493 okid->op_next = NULL;
cd06dffe
GS
1494 okid->op_type = OP_RV2CV;
1495 okid->op_targ = 0;
1496 okid->op_ppaddr = PL_ppaddr[OP_RV2CV];
1497 okid->op_private |= OPpLVAL_INTRO;
e26df76a 1498 okid->op_private &= ~1;
cd06dffe
GS
1499 break;
1500 }
b2ffa427 1501
638eceb6 1502 cv = GvCV(kGVOP_gv);
1c846c1f 1503 if (!cv)
cd06dffe
GS
1504 goto restore_2cv;
1505 if (CvLVALUE(cv))
1506 break;
1507 }
1508 }
79072805
LW
1509 /* FALL THROUGH */
1510 default:
a0d0e21e 1511 nomod:
6fbb66d6
NC
1512 /* grep, foreach, subcalls, refgen */
1513 if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN)
a0d0e21e 1514 break;
cea2e8a9 1515 yyerror(Perl_form(aTHX_ "Can't modify %s in %s",
638bc118 1516 (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)
cd06dffe
GS
1517 ? "do block"
1518 : (o->op_type == OP_ENTERSUB
1519 ? "non-lvalue subroutine call"
53e06cf0 1520 : OP_DESC(o))),
22c35a8c 1521 type ? PL_op_desc[type] : "local"));
11343788 1522 return o;
79072805 1523
a0d0e21e
LW
1524 case OP_PREINC:
1525 case OP_PREDEC:
1526 case OP_POW:
1527 case OP_MULTIPLY:
1528 case OP_DIVIDE:
1529 case OP_MODULO:
1530 case OP_REPEAT:
1531 case OP_ADD:
1532 case OP_SUBTRACT:
1533 case OP_CONCAT:
1534 case OP_LEFT_SHIFT:
1535 case OP_RIGHT_SHIFT:
1536 case OP_BIT_AND:
1537 case OP_BIT_XOR:
1538 case OP_BIT_OR:
1539 case OP_I_MULTIPLY:
1540 case OP_I_DIVIDE:
1541 case OP_I_MODULO:
1542 case OP_I_ADD:
1543 case OP_I_SUBTRACT:
11343788 1544 if (!(o->op_flags & OPf_STACKED))
a0d0e21e 1545 goto nomod;
3280af22 1546 PL_modcount++;
a0d0e21e 1547 break;
b2ffa427 1548
79072805 1549 case OP_COND_EXPR:
ddeae0f1 1550 localize = 1;
11343788 1551 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
463ee0b2 1552 mod(kid, type);
79072805
LW
1553 break;
1554
1555 case OP_RV2AV:
1556 case OP_RV2HV:
11343788 1557 if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
e6438c1a 1558 PL_modcount = RETURN_UNLIMITED_NUMBER;
11343788 1559 return o; /* Treat \(@foo) like ordinary list. */
748a9306
LW
1560 }
1561 /* FALL THROUGH */
79072805 1562 case OP_RV2GV:
5dc0d613 1563 if (scalar_mod_type(o, type))
3fe9a6f1 1564 goto nomod;
11343788 1565 ref(cUNOPo->op_first, o->op_type);
79072805 1566 /* FALL THROUGH */
79072805
LW
1567 case OP_ASLICE:
1568 case OP_HSLICE:
78f9721b
SM
1569 if (type == OP_LEAVESUBLV)
1570 o->op_private |= OPpMAYBE_LVSUB;
ddeae0f1 1571 localize = 1;
78f9721b
SM
1572 /* FALL THROUGH */
1573 case OP_AASSIGN:
93a17b20
LW
1574 case OP_NEXTSTATE:
1575 case OP_DBSTATE:
e6438c1a 1576 PL_modcount = RETURN_UNLIMITED_NUMBER;
79072805 1577 break;
28c5b5bc
RGS
1578 case OP_AV2ARYLEN:
1579 PL_hints |= HINT_BLOCK_SCOPE;
1580 if (type == OP_LEAVESUBLV)
1581 o->op_private |= OPpMAYBE_LVSUB;
1582 PL_modcount++;
1583 break;
463ee0b2 1584 case OP_RV2SV:
aeea060c 1585 ref(cUNOPo->op_first, o->op_type);
ddeae0f1 1586 localize = 1;
463ee0b2 1587 /* FALL THROUGH */
79072805 1588 case OP_GV:
3280af22 1589 PL_hints |= HINT_BLOCK_SCOPE;
463ee0b2 1590 case OP_SASSIGN:
bf4b1e52
GS
1591 case OP_ANDASSIGN:
1592 case OP_ORASSIGN:
c963b151 1593 case OP_DORASSIGN:
ddeae0f1
DM
1594 PL_modcount++;
1595 break;
1596
8990e307 1597 case OP_AELEMFAST:
6a077020 1598 localize = -1;
3280af22 1599 PL_modcount++;
8990e307
LW
1600 break;
1601
748a9306
LW
1602 case OP_PADAV:
1603 case OP_PADHV:
e6438c1a 1604 PL_modcount = RETURN_UNLIMITED_NUMBER;
5196be3e
MB
1605 if (type == OP_REFGEN && o->op_flags & OPf_PARENS)
1606 return o; /* Treat \(@foo) like ordinary list. */
1607 if (scalar_mod_type(o, type))
3fe9a6f1 1608 goto nomod;
78f9721b
SM
1609 if (type == OP_LEAVESUBLV)
1610 o->op_private |= OPpMAYBE_LVSUB;
748a9306
LW
1611 /* FALL THROUGH */
1612 case OP_PADSV:
3280af22 1613 PL_modcount++;
ddeae0f1 1614 if (!type) /* local() */
cea2e8a9 1615 Perl_croak(aTHX_ "Can't localize lexical variable %s",
dd2155a4 1616 PAD_COMPNAME_PV(o->op_targ));
463ee0b2
LW
1617 break;
1618
748a9306 1619 case OP_PUSHMARK:
ddeae0f1 1620 localize = 0;
748a9306 1621 break;
b2ffa427 1622
69969c6f
SB
1623 case OP_KEYS:
1624 if (type != OP_SASSIGN)
1625 goto nomod;
5d82c453
GA
1626 goto lvalue_func;
1627 case OP_SUBSTR:
1628 if (o->op_private == 4) /* don't allow 4 arg substr as lvalue */
1629 goto nomod;
5f05dabc 1630 /* FALL THROUGH */
a0d0e21e 1631 case OP_POS:
463ee0b2 1632 case OP_VEC:
78f9721b
SM
1633 if (type == OP_LEAVESUBLV)
1634 o->op_private |= OPpMAYBE_LVSUB;
5d82c453 1635 lvalue_func:
11343788
MB
1636 pad_free(o->op_targ);
1637 o->op_targ = pad_alloc(o->op_type, SVs_PADMY);
5dc0d613 1638 assert(SvTYPE(PAD_SV(o->op_targ)) == SVt_NULL);
11343788
MB
1639 if (o->op_flags & OPf_KIDS)
1640 mod(cBINOPo->op_first->op_sibling, type);
463ee0b2 1641 break;
a0d0e21e 1642
463ee0b2
LW
1643 case OP_AELEM:
1644 case OP_HELEM:
11343788 1645 ref(cBINOPo->op_first, o->op_type);
68dc0745 1646 if (type == OP_ENTERSUB &&
5dc0d613
MB
1647 !(o->op_private & (OPpLVAL_INTRO | OPpDEREF)))
1648 o->op_private |= OPpLVAL_DEFER;
78f9721b
SM
1649 if (type == OP_LEAVESUBLV)
1650 o->op_private |= OPpMAYBE_LVSUB;
ddeae0f1 1651 localize = 1;
3280af22 1652 PL_modcount++;
463ee0b2
LW
1653 break;
1654
1655 case OP_SCOPE:
1656 case OP_LEAVE:
1657 case OP_ENTER:
78f9721b 1658 case OP_LINESEQ:
ddeae0f1 1659 localize = 0;
11343788
MB
1660 if (o->op_flags & OPf_KIDS)
1661 mod(cLISTOPo->op_last, type);
a0d0e21e
LW
1662 break;
1663
1664 case OP_NULL:
ddeae0f1 1665 localize = 0;
638bc118
GS
1666 if (o->op_flags & OPf_SPECIAL) /* do BLOCK */
1667 goto nomod;
1668 else if (!(o->op_flags & OPf_KIDS))
463ee0b2 1669 break;
11343788
MB
1670 if (o->op_targ != OP_LIST) {
1671 mod(cBINOPo->op_first, type);
a0d0e21e
LW
1672 break;
1673 }
1674 /* FALL THROUGH */
463ee0b2 1675 case OP_LIST:
ddeae0f1 1676 localize = 0;
11343788 1677 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2
LW
1678 mod(kid, type);
1679 break;
78f9721b
SM
1680
1681 case OP_RETURN:
1682 if (type != OP_LEAVESUBLV)
1683 goto nomod;
1684 break; /* mod()ing was handled by ck_return() */
463ee0b2 1685 }
58d95175 1686
8be1be90
AMS
1687 /* [20011101.069] File test operators interpret OPf_REF to mean that
1688 their argument is a filehandle; thus \stat(".") should not set
1689 it. AMS 20011102 */
1690 if (type == OP_REFGEN &&
1691 PL_check[o->op_type] == MEMBER_TO_FPTR(Perl_ck_ftst))
1692 return o;
1693
1694 if (type != OP_LEAVESUBLV)
1695 o->op_flags |= OPf_MOD;
1696
1697 if (type == OP_AASSIGN || type == OP_SASSIGN)
1698 o->op_flags |= OPf_SPECIAL|OPf_REF;
ddeae0f1
DM
1699 else if (!type) { /* local() */
1700 switch (localize) {
1701 case 1:
1702 o->op_private |= OPpLVAL_INTRO;
1703 o->op_flags &= ~OPf_SPECIAL;
1704 PL_hints |= HINT_BLOCK_SCOPE;
1705 break;
1706 case 0:
1707 break;
1708 case -1:
a2a5de95
NC
1709 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
1710 "Useless localization of %s", OP_DESC(o));
ddeae0f1 1711 }
463ee0b2 1712 }
8be1be90
AMS
1713 else if (type != OP_GREPSTART && type != OP_ENTERSUB
1714 && type != OP_LEAVESUBLV)
1715 o->op_flags |= OPf_REF;
11343788 1716 return o;
463ee0b2
LW
1717}
1718
864dbfa3 1719STATIC bool
5f66b61c 1720S_scalar_mod_type(const OP *o, I32 type)
3fe9a6f1 1721{
7918f24d
NC
1722 PERL_ARGS_ASSERT_SCALAR_MOD_TYPE;
1723
3fe9a6f1 1724 switch (type) {
1725 case OP_SASSIGN:
5196be3e 1726 if (o->op_type == OP_RV2GV)
3fe9a6f1 1727 return FALSE;
1728 /* FALL THROUGH */
1729 case OP_PREINC:
1730 case OP_PREDEC:
1731 case OP_POSTINC:
1732 case OP_POSTDEC:
1733 case OP_I_PREINC:
1734 case OP_I_PREDEC:
1735 case OP_I_POSTINC:
1736 case OP_I_POSTDEC:
1737 case OP_POW:
1738 case OP_MULTIPLY:
1739 case OP_DIVIDE:
1740 case OP_MODULO:
1741 case OP_REPEAT:
1742 case OP_ADD:
1743 case OP_SUBTRACT:
1744 case OP_I_MULTIPLY:
1745 case OP_I_DIVIDE:
1746 case OP_I_MODULO:
1747 case OP_I_ADD:
1748 case OP_I_SUBTRACT:
1749 case OP_LEFT_SHIFT:
1750 case OP_RIGHT_SHIFT:
1751 case OP_BIT_AND:
1752 case OP_BIT_XOR:
1753 case OP_BIT_OR:
1754 case OP_CONCAT:
1755 case OP_SUBST:
1756 case OP_TRANS:
49e9fbe6
GS
1757 case OP_READ:
1758 case OP_SYSREAD:
1759 case OP_RECV:
bf4b1e52
GS
1760 case OP_ANDASSIGN:
1761 case OP_ORASSIGN:
410d09fe 1762 case OP_DORASSIGN:
3fe9a6f1 1763 return TRUE;
1764 default:
1765 return FALSE;
1766 }
1767}
1768
35cd451c 1769STATIC bool
5f66b61c 1770S_is_handle_constructor(const OP *o, I32 numargs)
35cd451c 1771{
7918f24d
NC
1772 PERL_ARGS_ASSERT_IS_HANDLE_CONSTRUCTOR;
1773
35cd451c
GS
1774 switch (o->op_type) {
1775 case OP_PIPE_OP:
1776 case OP_SOCKPAIR:
504618e9 1777 if (numargs == 2)
35cd451c
GS
1778 return TRUE;
1779 /* FALL THROUGH */
1780 case OP_SYSOPEN:
1781 case OP_OPEN:
ded8aa31 1782 case OP_SELECT: /* XXX c.f. SelectSaver.pm */
35cd451c
GS
1783 case OP_SOCKET:
1784 case OP_OPEN_DIR:
1785 case OP_ACCEPT:
504618e9 1786 if (numargs == 1)
35cd451c 1787 return TRUE;
5f66b61c 1788 /* FALLTHROUGH */
35cd451c
GS
1789 default:
1790 return FALSE;
1791 }
1792}
1793
0d86688d
NC
1794static OP *
1795S_refkids(pTHX_ OP *o, I32 type)
463ee0b2 1796{
11343788 1797 if (o && o->op_flags & OPf_KIDS) {
6867be6d 1798 OP *kid;
11343788 1799 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2
LW
1800 ref(kid, type);
1801 }
11343788 1802 return o;
463ee0b2
LW
1803}
1804
1805OP *
e4c5ccf3 1806Perl_doref(pTHX_ OP *o, I32 type, bool set_op_ref)
463ee0b2 1807{
27da23d5 1808 dVAR;
463ee0b2 1809 OP *kid;
463ee0b2 1810
7918f24d
NC
1811 PERL_ARGS_ASSERT_DOREF;
1812
13765c85 1813 if (!o || (PL_parser && PL_parser->error_count))
11343788 1814 return o;
463ee0b2 1815
11343788 1816 switch (o->op_type) {
a0d0e21e 1817 case OP_ENTERSUB:
afebc493 1818 if ((type == OP_EXISTS || type == OP_DEFINED || type == OP_LOCK) &&
11343788
MB
1819 !(o->op_flags & OPf_STACKED)) {
1820 o->op_type = OP_RV2CV; /* entersub => rv2cv */
22c35a8c 1821 o->op_ppaddr = PL_ppaddr[OP_RV2CV];
11343788 1822 assert(cUNOPo->op_first->op_type == OP_NULL);
93c66552 1823 op_null(((LISTOP*)cUNOPo->op_first)->op_first); /* disable pushmark */
11343788 1824 o->op_flags |= OPf_SPECIAL;
e26df76a 1825 o->op_private &= ~1;
8990e307
LW
1826 }
1827 break;
aeea060c 1828
463ee0b2 1829 case OP_COND_EXPR:
11343788 1830 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
e4c5ccf3 1831 doref(kid, type, set_op_ref);
463ee0b2 1832 break;
8990e307 1833 case OP_RV2SV:
35cd451c
GS
1834 if (type == OP_DEFINED)
1835 o->op_flags |= OPf_SPECIAL; /* don't create GV */
e4c5ccf3 1836 doref(cUNOPo->op_first, o->op_type, set_op_ref);
4633a7c4
LW
1837 /* FALL THROUGH */
1838 case OP_PADSV:
5f05dabc 1839 if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
5dc0d613
MB
1840 o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1841 : type == OP_RV2HV ? OPpDEREF_HV
1842 : OPpDEREF_SV);
11343788 1843 o->op_flags |= OPf_MOD;
a0d0e21e 1844 }
8990e307 1845 break;
1c846c1f 1846
463ee0b2
LW
1847 case OP_RV2AV:
1848 case OP_RV2HV:
e4c5ccf3
RH
1849 if (set_op_ref)
1850 o->op_flags |= OPf_REF;
8990e307 1851 /* FALL THROUGH */
463ee0b2 1852 case OP_RV2GV:
35cd451c
GS
1853 if (type == OP_DEFINED)
1854 o->op_flags |= OPf_SPECIAL; /* don't create GV */
e4c5ccf3 1855 doref(cUNOPo->op_first, o->op_type, set_op_ref);
463ee0b2 1856 break;
8990e307 1857
463ee0b2
LW
1858 case OP_PADAV:
1859 case OP_PADHV:
e4c5ccf3
RH
1860 if (set_op_ref)
1861 o->op_flags |= OPf_REF;
79072805 1862 break;
aeea060c 1863
8990e307 1864 case OP_SCALAR:
79072805 1865 case OP_NULL:
11343788 1866 if (!(o->op_flags & OPf_KIDS))
463ee0b2 1867 break;
e4c5ccf3 1868 doref(cBINOPo->op_first, type, set_op_ref);
79072805
LW
1869 break;
1870 case OP_AELEM:
1871 case OP_HELEM:
e4c5ccf3 1872 doref(cBINOPo->op_first, o->op_type, set_op_ref);
5f05dabc 1873 if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
5dc0d613
MB
1874 o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1875 : type == OP_RV2HV ? OPpDEREF_HV
1876 : OPpDEREF_SV);
11343788 1877 o->op_flags |= OPf_MOD;
8990e307 1878 }
79072805
LW
1879 break;
1880
463ee0b2 1881 case OP_SCOPE:
79072805 1882 case OP_LEAVE:
e4c5ccf3
RH
1883 set_op_ref = FALSE;
1884 /* FALL THROUGH */
79072805 1885 case OP_ENTER:
8990e307 1886 case OP_LIST:
11343788 1887 if (!(o->op_flags & OPf_KIDS))
79072805 1888 break;
e4c5ccf3 1889 doref(cLISTOPo->op_last, type, set_op_ref);
79072805 1890 break;
a0d0e21e
LW
1891 default:
1892 break;
79072805 1893 }
11343788 1894 return scalar(o);
8990e307 1895
79072805
LW
1896}
1897
09bef843
SB
1898STATIC OP *
1899S_dup_attrlist(pTHX_ OP *o)
1900{
97aff369 1901 dVAR;
0bd48802 1902 OP *rop;
09bef843 1903
7918f24d
NC
1904 PERL_ARGS_ASSERT_DUP_ATTRLIST;
1905
09bef843
SB
1906 /* An attrlist is either a simple OP_CONST or an OP_LIST with kids,
1907 * where the first kid is OP_PUSHMARK and the remaining ones
1908 * are OP_CONST. We need to push the OP_CONST values.
1909 */
1910 if (o->op_type == OP_CONST)
b37c2d43 1911 rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc_NN(cSVOPo->op_sv));
eb8433b7
NC
1912#ifdef PERL_MAD
1913 else if (o->op_type == OP_NULL)
1d866c12 1914 rop = NULL;
eb8433b7 1915#endif
09bef843
SB
1916 else {
1917 assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
5f66b61c 1918 rop = NULL;
09bef843
SB
1919 for (o = cLISTOPo->op_first; o; o=o->op_sibling) {
1920 if (o->op_type == OP_CONST)
1921 rop = append_elem(OP_LIST, rop,
1922 newSVOP(OP_CONST, o->op_flags,
b37c2d43 1923 SvREFCNT_inc_NN(cSVOPo->op_sv)));
09bef843
SB
1924 }
1925 }
1926 return rop;
1927}
1928
1929STATIC void
95f0a2f1 1930S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs, bool for_my)
09bef843 1931{
27da23d5 1932 dVAR;
09bef843
SB
1933 SV *stashsv;
1934
7918f24d
NC
1935 PERL_ARGS_ASSERT_APPLY_ATTRS;
1936
09bef843
SB
1937 /* fake up C<use attributes $pkg,$rv,@attrs> */
1938 ENTER; /* need to protect against side-effects of 'use' */
5aaec2b4 1939 stashsv = stash ? newSVhek(HvNAME_HEK(stash)) : &PL_sv_no;
e4783991 1940
09bef843 1941#define ATTRSMODULE "attributes"
95f0a2f1
SB
1942#define ATTRSMODULE_PM "attributes.pm"
1943
1944 if (for_my) {
95f0a2f1 1945 /* Don't force the C<use> if we don't need it. */
a4fc7abc 1946 SV * const * const svp = hv_fetchs(GvHVn(PL_incgv), ATTRSMODULE_PM, FALSE);
95f0a2f1 1947 if (svp && *svp != &PL_sv_undef)
6f207bd3 1948 NOOP; /* already in %INC */
95f0a2f1
SB
1949 else
1950 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
6136c704 1951 newSVpvs(ATTRSMODULE), NULL);
95f0a2f1
SB
1952 }
1953 else {
1954 Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
6136c704
AL
1955 newSVpvs(ATTRSMODULE),
1956 NULL,
95f0a2f1
SB
1957 prepend_elem(OP_LIST,
1958 newSVOP(OP_CONST, 0, stashsv),
1959 prepend_elem(OP_LIST,
1960 newSVOP(OP_CONST, 0,
1961 newRV(target)),
1962 dup_attrlist(attrs))));
1963 }
09bef843
SB
1964 LEAVE;
1965}
1966
95f0a2f1
SB
1967STATIC void
1968S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp)
1969{
97aff369 1970 dVAR;
95f0a2f1
SB
1971 OP *pack, *imop, *arg;
1972 SV *meth, *stashsv;
1973
7918f24d
NC
1974 PERL_ARGS_ASSERT_APPLY_ATTRS_MY;
1975
95f0a2f1
SB
1976 if (!attrs)
1977 return;
1978
1979 assert(target->op_type == OP_PADSV ||
1980 target->op_type == OP_PADHV ||
1981 target->op_type == OP_PADAV);
1982
1983 /* Ensure that attributes.pm is loaded. */
dd2155a4 1984 apply_attrs(stash, PAD_SV(target->op_targ), attrs, TRUE);
95f0a2f1
SB
1985
1986 /* Need package name for method call. */
6136c704 1987 pack = newSVOP(OP_CONST, 0, newSVpvs(ATTRSMODULE));
95f0a2f1
SB
1988
1989 /* Build up the real arg-list. */
5aaec2b4
NC
1990 stashsv = stash ? newSVhek(HvNAME_HEK(stash)) : &PL_sv_no;
1991
95f0a2f1
SB
1992 arg = newOP(OP_PADSV, 0);
1993 arg->op_targ = target->op_targ;
1994 arg = prepend_elem(OP_LIST,
1995 newSVOP(OP_CONST, 0, stashsv),
1996 prepend_elem(OP_LIST,
1997 newUNOP(OP_REFGEN, 0,
1998 mod(arg, OP_REFGEN)),
1999 dup_attrlist(attrs)));
2000
2001 /* Fake up a method call to import */
18916d0d 2002 meth = newSVpvs_share("import");
95f0a2f1
SB
2003 imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL|OPf_WANT_VOID,
2004 append_elem(OP_LIST,
2005 prepend_elem(OP_LIST, pack, list(arg)),
2006 newSVOP(OP_METHOD_NAMED, 0, meth)));
2007 imop->op_private |= OPpENTERSUB_NOMOD;
2008
2009 /* Combine the ops. */
2010 *imopsp = append_elem(OP_LIST, *imopsp, imop);
2011}
2012
2013/*
2014=notfor apidoc apply_attrs_string
2015
2016Attempts to apply a list of attributes specified by the C<attrstr> and
2017C<len> arguments to the subroutine identified by the C<cv> argument which
2018is expected to be associated with the package identified by the C<stashpv>
2019argument (see L<attributes>). It gets this wrong, though, in that it
2020does not correctly identify the boundaries of the individual attribute
2021specifications within C<attrstr>. This is not really intended for the
2022public API, but has to be listed here for systems such as AIX which
2023need an explicit export list for symbols. (It's called from XS code
2024in support of the C<ATTRS:> keyword from F<xsubpp>.) Patches to fix it
2025to respect attribute syntax properly would be welcome.
2026
2027=cut
2028*/
2029
be3174d2 2030void
6867be6d
AL
2031Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv,
2032 const char *attrstr, STRLEN len)
be3174d2 2033{
5f66b61c 2034 OP *attrs = NULL;
be3174d2 2035
7918f24d
NC
2036 PERL_ARGS_ASSERT_APPLY_ATTRS_STRING;
2037
be3174d2
GS
2038 if (!len) {
2039 len = strlen(attrstr);
2040 }
2041
2042 while (len) {
2043 for (; isSPACE(*attrstr) && len; --len, ++attrstr) ;
2044 if (len) {
890ce7af 2045 const char * const sstr = attrstr;
be3174d2
GS
2046 for (; !isSPACE(*attrstr) && len; --len, ++attrstr) ;
2047 attrs = append_elem(OP_LIST, attrs,
2048 newSVOP(OP_CONST, 0,
2049 newSVpvn(sstr, attrstr-sstr)));
2050 }
2051 }
2052
2053 Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
6136c704 2054 newSVpvs(ATTRSMODULE),
a0714e2c 2055 NULL, prepend_elem(OP_LIST,
be3174d2
GS
2056 newSVOP(OP_CONST, 0, newSVpv(stashpv,0)),
2057 prepend_elem(OP_LIST,
2058 newSVOP(OP_CONST, 0,
ad64d0ec 2059 newRV(MUTABLE_SV(cv))),
be3174d2
GS
2060 attrs)));
2061}
2062
09bef843 2063STATIC OP *
95f0a2f1 2064S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp)
93a17b20 2065{
97aff369 2066 dVAR;
93a17b20
LW
2067 I32 type;
2068
7918f24d
NC
2069 PERL_ARGS_ASSERT_MY_KID;
2070
13765c85 2071 if (!o || (PL_parser && PL_parser->error_count))
11343788 2072 return o;
93a17b20 2073
bc61e325 2074 type = o->op_type;
eb8433b7
NC
2075 if (PL_madskills && type == OP_NULL && o->op_flags & OPf_KIDS) {
2076 (void)my_kid(cUNOPo->op_first, attrs, imopsp);
2077 return o;
2078 }
2079
93a17b20 2080 if (type == OP_LIST) {
6867be6d 2081 OP *kid;
11343788 2082 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
95f0a2f1 2083 my_kid(kid, attrs, imopsp);
eb8433b7
NC
2084 } else if (type == OP_UNDEF
2085#ifdef PERL_MAD
2086 || type == OP_STUB
2087#endif
2088 ) {
7766148a 2089 return o;
77ca0c92
LW
2090 } else if (type == OP_RV2SV || /* "our" declaration */
2091 type == OP_RV2AV ||
2092 type == OP_RV2HV) { /* XXX does this let anything illegal in? */
1ce0b88c 2093 if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */
fab01b8e 2094 yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"",
952306ac 2095 OP_DESC(o),
12bd6ede
DM
2096 PL_parser->in_my == KEY_our
2097 ? "our"
2098 : PL_parser->in_my == KEY_state ? "state" : "my"));
1ce0b88c 2099 } else if (attrs) {
551405c4 2100 GV * const gv = cGVOPx_gv(cUNOPo->op_first);
12bd6ede
DM
2101 PL_parser->in_my = FALSE;
2102 PL_parser->in_my_stash = NULL;
1ce0b88c
RGS
2103 apply_attrs(GvSTASH(gv),
2104 (type == OP_RV2SV ? GvSV(gv) :
ad64d0ec
NC
2105 type == OP_RV2AV ? MUTABLE_SV(GvAV(gv)) :
2106 type == OP_RV2HV ? MUTABLE_SV(GvHV(gv)) : MUTABLE_SV(gv)),
1ce0b88c
RGS
2107 attrs, FALSE);
2108 }
192587c2 2109 o->op_private |= OPpOUR_INTRO;
77ca0c92 2110 return o;
95f0a2f1
SB
2111 }
2112 else if (type != OP_PADSV &&
93a17b20
LW
2113 type != OP_PADAV &&
2114 type != OP_PADHV &&
2115 type != OP_PUSHMARK)
2116 {
eb64745e 2117 yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"",
53e06cf0 2118 OP_DESC(o),
12bd6ede
DM
2119 PL_parser->in_my == KEY_our
2120 ? "our"
2121 : PL_parser->in_my == KEY_state ? "state" : "my"));
11343788 2122 return o;
93a17b20 2123 }
09bef843
SB
2124 else if (attrs && type != OP_PUSHMARK) {
2125 HV *stash;
09bef843 2126
12bd6ede
DM
2127 PL_parser->in_my = FALSE;
2128 PL_parser->in_my_stash = NULL;
eb64745e 2129
09bef843 2130 /* check for C<my Dog $spot> when deciding package */
dd2155a4
DM
2131 stash = PAD_COMPNAME_TYPE(o->op_targ);
2132 if (!stash)
09bef843 2133 stash = PL_curstash;
95f0a2f1 2134 apply_attrs_my(stash, o, attrs, imopsp);
09bef843 2135 }
11343788
MB
2136 o->op_flags |= OPf_MOD;
2137 o->op_private |= OPpLVAL_INTRO;
12bd6ede 2138 if (PL_parser->in_my == KEY_state)
952306ac 2139 o->op_private |= OPpPAD_STATE;
11343788 2140 return o;
93a17b20
LW
2141}
2142
2143OP *
09bef843
SB
2144Perl_my_attrs(pTHX_ OP *o, OP *attrs)
2145{
97aff369 2146 dVAR;
0bd48802 2147 OP *rops;
95f0a2f1
SB
2148 int maybe_scalar = 0;
2149
7918f24d
NC
2150 PERL_ARGS_ASSERT_MY_ATTRS;
2151
d2be0de5 2152/* [perl #17376]: this appears to be premature, and results in code such as
c754c3d7 2153 C< our(%x); > executing in list mode rather than void mode */
d2be0de5 2154#if 0
09bef843
SB
2155 if (o->op_flags & OPf_PARENS)
2156 list(o);
95f0a2f1
SB
2157 else
2158 maybe_scalar = 1;
d2be0de5
YST
2159#else
2160 maybe_scalar = 1;
2161#endif
09bef843
SB
2162 if (attrs)
2163 SAVEFREEOP(attrs);
5f66b61c 2164 rops = NULL;
95f0a2f1
SB
2165 o = my_kid(o, attrs, &rops);
2166 if (rops) {
2167 if (maybe_scalar && o->op_type == OP_PADSV) {
2168 o = scalar(append_list(OP_LIST, (LISTOP*)rops, (LISTOP*)o));
2169 o->op_private |= OPpLVAL_INTRO;
2170 }
2171 else
2172 o = append_list(OP_LIST, (LISTOP*)o, (LISTOP*)rops);
2173 }
12bd6ede
DM
2174 PL_parser->in_my = FALSE;
2175 PL_parser->in_my_stash = NULL;
eb64745e 2176 return o;
09bef843
SB
2177}
2178
2179OP *
864dbfa3 2180Perl_sawparens(pTHX_ OP *o)
79072805 2181{
96a5add6 2182 PERL_UNUSED_CONTEXT;
79072805
LW
2183 if (o)
2184 o->op_flags |= OPf_PARENS;
2185 return o;
2186}
2187
2188OP *
864dbfa3 2189Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
79072805 2190{
11343788 2191 OP *o;
59f00321 2192 bool ismatchop = 0;
1496a290
AL
2193 const OPCODE ltype = left->op_type;
2194 const OPCODE rtype = right->op_type;
79072805 2195
7918f24d
NC
2196 PERL_ARGS_ASSERT_BIND_MATCH;
2197
1496a290
AL
2198 if ( (ltype == OP_RV2AV || ltype == OP_RV2HV || ltype == OP_PADAV
2199 || ltype == OP_PADHV) && ckWARN(WARN_MISC))
041457d9 2200 {
1496a290 2201 const char * const desc
666ea192
JH
2202 = PL_op_desc[(rtype == OP_SUBST || rtype == OP_TRANS)
2203 ? (int)rtype : OP_MATCH];
2204 const char * const sample = ((ltype == OP_RV2AV || ltype == OP_PADAV)
2205 ? "@array" : "%hash");
9014280d 2206 Perl_warner(aTHX_ packWARN(WARN_MISC),
1c846c1f 2207 "Applying %s to %s will act on scalar(%s)",
599cee73 2208 desc, sample, sample);
2ae324a7 2209 }
2210
1496a290 2211 if (rtype == OP_CONST &&
5cc9e5c9
RH
2212 cSVOPx(right)->op_private & OPpCONST_BARE &&
2213 cSVOPx(right)->op_private & OPpCONST_STRICT)
2214 {
2215 no_bareword_allowed(right);
2216 }
2217
1496a290
AL
2218 ismatchop = rtype == OP_MATCH ||
2219 rtype == OP_SUBST ||
2220 rtype == OP_TRANS;
59f00321
RGS
2221 if (ismatchop && right->op_private & OPpTARGET_MY) {
2222 right->op_targ = 0;
2223 right->op_private &= ~OPpTARGET_MY;
2224 }
2225 if (!(right->op_flags & OPf_STACKED) && ismatchop) {
1496a290
AL
2226 OP *newleft;
2227
79072805 2228 right->op_flags |= OPf_STACKED;
1496a290
AL
2229 if (rtype != OP_MATCH &&
2230 ! (rtype == OP_TRANS &&
6fbb66d6 2231 right->op_private & OPpTRANS_IDENTICAL))
1496a290
AL
2232 newleft = mod(left, rtype);
2233 else
2234 newleft = left;
79072805 2235 if (right->op_type == OP_TRANS)
1496a290 2236 o = newBINOP(OP_NULL, OPf_STACKED, scalar(newleft), right);
79072805 2237 else
1496a290 2238 o = prepend_elem(rtype, scalar(newleft), right);
79072805 2239 if (type == OP_NOT)
11343788
MB
2240 return newUNOP(OP_NOT, 0, scalar(o));
2241 return o;
79072805
LW
2242 }
2243 else
2244 return bind_match(type, left,
131b3ad0 2245 pmruntime(newPMOP(OP_MATCH, 0), right, 0));
79072805
LW
2246}
2247
2248OP *
864dbfa3 2249Perl_invert(pTHX_ OP *o)
79072805 2250{
11343788 2251 if (!o)
1d866c12 2252 return NULL;
11343788 2253 return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o));
79072805
LW
2254}
2255
2256OP *
864dbfa3 2257Perl_scope(pTHX_ OP *o)
79072805 2258{
27da23d5 2259 dVAR;
79072805 2260 if (o) {
3280af22 2261 if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || PL_tainting) {
463ee0b2
LW
2262 o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
2263 o->op_type = OP_LEAVE;
22c35a8c 2264 o->op_ppaddr = PL_ppaddr[OP_LEAVE];
463ee0b2 2265 }
fdb22418
HS
2266 else if (o->op_type == OP_LINESEQ) {
2267 OP *kid;
2268 o->op_type = OP_SCOPE;
2269 o->op_ppaddr = PL_ppaddr[OP_SCOPE];
2270 kid = ((LISTOP*)o)->op_first;
59110972 2271 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE) {
fdb22418 2272 op_null(kid);
59110972
RH
2273
2274 /* The following deals with things like 'do {1 for 1}' */
2275 kid = kid->op_sibling;
2276 if (kid &&
2277 (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE))
2278 op_null(kid);
2279 }
463ee0b2 2280 }
fdb22418 2281 else
5f66b61c 2282 o = newLISTOP(OP_SCOPE, 0, o, NULL);
79072805
LW
2283 }
2284 return o;
2285}
72dc9ed5 2286
a0d0e21e 2287int
864dbfa3 2288Perl_block_start(pTHX_ int full)
79072805 2289{
97aff369 2290 dVAR;
73d840c0 2291 const int retval = PL_savestack_ix;
dd2155a4 2292 pad_block_start(full);
b3ac6de7 2293 SAVEHINTS();
3280af22 2294 PL_hints &= ~HINT_BLOCK_SCOPE;
68da3b2f 2295 SAVECOMPILEWARNINGS();
72dc9ed5 2296 PL_compiling.cop_warnings = DUP_WARNINGS(PL_compiling.cop_warnings);
a0d0e21e
LW
2297 return retval;
2298}
2299
2300OP*
864dbfa3 2301Perl_block_end(pTHX_ I32 floor, OP *seq)
a0d0e21e 2302{
97aff369 2303 dVAR;
6867be6d 2304 const int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
551405c4 2305 OP* const retval = scalarseq(seq);
e9818f4e 2306 LEAVE_SCOPE(floor);
623e6609 2307 CopHINTS_set(&PL_compiling, PL_hints);
a0d0e21e 2308 if (needblockscope)
3280af22 2309 PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */
dd2155a4 2310 pad_leavemy();
a0d0e21e
LW
2311 return retval;
2312}
2313
76e3520e 2314STATIC OP *
cea2e8a9 2315S_newDEFSVOP(pTHX)
54b9620d 2316{
97aff369 2317 dVAR;
f8f98e0a 2318 const PADOFFSET offset = Perl_pad_findmy(aTHX_ STR_WITH_LEN("$_"), 0);
00b1698f 2319 if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
59f00321
RGS
2320 return newSVREF(newGVOP(OP_GV, 0, PL_defgv));
2321 }
2322 else {
551405c4 2323 OP * const o = newOP(OP_PADSV, 0);
59f00321
RGS
2324 o->op_targ = offset;
2325 return o;
2326 }
54b9620d
MB
2327}
2328
a0d0e21e 2329void
864dbfa3 2330Perl_newPROG(pTHX_ OP *o)
a0d0e21e 2331{
97aff369 2332 dVAR;
7918f24d
NC
2333
2334 PERL_ARGS_ASSERT_NEWPROG;
2335
3280af22 2336 if (PL_in_eval) {
b295d113
TH
2337 if (PL_eval_root)
2338 return;
faef0170
HS
2339 PL_eval_root = newUNOP(OP_LEAVEEVAL,
2340 ((PL_in_eval & EVAL_KEEPERR)
2341 ? OPf_SPECIAL : 0), o);
3280af22 2342 PL_eval_start = linklist(PL_eval_root);
7934575e
GS
2343 PL_eval_root->op_private |= OPpREFCOUNTED;
2344 OpREFCNT_set(PL_eval_root, 1);
3280af22 2345 PL_eval_root->op_next = 0;
a2efc822 2346 CALL_PEEP(PL_eval_start);
a0d0e21e
LW
2347 }
2348 else {
6be89cf9
AE
2349 if (o->op_type == OP_STUB) {
2350 PL_comppad_name = 0;
2351 PL_compcv = 0;
d2c837a0 2352 S_op_destroy(aTHX_ o);
a0d0e21e 2353 return;
6be89cf9 2354 }
3280af22
NIS
2355 PL_main_root = scope(sawparens(scalarvoid(o)));
2356 PL_curcop = &PL_compiling;
2357 PL_main_start = LINKLIST(PL_main_root);
7934575e
GS
2358 PL_main_root->op_private |= OPpREFCOUNTED;
2359 OpREFCNT_set(PL_main_root, 1);
3280af22 2360 PL_main_root->op_next = 0;
a2efc822 2361 CALL_PEEP(PL_main_start);
3280af22 2362 PL_compcv = 0;
3841441e 2363
4fdae800 2364 /* Register with debugger */
84902520 2365 if (PERLDB_INTER) {
b96d8cd9 2366 CV * const cv = get_cvs("DB::postponed", 0);
3841441e
CS
2367 if (cv) {
2368 dSP;
924508f0 2369 PUSHMARK(SP);
ad64d0ec 2370 XPUSHs(MUTABLE_SV(CopFILEGV(&PL_compiling)));
3841441e 2371 PUTBACK;
ad64d0ec 2372 call_sv(MUTABLE_SV(cv), G_DISCARD);
3841441e
CS
2373 }
2374 }
79072805 2375 }
79072805
LW
2376}
2377
2378OP *
864dbfa3 2379Perl_localize(pTHX_ OP *o, I32 lex)
79072805 2380{
97aff369 2381 dVAR;
7918f24d
NC
2382
2383 PERL_ARGS_ASSERT_LOCALIZE;
2384
79072805 2385 if (o->op_flags & OPf_PARENS)
d2be0de5
YST
2386/* [perl #17376]: this appears to be premature, and results in code such as
2387 C< our(%x); > executing in list mode rather than void mode */
2388#if 0
79072805 2389 list(o);
d2be0de5 2390#else
6f207bd3 2391 NOOP;
d2be0de5 2392#endif
8990e307 2393 else {
f06b5848
DM
2394 if ( PL_parser->bufptr > PL_parser->oldbufptr
2395 && PL_parser->bufptr[-1] == ','
041457d9 2396 && ckWARN(WARN_PARENTHESIS))
64420d0d 2397 {
f06b5848 2398 char *s = PL_parser->bufptr;
bac662ee 2399 bool sigil = FALSE;
64420d0d 2400
8473848f 2401 /* some heuristics to detect a potential error */
bac662ee 2402 while (*s && (strchr(", \t\n", *s)))
64420d0d 2403 s++;
8473848f 2404
bac662ee
TS
2405 while (1) {
2406 if (*s && strchr("@$%*", *s) && *++s
2407 && (isALNUM(*s) || UTF8_IS_CONTINUED(*s))) {
2408 s++;
2409 sigil = TRUE;
2410 while (*s && (isALNUM(*s) || UTF8_IS_CONTINUED(*s)))
2411 s++;
2412 while (*s && (strchr(", \t\n", *s)))
2413 s++;
2414 }
2415 else
2416 break;
2417 }
2418 if (sigil && (*s == ';' || *s == '=')) {
2419 Perl_warner(aTHX_ packWARN(WARN_PARENTHESIS),
8473848f 2420 "Parentheses missing around \"%s\" list",
12bd6ede
DM
2421 lex
2422 ? (PL_parser->in_my == KEY_our
2423 ? "our"
2424 : PL_parser->in_my == KEY_state
2425 ? "state"
2426 : "my")
2427 : "local");
8473848f 2428 }
8990e307
LW
2429 }
2430 }
93a17b20 2431 if (lex)
eb64745e 2432 o = my(o);
93a17b20 2433 else
eb64745e 2434 o = mod(o, OP_NULL); /* a bit kludgey */
12bd6ede
DM
2435 PL_parser->in_my = FALSE;
2436 PL_parser->in_my_stash = NULL;
eb64745e 2437 return o;
79072805
LW
2438}
2439
2440OP *
864dbfa3 2441Perl_jmaybe(pTHX_ OP *o)
79072805 2442{
7918f24d
NC
2443 PERL_ARGS_ASSERT_JMAYBE;
2444
79072805 2445 if (o->op_type == OP_LIST) {
fafc274c 2446 OP * const o2
d4c19fe8 2447 = newSVREF(newGVOP(OP_GV, 0, gv_fetchpvs(";", GV_ADD|GV_NOTQUAL, SVt_PV)));
554b3eca 2448 o = convert(OP_JOIN, 0, prepend_elem(OP_LIST, o2, o));
79072805
LW
2449 }
2450 return o;
2451}
2452
1f676739 2453static OP *
b7783a12 2454S_fold_constants(pTHX_ register OP *o)
79072805 2455{
27da23d5 2456 dVAR;
001d637e 2457 register OP * VOL curop;
eb8433b7 2458 OP *newop;
8ea43dc8 2459 VOL I32 type = o->op_type;
e3cbe32f 2460 SV * VOL sv = NULL;
b7f7fd0b
NC
2461 int ret = 0;
2462 I32 oldscope;
2463 OP *old_next;
5f2d9966
DM
2464 SV * const oldwarnhook = PL_warnhook;
2465 SV * const olddiehook = PL_diehook;
c427f4d2 2466 COP not_compiling;
b7f7fd0b 2467 dJMPENV;
79072805 2468
7918f24d
NC
2469 PERL_ARGS_ASSERT_FOLD_CONSTANTS;
2470
22c35a8c 2471 if (PL_opargs[type] & OA_RETSCALAR)
79072805 2472 scalar(o);
b162f9ea 2473 if (PL_opargs[type] & OA_TARGET && !o->op_targ)
ed6116ce 2474 o->op_targ = pad_alloc(type, SVs_PADTMP);
79072805 2475
eac055e9
GS
2476 /* integerize op, unless it happens to be C<-foo>.
2477 * XXX should pp_i_negate() do magic string negation instead? */
2478 if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER)
2479 && !(type == OP_NEGATE && cUNOPo->op_first->op_type == OP_CONST
2480 && (cUNOPo->op_first->op_private & OPpCONST_BARE)))
2481 {
22c35a8c 2482 o->op_ppaddr = PL_ppaddr[type = ++(o->op_type)];
eac055e9 2483 }
85e6fe83 2484
22c35a8c 2485 if (!(PL_opargs[type] & OA_FOLDCONST))
79072805
LW
2486 goto nope;
2487
de939608 2488 switch (type) {
7a52d87a
GS
2489 case OP_NEGATE:
2490 /* XXX might want a ck_negate() for this */
2491 cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
2492 break;
de939608
CS
2493 case OP_UCFIRST:
2494 case OP_LCFIRST:
2495 case OP_UC:
2496 case OP_LC:
69dcf70c
MB
2497 case OP_SLT:
2498 case OP_SGT:
2499 case OP_SLE:
2500 case OP_SGE:
2501 case OP_SCMP:
2de3dbcc
JH
2502 /* XXX what about the numeric ops? */
2503 if (PL_hints & HINT_LOCALE)
de939608 2504 goto nope;
553e7bb0 2505 break;
de939608
CS
2506 }
2507
13765c85 2508 if (PL_parser && PL_parser->error_count)
a0d0e21e
LW
2509 goto nope; /* Don't try to run w/ errors */
2510
79072805 2511 for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
1496a290
AL
2512 const OPCODE type = curop->op_type;
2513 if ((type != OP_CONST || (curop->op_private & OPpCONST_BARE)) &&
2514 type != OP_LIST &&
2515 type != OP_SCALAR &&
2516 type != OP_NULL &&
2517 type != OP_PUSHMARK)
7a52d87a 2518 {
79072805
LW
2519 goto nope;
2520 }
2521 }
2522
2523 curop = LINKLIST(o);
b7f7fd0b 2524 old_next = o->op_next;
79072805 2525 o->op_next = 0;
533c011a 2526 PL_op = curop;
b7f7fd0b
NC
2527
2528 oldscope = PL_scopestack_ix;
edb2152a 2529 create_eval_scope(G_FAKINGEVAL);
b7f7fd0b 2530
c427f4d2
NC
2531 /* Verify that we don't need to save it: */
2532 assert(PL_curcop == &PL_compiling);
2533 StructCopy(&PL_compiling, &not_compiling, COP);
2534 PL_curcop = &not_compiling;
2535 /* The above ensures that we run with all the correct hints of the
2536 currently compiling COP, but that IN_PERL_RUNTIME is not true. */
2537 assert(IN_PERL_RUNTIME);
5f2d9966
DM
2538 PL_warnhook = PERL_WARNHOOK_FATAL;
2539 PL_diehook = NULL;
b7f7fd0b
NC
2540 JMPENV_PUSH(ret);
2541
2542 switch (ret) {
2543 case 0:
2544 CALLRUNOPS(aTHX);
2545 sv = *(PL_stack_sp--);
2546 if (o->op_targ && sv == PAD_SV(o->op_targ)) /* grab pad temp? */
2547 pad_swipe(o->op_targ, FALSE);
2548 else if (SvTEMP(sv)) { /* grab mortal temp? */
2549 SvREFCNT_inc_simple_void(sv);
2550 SvTEMP_off(sv);
2551 }
2552 break;
2553 case 3:
2554 /* Something tried to die. Abandon constant folding. */
2555 /* Pretend the error never happened. */
ab69dbc2 2556 CLEAR_ERRSV();
b7f7fd0b
NC
2557 o->op_next = old_next;
2558 break;
2559 default:
2560 JMPENV_POP;
5f2d9966
DM
2561 /* Don't expect 1 (setjmp failed) or 2 (something called my_exit) */
2562 PL_warnhook = oldwarnhook;
2563 PL_diehook = olddiehook;
2564 /* XXX note that this croak may fail as we've already blown away
2565 * the stack - eg any nested evals */
b7f7fd0b
NC
2566 Perl_croak(aTHX_ "panic: fold_constants JMPENV_PUSH returned %d", ret);
2567 }
b7f7fd0b 2568 JMPENV_POP;
5f2d9966
DM
2569 PL_warnhook = oldwarnhook;
2570 PL_diehook = olddiehook;
c427f4d2 2571 PL_curcop = &PL_compiling;
edb2152a
NC
2572
2573 if (PL_scopestack_ix > oldscope)
2574 delete_eval_scope();
eb8433b7 2575
b7f7fd0b
NC
2576 if (ret)
2577 goto nope;
2578
eb8433b7 2579#ifndef PERL_MAD
79072805 2580 op_free(o);
eb8433b7 2581#endif
de5e01c2 2582 assert(sv);
79072805 2583 if (type == OP_RV2GV)
159b6efe 2584 newop = newGVOP(OP_GV, 0, MUTABLE_GV(sv));
eb8433b7 2585 else
ad64d0ec 2586 newop = newSVOP(OP_CONST, 0, MUTABLE_SV(sv));
eb8433b7
NC
2587 op_getmad(o,newop,'f');
2588 return newop;
aeea060c 2589
b7f7fd0b 2590 nope:
79072805
LW
2591 return o;
2592}
2593
1f676739 2594static OP *
b7783a12 2595S_gen_constant_list(pTHX_ register OP *o)
79072805 2596{
27da23d5 2597 dVAR;
79072805 2598 register OP *curop;
6867be6d 2599 const I32 oldtmps_floor = PL_tmps_floor;
79072805 2600
a0d0e21e 2601 list(o);
13765c85 2602 if (PL_parser && PL_parser->error_count)
a0d0e21e
LW
2603 return o; /* Don't attempt to run with errors */
2604
533c011a 2605 PL_op = curop = LINKLIST(o);
a0d0e21e 2606 o->op_next = 0;
a2efc822 2607 CALL_PEEP(curop);
cea2e8a9
GS
2608 pp_pushmark();
2609 CALLRUNOPS(aTHX);
533c011a 2610 PL_op = curop;
78c72037
NC
2611 assert (!(curop->op_flags & OPf_SPECIAL));
2612 assert(curop->op_type == OP_RANGE);
cea2e8a9 2613 pp_anonlist();
3280af22 2614 PL_tmps_floor = oldtmps_floor;
79072805
LW
2615
2616 o->op_type = OP_RV2AV;
22c35a8c 2617 o->op_ppaddr = PL_ppaddr[OP_RV2AV];
fb53bbb2
SG
2618 o->op_flags &= ~OPf_REF; /* treat \(1..2) like an ordinary list */
2619 o->op_flags |= OPf_PARENS; /* and flatten \(1..2,3) */
2814eb74 2620 o->op_opt = 0; /* needs to be revisited in peep() */
79072805 2621 curop = ((UNOP*)o)->op_first;
b37c2d43 2622 ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc_NN(*PL_stack_sp--));
eb8433b7
NC
2623#ifdef PERL_MAD
2624 op_getmad(curop,o,'O');
2625#else
79072805 2626 op_free(curop);
eb8433b7 2627#endif
79072805
LW
2628 linklist(o);
2629 return list(o);
2630}
2631
2632OP *
864dbfa3 2633Perl_convert(pTHX_ I32 type, I32 flags, OP *o)
79072805 2634{
27da23d5 2635 dVAR;
11343788 2636 if (!o || o->op_type != OP_LIST)
5f66b61c 2637 o = newLISTOP(OP_LIST, 0, o, NULL);
748a9306 2638 else
5dc0d613 2639 o->op_flags &= ~OPf_WANT;
79072805 2640
22c35a8c 2641 if (!(PL_opargs[type] & OA_MARK))
93c66552 2642 op_null(cLISTOPo->op_first);
8990e307 2643
eb160463 2644 o->op_type = (OPCODE)type;
22c35a8c 2645 o->op_ppaddr = PL_ppaddr[type];
11343788 2646 o->op_flags |= flags;
79072805 2647
11343788 2648 o = CHECKOP(type, o);
fe2774ed 2649 if (o->op_type != (unsigned)type)
11343788 2650 return o;
79072805 2651
11343788 2652 return fold_constants(o);
79072805
LW
2653}
2654
2655/* List constructors */
2656
2657OP *
864dbfa3 2658Perl_append_elem(pTHX_ I32 type, OP *first, OP *last)
79072805
LW
2659{
2660 if (!first)
2661 return last;
8990e307
LW
2662
2663 if (!last)
79072805 2664 return first;
8990e307 2665
fe2774ed 2666 if (first->op_type != (unsigned)type
155aba94
GS
2667 || (type == OP_LIST && (first->op_flags & OPf_PARENS)))
2668 {
2669 return newLISTOP(type, 0, first, last);
2670 }
79072805 2671
a0d0e21e
LW
2672 if (first->op_flags & OPf_KIDS)
2673 ((LISTOP*)first)->op_last->op_sibling = last;
2674 else {
2675 first->op_flags |= OPf_KIDS;
2676 ((LISTOP*)first)->op_first = last;
2677 }
2678 ((LISTOP*)first)->op_last = last;
a0d0e21e 2679 return first;
79072805
LW
2680}
2681
2682OP *
864dbfa3 2683Perl_append_list(pTHX_ I32 type, LISTOP *first, LISTOP *last)
79072805
LW
2684{
2685 if (!first)
2686 return (OP*)last;
8990e307
LW
2687
2688 if (!last)
79072805 2689 return (OP*)first;
8990e307 2690
fe2774ed 2691 if (first->op_type != (unsigned)type)
79072805 2692 return prepend_elem(type, (OP*)first, (OP*)last);
8990e307 2693
fe2774ed 2694 if (last->op_type != (unsigned)type)
79072805
LW
2695 return append_elem(type, (OP*)first, (OP*)last);
2696
2697 first->op_last->op_sibling = last->op_first;
2698 first->op_last = last->op_last;
117dada2 2699 first->op_flags |= (last->op_flags & OPf_KIDS);
1c846c1f 2700
eb8433b7
NC
2701#ifdef PERL_MAD
2702 if (last->op_first && first->op_madprop) {
2703 MADPROP *mp = last->op_first->op_madprop;
2704 if (mp) {
2705 while (mp->mad_next)
2706 mp = mp->mad_next;
2707 mp->mad_next = first->op_madprop;
2708 }
2709 else {
2710 last->op_first->op_madprop = first->op_madprop;
2711 }
2712 }
2713 first->op_madprop = last->op_madprop;
2714 last->op_madprop = 0;
2715#endif
2716
d2c837a0 2717 S_op_destroy(aTHX_ (OP*)last);
238a4c30 2718
79072805
LW
2719 return (OP*)first;
2720}
2721
2722OP *
864dbfa3 2723Perl_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
79072805
LW
2724{
2725 if (!first)
2726 return last;
8990e307
LW
2727
2728 if (!last)
79072805 2729 return first;
8990e307 2730
fe2774ed 2731 if (last->op_type == (unsigned)type) {
8990e307
LW
2732 if (type == OP_LIST) { /* already a PUSHMARK there */
2733 first->op_sibling = ((LISTOP*)last)->op_first->op_sibling;
2734 ((LISTOP*)last)->op_first->op_sibling = first;
36a5d4ba
DC
2735 if (!(first->op_flags & OPf_PARENS))
2736 last->op_flags &= ~OPf_PARENS;
8990e307
LW
2737 }
2738 else {
2739 if (!(last->op_flags & OPf_KIDS)) {
2740 ((LISTOP*)last)->op_last = first;
2741 last->op_flags |= OPf_KIDS;
2742 }
2743 first->op_sibling = ((LISTOP*)last)->op_first;
2744 ((LISTOP*)last)->op_first = first;
79072805 2745 }
117dada2 2746 last->op_flags |= OPf_KIDS;
79072805
LW
2747 return last;
2748 }
2749
2750 return newLISTOP(type, 0, first, last);
2751}
2752
2753/* Constructors */
2754
eb8433b7
NC
2755#ifdef PERL_MAD
2756
2757TOKEN *
2758Perl_newTOKEN(pTHX_ I32 optype, YYSTYPE lval, MADPROP* madprop)
2759{
2760 TOKEN *tk;
99129197 2761 Newxz(tk, 1, TOKEN);
eb8433b7
NC
2762 tk->tk_type = (OPCODE)optype;
2763 tk->tk_type = 12345;
2764 tk->tk_lval = lval;
2765 tk->tk_mad = madprop;
2766 return tk;
2767}
2768
2769void
2770Perl_token_free(pTHX_ TOKEN* tk)
2771{
7918f24d
NC
2772 PERL_ARGS_ASSERT_TOKEN_FREE;
2773
eb8433b7
NC
2774 if (tk->tk_type != 12345)
2775 return;
2776 mad_free(tk->tk_mad);
2777 Safefree(tk);
2778}
2779
2780void
2781Perl_token_getmad(pTHX_ TOKEN* tk, OP* o, char slot)
2782{
2783 MADPROP* mp;
2784 MADPROP* tm;
7918f24d
NC
2785
2786 PERL_ARGS_ASSERT_TOKEN_GETMAD;
2787
eb8433b7
NC
2788 if (tk->tk_type != 12345) {
2789 Perl_warner(aTHX_ packWARN(WARN_MISC),
2790 "Invalid TOKEN object ignored");
2791 return;
2792 }
2793 tm = tk->tk_mad;
2794 if (!tm)
2795 return;
2796
2797 /* faked up qw list? */
2798 if (slot == '(' &&
2799 tm->mad_type == MAD_SV &&
d503a9ba 2800 SvPVX((SV *)tm->mad_val)[0] == 'q')
eb8433b7
NC
2801 slot = 'x';
2802
2803 if (o) {
2804 mp = o->op_madprop;
2805 if (mp) {
2806 for (;;) {
2807 /* pretend constant fold didn't happen? */
2808 if (mp->mad_key == 'f' &&
2809 (o->op_type == OP_CONST ||
2810 o->op_type == OP_GV) )
2811 {
2812 token_getmad(tk,(OP*)mp->mad_val,slot);
2813 return;
2814 }
2815 if (!mp->mad_next)
2816 break;
2817 mp = mp->mad_next;
2818 }
2819 mp->mad_next = tm;
2820 mp = mp->mad_next;
2821 }
2822 else {
2823 o->op_madprop = tm;
2824 mp = o->op_madprop;
2825 }
2826 if (mp->mad_key == 'X')
2827 mp->mad_key = slot; /* just change the first one */
2828
2829 tk->tk_mad = 0;
2830 }
2831 else
2832 mad_free(tm);
2833 Safefree(tk);
2834}
2835
2836void
2837Perl_op_getmad_weak(pTHX_ OP* from, OP* o, char slot)
2838{
2839 MADPROP* mp;
2840 if (!from)
2841 return;
2842 if (o) {
2843 mp = o->op_madprop;
2844 if (mp) {
2845 for (;;) {
2846 /* pretend constant fold didn't happen? */
2847 if (mp->mad_key == 'f' &&
2848 (o->op_type == OP_CONST ||
2849 o->op_type == OP_GV) )
2850 {
2851 op_getmad(from,(OP*)mp->mad_val,slot);
2852 return;
2853 }
2854 if (!mp->mad_next)
2855 break;
2856 mp = mp->mad_next;
2857 }
2858 mp->mad_next = newMADPROP(slot,MAD_OP,from,0);
2859 }
2860 else {
2861 o->op_madprop = newMADPROP(slot,MAD_OP,from,0);
2862 }
2863 }
2864}
2865
2866void
2867Perl_op_getmad(pTHX_ OP* from, OP* o, char slot)
2868{
2869 MADPROP* mp;
2870 if (!from)
2871 return;
2872 if (o) {
2873 mp = o->op_madprop;
2874 if (mp) {
2875 for (;;) {
2876 /* pretend constant fold didn't happen? */
2877 if (mp->mad_key == 'f' &&
2878 (o->op_type == OP_CONST ||
2879 o->op_type == OP_GV) )
2880 {
2881 op_getmad(from,(OP*)mp->mad_val,slot);
2882 return;
2883 }
2884 if (!mp->mad_next)
2885 break;
2886 mp = mp->mad_next;
2887 }
2888 mp->mad_next = newMADPROP(slot,MAD_OP,from,1);
2889 }
2890 else {
2891 o->op_madprop = newMADPROP(slot,MAD_OP,from,1);
2892 }
2893 }
2894 else {
99129197
NC
2895 PerlIO_printf(PerlIO_stderr(),
2896 "DESTROYING op = %0"UVxf"\n", PTR2UV(from));
eb8433b7
NC
2897 op_free(from);
2898 }
2899}
2900
2901void
2902Perl_prepend_madprops(pTHX_ MADPROP* mp, OP* o, char slot)
2903{
2904 MADPROP* tm;
2905 if (!mp || !o)
2906 return;
2907 if (slot)
2908 mp->mad_key = slot;
2909 tm = o->op_madprop;
2910 o->op_madprop = mp;
2911 for (;;) {
2912 if (!mp->mad_next)
2913 break;
2914 mp = mp->mad_next;
2915 }
2916 mp->mad_next = tm;
2917}
2918
2919void
2920Perl_append_madprops(pTHX_ MADPROP* tm, OP* o, char slot)
2921{
2922 if (!o)
2923 return;
2924 addmad(tm, &(o->op_madprop), slot);
2925}
2926
2927void
2928Perl_addmad(pTHX_ MADPROP* tm, MADPROP** root, char slot)
2929{
2930 MADPROP* mp;
2931 if (!tm || !root)
2932 return;
2933 if (slot)
2934 tm->mad_key = slot;
2935 mp = *root;
2936 if (!mp) {
2937 *root = tm;
2938 return;
2939 }
2940 for (;;) {
2941 if (!mp->mad_next)
2942 break;
2943 mp = mp->mad_next;
2944 }
2945 mp->mad_next = tm;
2946}
2947
2948MADPROP *
2949Perl_newMADsv(pTHX_ char key, SV* sv)
2950{
7918f24d
NC
2951 PERL_ARGS_ASSERT_NEWMADSV;
2952
eb8433b7
NC
2953 return newMADPROP(key, MAD_SV, sv, 0);
2954}
2955
2956MADPROP *
d503a9ba 2957Perl_newMADPROP(pTHX_ char key, char type, void* val, I32 vlen)
eb8433b7
NC
2958{
2959 MADPROP *mp;
99129197 2960 Newxz(mp, 1, MADPROP);
eb8433b7
NC
2961 mp->mad_next = 0;
2962 mp->mad_key = key;
2963 mp->mad_vlen = vlen;
2964 mp->mad_type = type;
2965 mp->mad_val = val;
2966/* PerlIO_printf(PerlIO_stderr(), "NEW mp = %0x\n", mp); */
2967 return mp;
2968}
2969
2970void
2971Perl_mad_free(pTHX_ MADPROP* mp)
2972{
2973/* PerlIO_printf(PerlIO_stderr(), "FREE mp = %0x\n", mp); */
2974 if (!mp)
2975 return;
2976 if (mp->mad_next)
2977 mad_free(mp->mad_next);
bc177e6b 2978/* if (PL_parser && PL_parser->lex_state != LEX_NOTPARSING && mp->mad_vlen)
eb8433b7
NC
2979 PerlIO_printf(PerlIO_stderr(), "DESTROYING '%c'=<%s>\n", mp->mad_key & 255, mp->mad_val); */
2980 switch (mp->mad_type) {
2981 case MAD_NULL:
2982 break;
2983 case MAD_PV:
2984 Safefree((char*)mp->mad_val);
2985 break;
2986 case MAD_OP:
2987 if (mp->mad_vlen) /* vlen holds "strong/weak" boolean */
2988 op_free((OP*)mp->mad_val);
2989 break;
2990 case MAD_SV:
ad64d0ec 2991 sv_free(MUTABLE_SV(mp->mad_val));
eb8433b7
NC
2992 break;
2993 default:
2994 PerlIO_printf(PerlIO_stderr(), "Unrecognized mad\n");
2995 break;
2996 }
2997 Safefree(mp);
2998}
2999
3000#endif
3001
79072805 3002OP *
864dbfa3 3003Perl_newNULLLIST(pTHX)
79072805 3004{
8990e307
LW
3005 return newOP(OP_STUB, 0);
3006}
3007
1f676739 3008static OP *
b7783a12 3009S_force_list(pTHX_ OP *o)
8990e307 3010{
11343788 3011 if (!o || o->op_type != OP_LIST)
5f66b61c 3012 o = newLISTOP(OP_LIST, 0, o, NULL);
93c66552 3013 op_null(o);
11343788 3014 return o;
79072805
LW
3015}
3016
3017OP *
864dbfa3 3018Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
79072805 3019{
27da23d5 3020 dVAR;
79072805
LW
3021 LISTOP *listop;
3022
e69777c1
GG
3023 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LISTOP);
3024
b7dc083c 3025 NewOp(1101, listop, 1, LISTOP);
79072805 3026
eb160463 3027 listop->op_type = (OPCODE)type;
22c35a8c 3028 listop->op_ppaddr = PL_ppaddr[type];
117dada2
SM
3029 if (first || last)
3030 flags |= OPf_KIDS;
eb160463 3031 listop->op_flags = (U8)flags;
79072805
LW
3032
3033 if (!last && first)
3034 last = first;
3035 else if (!first && last)
3036 first = last;
8990e307
LW
3037 else if (first)
3038 first->op_sibling = last;
79072805
LW
3039 listop->op_first = first;
3040 listop->op_last = last;
8990e307 3041 if (type == OP_LIST) {
551405c4 3042 OP* const pushop = newOP(OP_PUSHMARK, 0);
8990e307
LW
3043 pushop->op_sibling = first;
3044 listop->op_first = pushop;
3045 listop->op_flags |= OPf_KIDS;
3046 if (!last)
3047 listop->op_last = pushop;
3048 }
79072805 3049
463d09e6 3050 return CHECKOP(type, listop);
79072805
LW
3051}
3052
3053OP *
864dbfa3 3054Perl_newOP(pTHX_ I32 type, I32 flags)
79072805 3055{
27da23d5 3056 dVAR;
11343788 3057 OP *o;
e69777c1
GG
3058
3059 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP
3060 || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP
3061 || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
3062 || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
3063
b7dc083c 3064 NewOp(1101, o, 1, OP);
eb160463 3065 o->op_type = (OPCODE)type;
22c35a8c 3066 o->op_ppaddr = PL_ppaddr[type];
eb160463 3067 o->op_flags = (U8)flags;
670f3923
DM
3068 o->op_latefree = 0;
3069 o->op_latefreed = 0;
7e5d8ed2 3070 o->op_attached = 0;
79072805 3071
11343788 3072 o->op_next = o;
eb160463 3073 o->op_private = (U8)(0 | (flags >> 8));
22c35a8c 3074 if (PL_opargs[type] & OA_RETSCALAR)
11343788 3075 scalar(o);
22c35a8c 3076 if (PL_opargs[type] & OA_TARGET)
11343788
MB
3077 o->op_targ = pad_alloc(type, SVs_PADTMP);
3078 return CHECKOP(type, o);
79072805
LW
3079}
3080
3081OP *
864dbfa3 3082Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
79072805 3083{
27da23d5 3084 dVAR;
79072805
LW
3085 UNOP *unop;
3086
e69777c1
GG
3087 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_UNOP
3088 || (PL_opargs[type] & OA_CLASS_MASK) == OA_BASEOP_OR_UNOP
3089 || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP
3090 || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP
3091 || type == OP_SASSIGN
3092 || type == OP_NULL );
3093
93a17b20 3094 if (!first)
aeea060c 3095 first = newOP(OP_STUB, 0);
22c35a8c 3096 if (PL_opargs[type] & OA_MARK)
8990e307 3097 first = force_list(first);
93a17b20 3098
b7dc083c 3099 NewOp(1101, unop, 1, UNOP);
eb160463 3100 unop->op_type = (OPCODE)type;
22c35a8c 3101 unop->op_ppaddr = PL_ppaddr[type];
79072805 3102 unop->op_first = first;
585ec06d 3103 unop->op_flags = (U8)(flags | OPf_KIDS);
eb160463 3104 unop->op_private = (U8)(1 | (flags >> 8));
e50aee73 3105 unop = (UNOP*) CHECKOP(type, unop);
79072805
LW
3106 if (unop->op_next)
3107 return (OP*)unop;
3108
a0d0e21e 3109 return fold_constants((OP *) unop);
79072805
LW
3110}
3111
3112OP *
864dbfa3 3113Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
79072805 3114{
27da23d5 3115 dVAR;
79072805 3116 BINOP *binop;
e69777c1
GG
3117
3118 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_BINOP
3119 || type == OP_SASSIGN || type == OP_NULL );
3120
b7dc083c 3121 NewOp(1101, binop, 1, BINOP);
79072805
LW
3122
3123 if (!first)
3124 first = newOP(OP_NULL, 0);
3125
eb160463 3126 binop->op_type = (OPCODE)type;
22c35a8c 3127 binop->op_ppaddr = PL_ppaddr[type];
79072805 3128 binop->op_first = first;
585ec06d 3129 binop->op_flags = (U8)(flags | OPf_KIDS);
79072805
LW
3130 if (!last) {
3131 last = first;
eb160463 3132 binop->op_private = (U8)(1 | (flags >> 8));
79072805
LW
3133 }
3134 else {
eb160463 3135 binop->op_private = (U8)(2 | (flags >> 8));
79072805
LW
3136 first->op_sibling = last;
3137 }
3138
e50aee73 3139 binop = (BINOP*)CHECKOP(type, binop);
eb160463 3140 if (binop->op_next || binop->op_type != (OPCODE)type)
79072805
LW
3141 return (OP*)binop;
3142
7284ab6f 3143 binop->op_last = binop->op_first->op_sibling;
79072805 3144
a0d0e21e 3145 return fold_constants((OP *)binop);
79072805
LW
3146}
3147
5f66b61c
AL
3148static int uvcompare(const void *a, const void *b)
3149 __attribute__nonnull__(1)
3150 __attribute__nonnull__(2)
3151 __attribute__pure__;
abb2c242 3152static int uvcompare(const void *a, const void *b)
2b9d42f0 3153{
e1ec3a88 3154 if (*((const UV *)a) < (*(const UV *)b))
2b9d42f0 3155 return -1;
e1ec3a88 3156 if (*((const UV *)a) > (*(const UV *)b))
2b9d42f0 3157 return 1;
e1ec3a88 3158 if (*((const UV *)a+1) < (*(const UV *)b+1))
2b9d42f0 3159 return -1;
e1ec3a88 3160 if (*((const UV *)a+1) > (*(const UV *)b+1))
2b9d42f0 3161 return 1;
a0ed51b3
LW
3162 return 0;
3163}
3164
0d86688d
NC
3165static OP *
3166S_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
79072805 3167{
97aff369 3168 dVAR;
2d03de9c 3169 SV * const tstr = ((SVOP*)expr)->op_sv;
fbbb0949
DM
3170 SV * const rstr =
3171#ifdef PERL_MAD
3172 (repl->op_type == OP_NULL)
3173 ? ((SVOP*)((LISTOP*)repl)->op_first)->op_sv :
3174#endif
3175 ((SVOP*)repl)->op_sv;
463ee0b2
LW
3176 STRLEN tlen;
3177 STRLEN rlen;
5c144d81
NC
3178 const U8 *t = (U8*)SvPV_const(tstr, tlen);
3179 const U8 *r = (U8*)SvPV_const(rstr, rlen);
79072805
LW
3180 register I32 i;
3181 register I32 j;
9b877dbb 3182 I32 grows = 0;
79072805
LW
3183 register short *tbl;
3184
551405c4
AL
3185 const I32 complement = o->op_private & OPpTRANS_COMPLEMENT;
3186 const I32 squash = o->op_private & OPpTRANS_SQUASH;
3187 I32 del = o->op_private & OPpTRANS_DELETE;
043e41b8 3188 SV* swash;
7918f24d
NC
3189
3190 PERL_ARGS_ASSERT_PMTRANS;
3191
800b4dc4 3192 PL_hints |= HINT_BLOCK_SCOPE;
1c846c1f 3193
036b4402
GS
3194 if (SvUTF8(tstr))
3195 o->op_private |= OPpTRANS_FROM_UTF;
1c846c1f
NIS
3196
3197 if (SvUTF8(rstr))
036b4402 3198 o->op_private |= OPpTRANS_TO_UTF;
79072805 3199
a0ed51b3 3200 if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
396482e1 3201 SV* const listsv = newSVpvs("# comment\n");
c445ea15 3202 SV* transv = NULL;
5c144d81
NC
3203 const U8* tend = t + tlen;
3204 const U8* rend = r + rlen;
ba210ebe 3205 STRLEN ulen;
84c133a0
RB
3206 UV tfirst = 1;
3207 UV tlast = 0;
3208 IV tdiff;
3209 UV rfirst = 1;
3210 UV rlast = 0;
3211 IV rdiff;
3212 IV diff;
a0ed51b3
LW
3213 I32 none = 0;
3214 U32 max = 0;
3215 I32 bits;
a0ed51b3 3216 I32 havefinal = 0;
9c5ffd7c 3217 U32 final = 0;
551405c4
AL
3218 const I32 from_utf = o->op_private & OPpTRANS_FROM_UTF;
3219 const I32 to_utf = o->op_private & OPpTRANS_TO_UTF;
bf4a1e57
JH
3220 U8* tsave = NULL;
3221 U8* rsave = NULL;
9f7f3913 3222 const U32 flags = UTF8_ALLOW_DEFAULT;
bf4a1e57
JH
3223
3224 if (!from_utf) {
3225 STRLEN len = tlen;
5c144d81 3226 t = tsave = bytes_to_utf8(t, &len);
bf4a1e57
JH
3227 tend = t + len;
3228 }
3229 if (!to_utf && rlen) {
3230 STRLEN len = rlen;
5c144d81 3231 r = rsave = bytes_to_utf8(r, &len);
bf4a1e57
JH
3232 rend = r + len;
3233 }
a0ed51b3 3234
2b9d42f0
NIS
3235/* There are several snags with this code on EBCDIC:
3236 1. 0xFF is a legal UTF-EBCDIC byte (there are no illegal bytes).
3237 2. scan_const() in toke.c has encoded chars in native encoding which makes
3238 ranges at least in EBCDIC 0..255 range the bottom odd.
3239*/
3240
a0ed51b3 3241 if (complement) {
89ebb4a3 3242 U8 tmpbuf[UTF8_MAXBYTES+1];
2b9d42f0 3243 UV *cp;
a0ed51b3 3244 UV nextmin = 0;
a02a5408 3245 Newx(cp, 2*tlen, UV);
a0ed51b3 3246 i = 0;
396482e1 3247 transv = newSVpvs("");
a0ed51b3 3248 while (t < tend) {
9f7f3913 3249 cp[2*i] = utf8n_to_uvuni(t, tend-t, &ulen, flags);
2b9d42f0
NIS
3250 t += ulen;
3251 if (t < tend && NATIVE_TO_UTF(*t) == 0xff) {
a0ed51b3 3252 t++;
9f7f3913 3253 cp[2*i+1] = utf8n_to_uvuni(t, tend-t, &ulen, flags);
2b9d42f0 3254 t += ulen;
a0ed51b3 3255 }
2b9d42f0
NIS
3256 else {
3257 cp[2*i+1] = cp[2*i];
3258 }
3259 i++;
a0ed51b3 3260 }
2b9d42f0 3261 qsort(cp, i, 2*sizeof(UV), uvcompare);
a0ed51b3 3262 for (j = 0; j < i; j++) {
2b9d42f0 3263 UV val = cp[2*j];
a0ed51b3
LW
3264 diff = val - nextmin;
3265 if (diff > 0) {
9041c2e3 3266 t = uvuni_to_utf8(tmpbuf,nextmin);
dfe13c55 3267 sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
a0ed51b3 3268 if (diff > 1) {
2b9d42f0 3269 U8 range_mark = UTF_TO_NATIVE(0xff);
9041c2e3 3270 t = uvuni_to_utf8(tmpbuf, val - 1);
2b9d42f0 3271 sv_catpvn(transv, (char *)&range_mark, 1);
dfe13c55 3272 sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
a0ed51b3
LW
3273 }
3274 }
2b9d42f0 3275 val = cp[2*j+1];
a0ed51b3
LW
3276 if (val >= nextmin)
3277 nextmin = val + 1;
3278 }
9041c2e3 3279 t = uvuni_to_utf8(tmpbuf,nextmin);
dfe13c55 3280 sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
2b9d42f0
NIS
3281 {
3282 U8 range_mark = UTF_TO_NATIVE(0xff);
3283 sv_catpvn(transv, (char *)&range_mark, 1);
3284 }
b851fbc1
JH
3285 t = uvuni_to_utf8_flags(tmpbuf, 0x7fffffff,
3286 UNICODE_ALLOW_SUPER);
dfe13c55 3287 sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
93524f2b 3288 t = (const U8*)SvPVX_const(transv);
a0ed51b3
LW
3289 tlen = SvCUR(transv);
3290 tend = t + tlen;
455d824a 3291 Safefree(cp);
a0ed51b3
LW
3292 }
3293 else if (!rlen && !del) {
3294 r = t; rlen = tlen; rend = tend;
4757a243
LW
3295 }
3296 if (!squash) {
05d340b8 3297 if ((!rlen && !del) || t == r ||
12ae5dfc 3298 (tlen == rlen && memEQ((char *)t, (char *)r, tlen)))
01ec43d0 3299 {
4757a243 3300 o->op_private |= OPpTRANS_IDENTICAL;
01ec43d0 3301 }
a0ed51b3
LW
3302 }
3303
3304 while (t < tend || tfirst <= tlast) {
3305 /* see if we need more "t" chars */
3306 if (tfirst > tlast) {
9f7f3913 3307 tfirst = (I32)utf8n_to_uvuni(t, tend - t, &ulen, flags);
a0ed51b3 3308 t += ulen;
2b9d42f0 3309 if (t < tend && NATIVE_TO_UTF(*t) == 0xff) { /* illegal utf8 val indicates range */
ba210ebe 3310 t++;
9f7f3913 3311 tlast = (I32)utf8n_to_uvuni(t, tend - t, &ulen, flags);
a0ed51b3
LW
3312 t += ulen;
3313 }
3314 else
3315 tlast = tfirst;
3316 }
3317
3318 /* now see if we need more "r" chars */
3319 if (rfirst > rlast) {
3320 if (r < rend) {
9f7f3913 3321 rfirst = (I32)utf8n_to_uvuni(r, rend - r, &ulen, flags);
a0ed51b3 3322 r += ulen;
2b9d42f0 3323 if (r < rend && NATIVE_TO_UTF(*r) == 0xff) { /* illegal utf8 val indicates range */
ba210ebe 3324 r++;
9f7f3913 3325 rlast = (I32)utf8n_to_uvuni(r, rend - r, &ulen, flags);
a0ed51b3
LW
3326 r += ulen;
3327 }
3328 else
3329 rlast = rfirst;
3330 }
3331 else {
3332 if (!havefinal++)
3333 final = rlast;
3334 rfirst = rlast = 0xffffffff;
3335 }
3336 }
3337
3338 /* now see which range will peter our first, if either. */
3339 tdiff = tlast - tfirst;
3340 rdiff = rlast - rfirst;
3341
3342 if (tdiff <= rdiff)
3343 diff = tdiff;
3344 else
3345 diff = rdiff;
3346
3347 if (rfirst == 0xffffffff) {
3348 diff = tdiff; /* oops, pretend rdiff is infinite */
3349 if (diff > 0)
894356b3
GS
3350 Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\tXXXX\n",
3351 (long)tfirst, (long)tlast);
a0ed51b3 3352 else
894356b3 3353 Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\tXXXX\n", (long)tfirst);
a0ed51b3
LW
3354 }
3355 else {
3356 if (diff > 0)
894356b3
GS
3357 Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\t%04lx\n",
3358 (long)tfirst, (long)(tfirst + diff),
3359 (long)rfirst);
a0ed51b3 3360 else
894356b3
GS
3361 Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\t%04lx\n",
3362 (long)tfirst, (long)rfirst);
a0ed51b3
LW
3363
3364 if (rfirst + diff > max)
3365 max = rfirst + diff;
9b877dbb 3366 if (!grows)
45005bfb
JH
3367 grows = (tfirst < rfirst &&
3368 UNISKIP(tfirst) < UNISKIP(rfirst + diff));
3369 rfirst += diff + 1;
a0ed51b3
LW
3370 }
3371 tfirst += diff + 1;
3372 }
3373
3374 none = ++max;
3375 if (del)
3376 del = ++max;
3377
3378 if (max > 0xffff)
3379 bits = 32;
3380 else if (max > 0xff)
3381 bits = 16;
3382 else
3383 bits = 8;
3384
ea71c68d 3385 PerlMemShared_free(cPVOPo->op_pv);
b3123a61 3386 cPVOPo->op_pv = NULL;
043e41b8 3387
ad64d0ec 3388 swash = MUTABLE_SV(swash_init("utf8", "", listsv, bits, none));
043e41b8
DM
3389#ifdef USE_ITHREADS
3390 cPADOPo->op_padix = pad_alloc(OP_TRANS, SVs_PADTMP);
3391 SvREFCNT_dec(PAD_SVl(cPADOPo->op_padix));
3392 PAD_SETSV(cPADOPo->op_padix, swash);
3393 SvPADTMP_on(swash);
a5446a64 3394 SvREADONLY_on(swash);
043e41b8
DM
3395#else
3396 cSVOPo->op_sv = swash;
3397#endif
a0ed51b3 3398 SvREFCNT_dec(listsv);
b37c2d43 3399 SvREFCNT_dec(transv);
a0ed51b3 3400
45005bfb 3401 if (!del && havefinal && rlen)
85fbaab2 3402 (void)hv_store(MUTABLE_HV(SvRV(swash)), "FINAL", 5,
b448e4fe 3403 newSVuv((UV)final), 0);
a0ed51b3 3404
9b877dbb 3405 if (grows)
a0ed51b3
LW
3406 o->op_private |= OPpTRANS_GROWS;
3407
b37c2d43
AL
3408 Safefree(tsave);
3409 Safefree(rsave);
9b877dbb 3410
eb8433b7
NC
3411#ifdef PERL_MAD
3412 op_getmad(expr,o,'e');
3413 op_getmad(repl,o,'r');
3414#else
a0ed51b3
LW
3415 op_free(expr);
3416 op_free(repl);
eb8433b7 3417#endif
a0ed51b3
LW
3418 return o;
3419 }
3420
3421 tbl = (short*)cPVOPo->op_pv;
79072805
LW
3422 if (complement) {
3423 Zero(tbl, 256, short);
eb160463 3424 for (i = 0; i < (I32)tlen; i++)
ec49126f 3425 tbl[t[i]] = -1;
79072805
LW
3426 for (i = 0, j = 0; i < 256; i++) {
3427 if (!tbl[i]) {
eb160463 3428 if (j >= (I32)rlen) {
a0ed51b3 3429 if (del)
79072805
LW
3430 tbl[i] = -2;
3431 else if (rlen)
ec49126f 3432 tbl[i] = r[j-1];
79072805 3433 else
eb160463 3434 tbl[i] = (short)i;
79072805 3435 }
9b877dbb
IH
3436 else {
3437 if (i < 128 && r[j] >= 128)
3438 grows = 1;
ec49126f 3439 tbl[i] = r[j++];
9b877dbb 3440 }
79072805
LW
3441 }
3442 }
05d340b8
JH
3443 if (!del) {
3444 if (!rlen) {
3445 j = rlen;
3446 if (!squash)
3447 o->op_private |= OPpTRANS_IDENTICAL;
3448 }
eb160463 3449 else if (j >= (I32)rlen)
05d340b8 3450 j = rlen - 1;
10db182f 3451 else {
aa1f7c5b
JH
3452 tbl =
3453 (short *)
3454 PerlMemShared_realloc(tbl,
3455 (0x101+rlen-j) * sizeof(short));
10db182f
YO
3456 cPVOPo->op_pv = (char*)tbl;
3457 }
585ec06d 3458 tbl[0x100] = (short)(rlen - j);
eb160463 3459 for (i=0; i < (I32)rlen - j; i++)
8973db79
JH
3460 tbl[0x101+i] = r[j+i];
3461 }
79072805
LW
3462 }
3463 else {
a0ed51b3 3464 if (!rlen && !del) {
79072805 3465 r = t; rlen = tlen;
5d06d08e 3466 if (!squash)
4757a243 3467 o->op_private |= OPpTRANS_IDENTICAL;
79072805 3468 }
94bfe852
RGS
3469 else if (!squash && rlen == tlen && memEQ((char*)t, (char*)r, tlen)) {
3470 o->op_private |= OPpTRANS_IDENTICAL;
3471 }
79072805
LW
3472 for (i = 0; i < 256; i++)
3473 tbl[i] = -1;
eb160463
GS
3474 for (i = 0, j = 0; i < (I32)tlen; i++,j++) {
3475 if (j >= (I32)rlen) {
a0ed51b3 3476 if (del) {
ec49126f 3477 if (tbl[t[i]] == -1)
3478 tbl[t[i]] = -2;
79072805
LW
3479 continue;
3480 }
3481 --j;
3482 }
9b877dbb
IH
3483 if (tbl[t[i]] == -1) {
3484 if (t[i] < 128 && r[j] >= 128)
3485 grows = 1;
ec49126f 3486 tbl[t[i]] = r[j];
9b877dbb 3487 }
79072805
LW
3488 }
3489 }
b08e453b 3490
a2a5de95
NC
3491 if(del && rlen == tlen) {
3492 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Useless use of /d modifier in transliteration operator");
3493 } else if(rlen > tlen) {
3494 Perl_ck_warner(aTHX_ packWARN(WARN_MISC), "Replacement list is longer than search list");
b08e453b
RB
3495 }
3496
9b877dbb
IH
3497 if (grows)
3498 o->op_private |= OPpTRANS_GROWS;
eb8433b7
NC
3499#ifdef PERL_MAD
3500 op_getmad(expr,o,'e');
3501 op_getmad(repl,o,'r');
3502#else
79072805
LW
3503 op_free(expr);
3504 op_free(repl);
eb8433b7 3505#endif
79072805 3506
11343788 3507 return o;
79072805
LW
3508}
3509
3510OP *
864dbfa3 3511Perl_newPMOP(pTHX_ I32 type, I32 flags)
79072805 3512{
27da23d5 3513 dVAR;
79072805
LW
3514 PMOP *pmop;
3515
e69777c1
GG
3516 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PMOP);
3517
b7dc083c 3518 NewOp(1101, pmop, 1, PMOP);
eb160463 3519 pmop->op_type = (OPCODE)type;
22c35a8c 3520 pmop->op_ppaddr = PL_ppaddr[type];
eb160463
GS
3521 pmop->op_flags = (U8)flags;
3522 pmop->op_private = (U8)(0 | (flags >> 8));
79072805 3523
3280af22 3524 if (PL_hints & HINT_RE_TAINT)
c737faaf 3525 pmop->op_pmflags |= PMf_RETAINT;
3280af22 3526 if (PL_hints & HINT_LOCALE)
c737faaf
YO
3527 pmop->op_pmflags |= PMf_LOCALE;
3528
36477c24 3529
debc9467 3530#ifdef USE_ITHREADS
402d2eb1
NC
3531 assert(SvPOK(PL_regex_pad[0]));
3532 if (SvCUR(PL_regex_pad[0])) {
3533 /* Pop off the "packed" IV from the end. */
3534 SV *const repointer_list = PL_regex_pad[0];
3535 const char *p = SvEND(repointer_list) - sizeof(IV);
3536 const IV offset = *((IV*)p);
3537
3538 assert(SvCUR(repointer_list) % sizeof(IV) == 0);
3539
3540 SvEND_set(repointer_list, p);
3541
110f3028 3542 pmop->op_pmoffset = offset;
14a49a24
NC
3543 /* This slot should be free, so assert this: */
3544 assert(PL_regex_pad[offset] == &PL_sv_undef);
551405c4 3545 } else {
14a49a24 3546 SV * const repointer = &PL_sv_undef;
9a8b6709 3547 av_push(PL_regex_padav, repointer);
551405c4
AL
3548 pmop->op_pmoffset = av_len(PL_regex_padav);
3549 PL_regex_pad = AvARRAY(PL_regex_padav);
13137afc 3550 }
debc9467 3551#endif
1eb1540c 3552
463d09e6 3553 return CHECKOP(type, pmop);
79072805
LW
3554}
3555
131b3ad0
DM
3556/* Given some sort of match op o, and an expression expr containing a
3557 * pattern, either compile expr into a regex and attach it to o (if it's
3558 * constant), or convert expr into a runtime regcomp op sequence (if it's
3559 * not)
3560 *
3561 * isreg indicates that the pattern is part of a regex construct, eg
3562 * $x =~ /pattern/ or split /pattern/, as opposed to $x =~ $pattern or
3563 * split "pattern", which aren't. In the former case, expr will be a list
3564 * if the pattern contains more than one term (eg /a$b/) or if it contains
3565 * a replacement, ie s/// or tr///.
3566 */
3567
79072805 3568OP *
131b3ad0 3569Perl_pmruntime(pTHX_ OP *o, OP *expr, bool isreg)
79072805 3570{
27da23d5 3571 dVAR;
79072805
LW
3572 PMOP *pm;
3573 LOGOP *rcop;
ce862d02 3574 I32 repl_has_vars = 0;
5f66b61c 3575 OP* repl = NULL;
131b3ad0
DM
3576 bool reglist;
3577
7918f24d
NC
3578 PERL_ARGS_ASSERT_PMRUNTIME;
3579
131b3ad0
DM
3580 if (o->op_type == OP_SUBST || o->op_type == OP_TRANS) {
3581 /* last element in list is the replacement; pop it */
3582 OP* kid;
3583 repl = cLISTOPx(expr)->op_last;
3584 kid = cLISTOPx(expr)->op_first;
3585 while (kid->op_sibling != repl)
3586 kid = kid->op_sibling;
5f66b61c 3587 kid->op_sibling = NULL;
131b3ad0
DM
3588 cLISTOPx(expr)->op_last = kid;
3589 }
79072805 3590
131b3ad0
DM
3591 if (isreg && expr->op_type == OP_LIST &&
3592 cLISTOPx(expr)->op_first->op_sibling == cLISTOPx(expr)->op_last)
3593 {
3594 /* convert single element list to element */
0bd48802 3595 OP* const oe = expr;
131b3ad0 3596 expr = cLISTOPx(oe)->op_first->op_sibling;
5f66b61c
AL
3597 cLISTOPx(oe)->op_first->op_sibling = NULL;
3598 cLISTOPx(oe)->op_last = NULL;
131b3ad0
DM
3599 op_free(oe);
3600 }
3601
3602 if (o->op_type == OP_TRANS) {
11343788 3603 return pmtrans(o, expr, repl);
131b3ad0
DM
3604 }
3605
3606 reglist = isreg && expr->op_type == OP_LIST;
3607 if (reglist)
3608 op_null(expr);
79072805 3609
3280af22 3610 PL_hints |= HINT_BLOCK_SCOPE;
11343788 3611 pm = (PMOP*)o;
79072805
LW
3612
3613 if (expr->op_type == OP_CONST) {
b9ad30b4 3614 SV *pat = ((SVOP*)expr)->op_sv;
c737faaf 3615 U32 pm_flags = pm->op_pmflags & PMf_COMPILETIME;
5c144d81 3616
0ac6acae
AB
3617 if (o->op_flags & OPf_SPECIAL)
3618 pm_flags |= RXf_SPLIT;
5c144d81 3619
b9ad30b4
NC
3620 if (DO_UTF8(pat)) {
3621 assert (SvUTF8(pat));
3622 } else if (SvUTF8(pat)) {
3623 /* Not doing UTF-8, despite what the SV says. Is this only if we're
3624 trapped in use 'bytes'? */
3625 /* Make a copy of the octet sequence, but without the flag on, as
3626 the compiler now honours the SvUTF8 flag on pat. */
3627 STRLEN len;
3628 const char *const p = SvPV(pat, len);
3629 pat = newSVpvn_flags(p, len, SVs_TEMP);
3630 }
0ac6acae 3631
3ab4a224 3632 PM_SETRE(pm, CALLREGCOMP(pat, pm_flags));
c737faaf 3633
eb8433b7
NC
3634#ifdef PERL_MAD
3635 op_getmad(expr,(OP*)pm,'e');
3636#else
79072805 3637 op_free(expr);
eb8433b7 3638#endif
79072805
LW
3639 }
3640 else {
3280af22 3641 if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL))
1c846c1f 3642 expr = newUNOP((!(PL_hints & HINT_RE_EVAL)
2cd61cdb
IZ
3643 ? OP_REGCRESET
3644 : OP_REGCMAYBE),0,expr);
463ee0b2 3645
b7dc083c 3646 NewOp(1101, rcop, 1, LOGOP);
79072805 3647 rcop->op_type = OP_REGCOMP;
22c35a8c 3648 rcop->op_ppaddr = PL_ppaddr[OP_REGCOMP];
79072805 3649 rcop->op_first = scalar(expr);
131b3ad0
DM
3650 rcop->op_flags |= OPf_KIDS
3651 | ((PL_hints & HINT_RE_EVAL) ? OPf_SPECIAL : 0)
3652 | (reglist ? OPf_STACKED : 0);
79072805 3653 rcop->op_private = 1;
11343788 3654 rcop->op_other = o;
131b3ad0
DM
3655 if (reglist)
3656 rcop->op_targ = pad_alloc(rcop->op_type, SVs_PADTMP);
3657
b5c19bd7
DM
3658 /* /$x/ may cause an eval, since $x might be qr/(?{..})/ */
3659 PL_cv_has_eval = 1;
79072805
LW
3660
3661 /* establish postfix order */
3280af22 3662 if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL)) {
463ee0b2
LW
3663 LINKLIST(expr);
3664 rcop->op_next = expr;
3665 ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
3666 }
3667 else {
3668 rcop->op_next = LINKLIST(expr);
3669 expr->op_next = (OP*)rcop;
3670 }
79072805 3671
11343788 3672 prepend_elem(o->op_type, scalar((OP*)rcop), o);
79072805
LW
3673 }
3674
3675 if (repl) {
748a9306 3676 OP *curop;
0244c3a4 3677 if (pm->op_pmflags & PMf_EVAL) {
6136c704 3678 curop = NULL;
670a9cb2
DM
3679 if (CopLINE(PL_curcop) < (line_t)PL_parser->multi_end)
3680 CopLINE_set(PL_curcop, (line_t)PL_parser->multi_end);
0244c3a4 3681 }
748a9306
LW
3682 else if (repl->op_type == OP_CONST)
3683 curop = repl;
79072805 3684 else {
c445ea15 3685 OP *lastop = NULL;
79072805 3686 for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
e80b829c 3687 if (curop->op_type == OP_SCOPE
10250113 3688 || curop->op_type == OP_LEAVE
e80b829c 3689 || (PL_opargs[curop->op_type] & OA_DANGEROUS)) {
79072805 3690 if (curop->op_type == OP_GV) {
6136c704 3691 GV * const gv = cGVOPx_gv(curop);
ce862d02 3692 repl_has_vars = 1;
f702bf4a 3693 if (strchr("&`'123456789+-\016\022", *GvENAME(gv)))
79072805
LW
3694 break;
3695 }
3696 else if (curop->op_type == OP_RV2CV)
3697 break;
3698 else if (curop->op_type == OP_RV2SV ||
3699 curop->op_type == OP_RV2AV ||
3700 curop->op_type == OP_RV2HV ||
3701 curop->op_type == OP_RV2GV) {
3702 if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
3703 break;
3704 }
748a9306
LW
3705 else if (curop->op_type == OP_PADSV ||
3706 curop->op_type == OP_PADAV ||
3707 curop->op_type == OP_PADHV ||
e80b829c
RGS
3708 curop->op_type == OP_PADANY)
3709 {
ce862d02 3710 repl_has_vars = 1;
748a9306 3711 }
1167e5da 3712 else if (curop->op_type == OP_PUSHRE)
6f207bd3 3713 NOOP; /* Okay here, dangerous in newASSIGNOP */
79072805
LW
3714 else
3715 break;
3716 }
3717 lastop = curop;
3718 }
748a9306 3719 }
ce862d02 3720 if (curop == repl
e80b829c
RGS
3721 && !(repl_has_vars
3722 && (!PM_GETRE(pm)
07bc277f 3723 || RX_EXTFLAGS(PM_GETRE(pm)) & RXf_EVAL_SEEN)))
3be69782 3724 {
748a9306 3725 pm->op_pmflags |= PMf_CONST; /* const for long enough */
11343788 3726 prepend_elem(o->op_type, scalar(repl), o);
748a9306
LW
3727 }
3728 else {
aaa362c4 3729 if (curop == repl && !PM_GETRE(pm)) { /* Has variables. */
ce862d02 3730 pm->op_pmflags |= PMf_MAYBE_CONST;
ce862d02 3731 }
b7dc083c 3732 NewOp(1101, rcop, 1, LOGOP);
748a9306 3733 rcop->op_type = OP_SUBSTCONT;
22c35a8c 3734 rcop->op_ppaddr = PL_ppaddr[OP_SUBSTCONT];
748a9306
LW
3735 rcop->op_first = scalar(repl);
3736 rcop->op_flags |= OPf_KIDS;
3737 rcop->op_private = 1;
11343788 3738 rcop->op_other = o;
748a9306
LW
3739
3740 /* establish postfix order */
3741 rcop->op_next = LINKLIST(repl);
3742 repl->op_next = (OP*)rcop;
3743
20e98b0f 3744 pm->op_pmreplrootu.op_pmreplroot = scalar((OP*)rcop);
29f2e912
NC
3745 assert(!(pm->op_pmflags & PMf_ONCE));
3746 pm->op_pmstashstartu.op_pmreplstart = LINKLIST(rcop);
748a9306 3747 rcop->op_next = 0;
79072805
LW
3748 }
3749 }
3750
3751 return (OP*)pm;
3752}
3753
3754OP *
864dbfa3 3755Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
79072805 3756{
27da23d5 3757 dVAR;
79072805 3758 SVOP *svop;
7918f24d
NC
3759
3760 PERL_ARGS_ASSERT_NEWSVOP;
3761
e69777c1
GG
3762 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP
3763 || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
3764 || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP);
3765
b7dc083c 3766 NewOp(1101, svop, 1, SVOP);
eb160463 3767 svop->op_type = (OPCODE)type;
22c35a8c 3768 svop->op_ppaddr = PL_ppaddr[type];
79072805
LW
3769 svop->op_sv = sv;
3770 svop->op_next = (OP*)svop;
eb160463 3771 svop->op_flags = (U8)flags;
22c35a8c 3772 if (PL_opargs[type] & OA_RETSCALAR)
463ee0b2 3773 scalar((OP*)svop);
22c35a8c 3774 if (PL_opargs[type] & OA_TARGET)
ed6116ce 3775 svop->op_targ = pad_alloc(type, SVs_PADTMP);
e50aee73 3776 return CHECKOP(type, svop);
79072805
LW
3777}
3778
392d04bb 3779#ifdef USE_ITHREADS
79072805 3780OP *
350de78d
GS
3781Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv)
3782{
27da23d5 3783 dVAR;
350de78d 3784 PADOP *padop;
7918f24d
NC
3785
3786 PERL_ARGS_ASSERT_NEWPADOP;
3787
e69777c1
GG
3788 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_SVOP
3789 || (PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
3790 || (PL_opargs[type] & OA_CLASS_MASK) == OA_FILESTATOP);
3791
350de78d 3792 NewOp(1101, padop, 1, PADOP);
eb160463 3793 padop->op_type = (OPCODE)type;
350de78d
GS
3794 padop->op_ppaddr = PL_ppaddr[type];
3795 padop->op_padix = pad_alloc(type, SVs_PADTMP);
dd2155a4
DM
3796 SvREFCNT_dec(PAD_SVl(padop->op_padix));
3797 PAD_SETSV(padop->op_padix, sv);
58182927
NC
3798 assert(sv);
3799 SvPADTMP_on(sv);
350de78d 3800 padop->op_next = (OP*)padop;
eb160463 3801 padop->op_flags = (U8)flags;
350de78d
GS
3802 if (PL_opargs[type] & OA_RETSCALAR)
3803 scalar((OP*)padop);
3804 if (PL_opargs[type] & OA_TARGET)
3805 padop->op_targ = pad_alloc(type, SVs_PADTMP);
3806 return CHECKOP(type, padop);
3807}
392d04bb 3808#endif
350de78d
GS
3809
3810OP *
864dbfa3 3811Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
79072805 3812{
27da23d5 3813 dVAR;
7918f24d
NC
3814
3815 PERL_ARGS_ASSERT_NEWGVOP;
3816
350de78d 3817#ifdef USE_ITHREADS
58182927 3818 GvIN_PAD_on(gv);
ff8997d7 3819 return newPADOP(type, flags, SvREFCNT_inc_simple_NN(gv));
350de78d 3820#else
ff8997d7 3821 return newSVOP(type, flags, SvREFCNT_inc_simple_NN(gv));
350de78d 3822#endif
79072805
LW
3823}
3824
3825OP *
864dbfa3 3826Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
79072805 3827{
27da23d5 3828 dVAR;
79072805 3829 PVOP *pvop;
e69777c1
GG
3830
3831 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_PVOP_OR_SVOP
3832 || (PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
3833
b7dc083c 3834 NewOp(1101, pvop, 1, PVOP);
eb160463 3835 pvop->op_type = (OPCODE)type;
22c35a8c 3836 pvop->op_ppaddr = PL_ppaddr[type];
79072805
LW
3837 pvop->op_pv = pv;
3838 pvop->op_next = (OP*)pvop;
eb160463 3839 pvop->op_flags = (U8)flags;
22c35a8c 3840 if (PL_opargs[type] & OA_RETSCALAR)
463ee0b2 3841 scalar((OP*)pvop);
22c35a8c 3842 if (PL_opargs[type] & OA_TARGET)
ed6116ce 3843 pvop->op_targ = pad_alloc(type, SVs_PADTMP);
e50aee73 3844 return CHECKOP(type, pvop);
79072805
LW
3845}
3846
eb8433b7
NC
3847#ifdef PERL_MAD
3848OP*
3849#else
79072805 3850void
eb8433b7 3851#endif
864dbfa3 3852Perl_package(pTHX_ OP *o)
79072805 3853{
97aff369 3854 dVAR;
bf070237 3855 SV *const sv = cSVOPo->op_sv;
eb8433b7
NC
3856#ifdef PERL_MAD
3857 OP *pegop;
3858#endif
79072805 3859
7918f24d
NC
3860 PERL_ARGS_ASSERT_PACKAGE;
3861
3280af22
NIS
3862 save_hptr(&PL_curstash);
3863 save_item(PL_curstname);
de11ba31 3864
bf070237 3865 PL_curstash = gv_stashsv(sv, GV_ADD);
e1a479c5 3866
bf070237 3867 sv_setsv(PL_curstname, sv);
de11ba31 3868
7ad382f4 3869 PL_hints |= HINT_BLOCK_SCOPE;
53a7735b
DM
3870 PL_parser->copline = NOLINE;
3871 PL_parser->expect = XSTATE;
eb8433b7
NC
3872
3873#ifndef PERL_MAD
3874 op_free(o);
3875#else
3876 if (!PL_madskills) {
3877 op_free(o);
1d866c12 3878 return NULL;
eb8433b7
NC
3879 }
3880
3881 pegop = newOP(OP_NULL,0);
3882 op_getmad(o,pegop,'P');
3883 return pegop;
3884#endif
79072805
LW
3885}
3886
6fa4d285
DG
3887void
3888Perl_package_version( pTHX_ OP *v )
3889{
3890 dVAR;
458818ec 3891 U32 savehints = PL_hints;
6fa4d285 3892 PERL_ARGS_ASSERT_PACKAGE_VERSION;
458818ec 3893 PL_hints &= ~HINT_STRICT_VARS;
e92f586b 3894 sv_setsv( GvSV(gv_fetchpvs("VERSION", GV_ADDMULTI, SVt_PV)), cSVOPx(v)->op_sv );
458818ec 3895 PL_hints = savehints;
6fa4d285
DG
3896 op_free(v);
3897}
3898
eb8433b7
NC
3899#ifdef PERL_MAD
3900OP*
3901#else
85e6fe83 3902void
eb8433b7 3903#endif
88d95a4d 3904Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
85e6fe83 3905{
97aff369 3906 dVAR;
a0d0e21e 3907 OP *pack;
a0d0e21e 3908 OP *imop;
b1cb66bf 3909 OP *veop;
eb8433b7
NC
3910#ifdef PERL_MAD
3911 OP *pegop = newOP(OP_NULL,0);
3912#endif
85e6fe83 3913
7918f24d
NC
3914 PERL_ARGS_ASSERT_UTILIZE;
3915
88d95a4d 3916 if (idop->op_type != OP_CONST)
cea2e8a9 3917 Perl_croak(aTHX_ "Module name must be constant");
85e6fe83 3918
eb8433b7
NC
3919 if (PL_madskills)
3920 op_getmad(idop,pegop,'U');
3921
5f66b61c 3922 veop = NULL;
b1cb66bf 3923
aec46f14 3924 if (version) {
551405c4 3925 SV * const vesv = ((SVOP*)version)->op_sv;
b1cb66bf 3926
eb8433b7
NC
3927 if (PL_madskills)
3928 op_getmad(version,pegop,'V');
aec46f14 3929 if (!arg && !SvNIOKp(vesv)) {
b1cb66bf 3930 arg = version;
3931 }
3932 else {
3933 OP *pack;
0f79a09d 3934 SV *meth;
b1cb66bf 3935
44dcb63b 3936 if (version->op_type != OP_CONST || !SvNIOKp(vesv))
fe13d51d 3937 Perl_croak(aTHX_ "Version number must be a constant number");
b1cb66bf 3938
88d95a4d
JH
3939 /* Make copy of idop so we don't free it twice */
3940 pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
b1cb66bf 3941
3942 /* Fake up a method call to VERSION */
18916d0d 3943 meth = newSVpvs_share("VERSION");
b1cb66bf 3944 veop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
3945 append_elem(OP_LIST,
0f79a09d
GS
3946 prepend_elem(OP_LIST, pack, list(version)),
3947 newSVOP(OP_METHOD_NAMED, 0, meth)));
b1cb66bf 3948 }
3949 }
aeea060c 3950
a0d0e21e 3951 /* Fake up an import/unimport */
eb8433b7
NC
3952 if (arg && arg->op_type == OP_STUB) {
3953 if (PL_madskills)
3954 op_getmad(arg,pegop,'S');
4633a7c4 3955 imop = arg; /* no import on explicit () */
eb8433b7 3956 }
88d95a4d 3957 else if (SvNIOKp(((SVOP*)idop)->op_sv)) {
5f66b61c 3958 imop = NULL; /* use 5.0; */
468aa647
RGS
3959 if (!aver)
3960 idop->op_private |= OPpCONST_NOVER;
b1cb66bf 3961 }
4633a7c4 3962 else {
0f79a09d
GS
3963 SV *meth;
3964
eb8433b7
NC
3965 if (PL_madskills)
3966 op_getmad(arg,pegop,'A');
3967
88d95a4d
JH
3968 /* Make copy of idop so we don't free it twice */
3969 pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
0f79a09d
GS
3970
3971 /* Fake up a method call to import/unimport */
427d62a4 3972 meth = aver
18916d0d 3973 ? newSVpvs_share("import") : newSVpvs_share("unimport");
4633a7c4 3974 imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
0f79a09d
GS
3975 append_elem(OP_LIST,
3976 prepend_elem(OP_LIST, pack, list(arg)),
3977 newSVOP(OP_METHOD_NAMED, 0, meth)));
4633a7c4
LW
3978 }
3979
a0d0e21e 3980 /* Fake up the BEGIN {}, which does its thing immediately. */
09bef843 3981 newATTRSUB(floor,
18916d0d 3982 newSVOP(OP_CONST, 0, newSVpvs_share("BEGIN")),
5f66b61c
AL
3983 NULL,
3984 NULL,
a0d0e21e 3985 append_elem(OP_LINESEQ,
b1cb66bf 3986 append_elem(OP_LINESEQ,
bd61b366
SS
3987 newSTATEOP(0, NULL, newUNOP(OP_REQUIRE, 0, idop)),
3988 newSTATEOP(0, NULL, veop)),
3989 newSTATEOP(0, NULL, imop) ));
85e6fe83 3990
70f5e4ed
JH
3991 /* The "did you use incorrect case?" warning used to be here.
3992 * The problem is that on case-insensitive filesystems one
3993 * might get false positives for "use" (and "require"):
3994 * "use Strict" or "require CARP" will work. This causes
3995 * portability problems for the script: in case-strict
3996 * filesystems the script will stop working.
3997 *
3998 * The "incorrect case" warning checked whether "use Foo"
3999 * imported "Foo" to your namespace, but that is wrong, too:
4000 * there is no requirement nor promise in the language that
4001 * a Foo.pm should or would contain anything in package "Foo".
4002 *
4003 * There is very little Configure-wise that can be done, either:
4004 * the case-sensitivity of the build filesystem of Perl does not
4005 * help in guessing the case-sensitivity of the runtime environment.
4006 */
18fc9488 4007
c305c6a0 4008 PL_hints |= HINT_BLOCK_SCOPE;
53a7735b
DM
4009 PL_parser->copline = NOLINE;
4010 PL_parser->expect = XSTATE;
8ec8fbef 4011 PL_cop_seqmax++; /* Purely for B::*'s benefit */
eb8433b7
NC
4012
4013#ifdef PERL_MAD
4014 if (!PL_madskills) {
4015 /* FIXME - don't allocate pegop if !PL_madskills */
4016 op_free(pegop);
1d866c12 4017 return NULL;
eb8433b7
NC
4018 }
4019 return pegop;
4020#endif
85e6fe83
LW
4021}
4022
7d3fb230 4023/*
ccfc67b7
JH
4024=head1 Embedding Functions
4025
7d3fb230
BS
4026=for apidoc load_module
4027
4028Loads the module whose name is pointed to by the string part of name.
4029Note that the actual module name, not its filename, should be given.
4030Eg, "Foo::Bar" instead of "Foo/Bar.pm". flags can be any of
4031PERL_LOADMOD_DENY, PERL_LOADMOD_NOIMPORT, or PERL_LOADMOD_IMPORT_OPS
4032(or 0 for no flags). ver, if specified, provides version semantics
4033similar to C<use Foo::Bar VERSION>. The optional trailing SV*
4034arguments can be used to specify arguments to the module's import()
76f108ac
JD
4035method, similar to C<use Foo::Bar VERSION LIST>. They must be
4036terminated with a final NULL pointer. Note that this list can only
4037be omitted when the PERL_LOADMOD_NOIMPORT flag has been used.
4038Otherwise at least a single NULL pointer to designate the default
4039import list is required.
7d3fb230
BS
4040
4041=cut */
4042
e4783991
GS
4043void
4044Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...)
4045{
4046 va_list args;
7918f24d
NC
4047
4048 PERL_ARGS_ASSERT_LOAD_MODULE;
4049
e4783991
GS
4050 va_start(args, ver);
4051 vload_module(flags, name, ver, &args);
4052 va_end(args);
4053}
4054
4055#ifdef PERL_IMPLICIT_CONTEXT
4056void
4057Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...)
4058{
4059 dTHX;
4060 va_list args;
7918f24d 4061 PERL_ARGS_ASSERT_LOAD_MODULE_NOCONTEXT;
e4783991
GS
4062 va_start(args, ver);
4063 vload_module(flags, name, ver, &args);
4064 va_end(args);
4065}
4066#endif
4067
4068void
4069Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args)
4070{
97aff369 4071 dVAR;
551405c4 4072 OP *veop, *imop;
551405c4 4073 OP * const modname = newSVOP(OP_CONST, 0, name);
7918f24d
NC
4074
4075 PERL_ARGS_ASSERT_VLOAD_MODULE;
4076
e4783991
GS
4077 modname->op_private |= OPpCONST_BARE;
4078 if (ver) {
4079 veop = newSVOP(OP_CONST, 0, ver);
4080 }
4081 else
5f66b61c 4082 veop = NULL;
e4783991
GS
4083 if (flags & PERL_LOADMOD_NOIMPORT) {
4084 imop = sawparens(newNULLLIST());
4085 }
4086 else if (flags & PERL_LOADMOD_IMPORT_OPS) {
4087 imop = va_arg(*args, OP*);
4088 }
4089 else {
4090 SV *sv;
5f66b61c 4091 imop = NULL;
e4783991
GS
4092 sv = va_arg(*args, SV*);
4093 while (sv) {
4094 imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
4095 sv = va_arg(*args, SV*);
4096 }
4097 }
81885997 4098
53a7735b
DM
4099 /* utilize() fakes up a BEGIN { require ..; import ... }, so make sure
4100 * that it has a PL_parser to play with while doing that, and also
4101 * that it doesn't mess with any existing parser, by creating a tmp
4102 * new parser with lex_start(). This won't actually be used for much,
4103 * since pp_require() will create another parser for the real work. */
4104
4105 ENTER;
4106 SAVEVPTR(PL_curcop);
5486870f 4107 lex_start(NULL, NULL, FALSE);
53a7735b
DM
4108 utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
4109 veop, modname, imop);
4110 LEAVE;
e4783991
GS
4111}
4112
79072805 4113OP *
850e8516 4114Perl_dofile(pTHX_ OP *term, I32 force_builtin)
78ca652e 4115{
97aff369 4116 dVAR;
78ca652e 4117 OP *doop;
a0714e2c 4118 GV *gv = NULL;
78ca652e 4119
7918f24d
NC
4120 PERL_ARGS_ASSERT_DOFILE;
4121
850e8516 4122 if (!force_builtin) {
fafc274c 4123 gv = gv_fetchpvs("do", GV_NOTQUAL, SVt_PVCV);
850e8516 4124 if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
a4fc7abc 4125 GV * const * const gvp = (GV**)hv_fetchs(PL_globalstash, "do", FALSE);
a0714e2c 4126 gv = gvp ? *gvp : NULL;
850e8516
RGS
4127 }
4128 }
78ca652e 4129
b9f751c0 4130 if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
78ca652e
GS
4131 doop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
4132 append_elem(OP_LIST, term,
4133 scalar(newUNOP(OP_RV2CV, 0,
d4c19fe8 4134 newGVOP(OP_GV, 0, gv))))));
78ca652e
GS
4135 }
4136 else {
4137 doop = newUNOP(OP_DOFILE, 0, scalar(term));
4138 }
4139 return doop;
4140}
4141
4142OP *
864dbfa3 4143Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
79072805
LW
4144{
4145 return newBINOP(OP_LSLICE, flags,
8990e307
LW
4146 list(force_list(subscript)),
4147 list(force_list(listval)) );
79072805
LW
4148}
4149
76e3520e 4150STATIC I32
504618e9 4151S_is_list_assignment(pTHX_ register const OP *o)
79072805 4152{
1496a290
AL
4153 unsigned type;
4154 U8 flags;
4155
11343788 4156 if (!o)
79072805
LW
4157 return TRUE;
4158
1496a290 4159 if ((o->op_type == OP_NULL) && (o->op_flags & OPf_KIDS))
11343788 4160 o = cUNOPo->op_first;
79072805 4161
1496a290
AL
4162 flags = o->op_flags;
4163 type = o->op_type;
4164 if (type == OP_COND_EXPR) {
504618e9
AL
4165 const I32 t = is_list_assignment(cLOGOPo->op_first->op_sibling);
4166 const I32 f = is_list_assignment(cLOGOPo->op_first->op_sibling->op_sibling);
79072805
LW
4167
4168 if (t && f)
4169 return TRUE;
4170 if (t || f)
4171 yyerror("Assignment to both a list and a scalar");
4172 return FALSE;
4173 }
4174
1496a290
AL
4175 if (type == OP_LIST &&
4176 (flags & OPf_WANT) == OPf_WANT_SCALAR &&
95f0a2f1
SB
4177 o->op_private & OPpLVAL_INTRO)
4178 return FALSE;
4179
1496a290
AL
4180 if (type == OP_LIST || flags & OPf_PARENS ||
4181 type == OP_RV2AV || type == OP_RV2HV ||
4182 type == OP_ASLICE || type == OP_HSLICE)
79072805
LW
4183 return TRUE;
4184
1496a290 4185 if (type == OP_PADAV || type == OP_PADHV)
93a17b20
LW
4186 return TRUE;
4187
1496a290 4188 if (type == OP_RV2SV)
79072805
LW
4189 return FALSE;
4190
4191 return FALSE;
4192}
4193
4194OP *
864dbfa3 4195Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
79072805 4196{
97aff369 4197 dVAR;
11343788 4198 OP *o;
79072805 4199
a0d0e21e 4200 if (optype) {
c963b151 4201 if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN || optype == OP_DORASSIGN) {
a0d0e21e
LW
4202 return newLOGOP(optype, 0,
4203 mod(scalar(left), optype),
4204 newUNOP(OP_SASSIGN, 0, scalar(right)));
4205 }
4206 else {
4207 return newBINOP(optype, OPf_STACKED,
4208 mod(scalar(left), optype), scalar(right));
4209 }
4210 }
4211
504618e9 4212 if (is_list_assignment(left)) {
6dbe9451
NC
4213 static const char no_list_state[] = "Initialization of state variables"
4214 " in list context currently forbidden";
10c8fecd 4215 OP *curop;
fafafbaf 4216 bool maybe_common_vars = TRUE;
10c8fecd 4217
3280af22 4218 PL_modcount = 0;
dbfe47cf
RD
4219 /* Grandfathering $[ assignment here. Bletch.*/
4220 /* Only simple assignments like C<< ($[) = 1 >> are allowed */
fe5bfecd 4221 PL_eval_start = (left->op_type == OP_CONST) ? right : NULL;
463ee0b2 4222 left = mod(left, OP_AASSIGN);
3280af22
NIS
4223 if (PL_eval_start)
4224 PL_eval_start = 0;
dbfe47cf 4225 else if (left->op_type == OP_CONST) {
eb8433b7 4226 /* FIXME for MAD */
dbfe47cf
RD
4227 /* Result of assignment is always 1 (or we'd be dead already) */
4228 return newSVOP(OP_CONST, 0, newSViv(1));
a0d0e21e 4229 }
10c8fecd
GS
4230 curop = list(force_list(left));
4231 o = newBINOP(OP_AASSIGN, flags, list(force_list(right)), curop);
eb160463 4232 o->op_private = (U8)(0 | (flags >> 8));
dd2155a4 4233
fafafbaf
RD
4234 if ((left->op_type == OP_LIST
4235 || (left->op_type == OP_NULL && left->op_targ == OP_LIST)))
4236 {
4237 OP* lop = ((LISTOP*)left)->op_first;
4238 maybe_common_vars = FALSE;
4239 while (lop) {
4240 if (lop->op_type == OP_PADSV ||
4241 lop->op_type == OP_PADAV ||
4242 lop->op_type == OP_PADHV ||
4243 lop->op_type == OP_PADANY) {
4244 if (!(lop->op_private & OPpLVAL_INTRO))
4245 maybe_common_vars = TRUE;
4246
4247 if (lop->op_private & OPpPAD_STATE) {
4248 if (left->op_private & OPpLVAL_INTRO) {
4249 /* Each variable in state($a, $b, $c) = ... */
4250 }
4251 else {
4252 /* Each state variable in
4253 (state $a, my $b, our $c, $d, undef) = ... */
4254 }
4255 yyerror(no_list_state);
4256 } else {
4257 /* Each my variable in
4258 (state $a, my $b, our $c, $d, undef) = ... */
4259 }
4260 } else if (lop->op_type == OP_UNDEF ||
4261 lop->op_type == OP_PUSHMARK) {
4262 /* undef may be interesting in
4263 (state $a, undef, state $c) */
4264 } else {
4265 /* Other ops in the list. */
4266 maybe_common_vars = TRUE;
4267 }
4268 lop = lop->op_sibling;
4269 }
4270 }
4271 else if ((left->op_private & OPpLVAL_INTRO)
4272 && ( left->op_type == OP_PADSV
4273 || left->op_type == OP_PADAV
4274 || left->op_type == OP_PADHV
4275 || left->op_type == OP_PADANY))
4276 {
4277 maybe_common_vars = FALSE;
4278 if (left->op_private & OPpPAD_STATE) {
4279 /* All single variable list context state assignments, hence
4280 state ($a) = ...
4281 (state $a) = ...
4282 state @a = ...
4283 state (@a) = ...
4284 (state @a) = ...
4285 state %a = ...
4286 state (%a) = ...
4287 (state %a) = ...
4288 */
4289 yyerror(no_list_state);
4290 }
4291 }
4292
dd2155a4
DM
4293 /* PL_generation sorcery:
4294 * an assignment like ($a,$b) = ($c,$d) is easier than
4295 * ($a,$b) = ($c,$a), since there is no need for temporary vars.
4296 * To detect whether there are common vars, the global var
4297 * PL_generation is incremented for each assign op we compile.
4298 * Then, while compiling the assign op, we run through all the
4299 * variables on both sides of the assignment, setting a spare slot
4300 * in each of them to PL_generation. If any of them already have
4301 * that value, we know we've got commonality. We could use a
4302 * single bit marker, but then we'd have to make 2 passes, first
4303 * to clear the flag, then to test and set it. To find somewhere
931b58fb 4304 * to store these values, evil chicanery is done with SvUVX().
dd2155a4
DM
4305 */
4306
fafafbaf 4307 if (maybe_common_vars) {
11343788 4308 OP *lastop = o;
3280af22 4309 PL_generation++;
11343788 4310 for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
22c35a8c 4311 if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
79072805 4312 if (curop->op_type == OP_GV) {
638eceb6 4313 GV *gv = cGVOPx_gv(curop);
169d2d72
NC
4314 if (gv == PL_defgv
4315 || (int)GvASSIGN_GENERATION(gv) == PL_generation)
79072805 4316 break;
169d2d72 4317 GvASSIGN_GENERATION_set(gv, PL_generation);
79072805 4318 }
748a9306
LW
4319 else if (curop->op_type == OP_PADSV ||
4320 curop->op_type == OP_PADAV ||
4321 curop->op_type == OP_PADHV ||
dd2155a4
DM
4322 curop->op_type == OP_PADANY)
4323 {
4324 if (PAD_COMPNAME_GEN(curop->op_targ)
92251a1e 4325 == (STRLEN)PL_generation)
748a9306 4326 break;
b162af07 4327 PAD_COMPNAME_GEN_set(curop->op_targ, PL_generation);
dd2155a4 4328
748a9306 4329 }
79072805
LW
4330 else if (curop->op_type == OP_RV2CV)
4331 break;
4332 else if (curop->op_type == OP_RV2SV ||
4333 curop->op_type == OP_RV2AV ||
4334 curop->op_type == OP_RV2HV ||
4335 curop->op_type == OP_RV2GV) {
4336 if (lastop->op_type != OP_GV) /* funny deref? */
4337 break;
4338 }
1167e5da 4339 else if (curop->op_type == OP_PUSHRE) {
b3f5893f 4340#ifdef USE_ITHREADS
20e98b0f 4341 if (((PMOP*)curop)->op_pmreplrootu.op_pmtargetoff) {
159b6efe 4342 GV *const gv = MUTABLE_GV(PAD_SVl(((PMOP*)curop)->op_pmreplrootu.op_pmtargetoff));
169d2d72
NC
4343 if (gv == PL_defgv
4344 || (int)GvASSIGN_GENERATION(gv) == PL_generation)
1167e5da 4345 break;
169d2d72 4346 GvASSIGN_GENERATION_set(gv, PL_generation);
20e98b0f
NC
4347 }
4348#else
4349 GV *const gv
4350 = ((PMOP*)curop)->op_pmreplrootu.op_pmtargetgv;
4351 if (gv) {
4352 if (gv == PL_defgv
4353 || (int)GvASSIGN_GENERATION(gv) == PL_generation)
4354 break;
169d2d72 4355 GvASSIGN_GENERATION_set(gv, PL_generation);
b2ffa427 4356 }
20e98b0f 4357#endif
1167e5da 4358 }
79072805
LW
4359 else
4360 break;
4361 }
4362 lastop = curop;
4363 }
11343788 4364 if (curop != o)
10c8fecd 4365 o->op_private |= OPpASSIGN_COMMON;
461824dc 4366 }
9fdc7570 4367
e9cc17ba 4368 if (right && right->op_type == OP_SPLIT && !PL_madskills) {
1496a290
AL
4369 OP* tmpop = ((LISTOP*)right)->op_first;
4370 if (tmpop && (tmpop->op_type == OP_PUSHRE)) {
551405c4 4371 PMOP * const pm = (PMOP*)tmpop;
c07a80fd 4372 if (left->op_type == OP_RV2AV &&
4373 !(left->op_private & OPpLVAL_INTRO) &&
11343788 4374 !(o->op_private & OPpASSIGN_COMMON) )
c07a80fd 4375 {
4376 tmpop = ((UNOP*)left)->op_first;
20e98b0f
NC
4377 if (tmpop->op_type == OP_GV
4378#ifdef USE_ITHREADS
4379 && !pm->op_pmreplrootu.op_pmtargetoff
4380#else
4381 && !pm->op_pmreplrootu.op_pmtargetgv
4382#endif
4383 ) {
971a9dd3 4384#ifdef USE_ITHREADS
20e98b0f
NC
4385 pm->op_pmreplrootu.op_pmtargetoff
4386 = cPADOPx(tmpop)->op_padix;
971a9dd3
GS
4387 cPADOPx(tmpop)->op_padix = 0; /* steal it */
4388#else
20e98b0f 4389 pm->op_pmreplrootu.op_pmtargetgv
159b6efe 4390 = MUTABLE_GV(cSVOPx(tmpop)->op_sv);
a0714e2c 4391 cSVOPx(tmpop)->op_sv = NULL; /* steal it */
971a9dd3 4392#endif
c07a80fd 4393 pm->op_pmflags |= PMf_ONCE;
11343788 4394 tmpop = cUNOPo->op_first; /* to list (nulled) */
c07a80fd 4395 tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
5f66b61c 4396 tmpop->op_sibling = NULL; /* don't free split */
c07a80fd 4397 right->op_next = tmpop->op_next; /* fix starting loc */
11343788 4398 op_free(o); /* blow off assign */
54310121 4399 right->op_flags &= ~OPf_WANT;
a5f75d66 4400 /* "I don't know and I don't care." */
c07a80fd 4401 return right;
4402 }
4403 }
4404 else {
e6438c1a 4405 if (PL_modcount < RETURN_UNLIMITED_NUMBER &&
c07a80fd 4406 ((LISTOP*)right)->op_last->op_type == OP_CONST)
4407 {
4408 SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
b8de32d5 4409 if (SvIOK(sv) && SvIVX(sv) == 0)
3280af22 4410 sv_setiv(sv, PL_modcount+1);
c07a80fd 4411 }
4412 }
4413 }
4414 }
11343788 4415 return o;
79072805
LW
4416 }
4417 if (!right)
4418 right = newOP(OP_UNDEF, 0);
4419 if (right->op_type == OP_READLINE) {
4420 right->op_flags |= OPf_STACKED;
463ee0b2 4421 return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
79072805 4422 }
a0d0e21e 4423 else {
3280af22 4424 PL_eval_start = right; /* Grandfathering $[ assignment here. Bletch.*/
11343788 4425 o = newBINOP(OP_SASSIGN, flags,
463ee0b2 4426 scalar(right), mod(scalar(left), OP_SASSIGN) );
3280af22
NIS
4427 if (PL_eval_start)
4428 PL_eval_start = 0;
748a9306 4429 else {
27aaedc1 4430 if (!PL_madskills) { /* assignment to $[ is ignored when making a mad dump */
55b67815 4431 deprecate("assignment to $[");
27aaedc1
GG
4432 op_free(o);
4433 o = newSVOP(OP_CONST, 0, newSViv(CopARYBASE_get(&PL_compiling)));
4434 o->op_private |= OPpCONST_ARYBASE;
4435 }
a0d0e21e
LW
4436 }
4437 }
11343788 4438 return o;
79072805
LW
4439}
4440
4441OP *
864dbfa3 4442Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
79072805 4443{
27da23d5 4444 dVAR;
e1ec3a88 4445 const U32 seq = intro_my();
79072805
LW
4446 register COP *cop;
4447
b7dc083c 4448 NewOp(1101, cop, 1, COP);
57843af0 4449 if (PERLDB_LINE && CopLINE(PL_curcop) && PL_curstash != PL_debstash) {
8990e307 4450 cop->op_type = OP_DBSTATE;
22c35a8c 4451 cop->op_ppaddr = PL_ppaddr[ OP_DBSTATE ];
8990e307
LW
4452 }
4453 else {
4454 cop->op_type = OP_NEXTSTATE;
22c35a8c 4455 cop->op_ppaddr = PL_ppaddr[ OP_NEXTSTATE ];
8990e307 4456 }
eb160463 4457 cop->op_flags = (U8)flags;
623e6609 4458 CopHINTS_set(cop, PL_hints);
ff0cee69 4459#ifdef NATIVE_HINTS
4460 cop->op_private |= NATIVE_HINTS;
4461#endif
623e6609 4462 CopHINTS_set(&PL_compiling, CopHINTS_get(cop));
79072805
LW
4463 cop->op_next = (OP*)cop;
4464
bbce6d69 4465 cop->cop_seq = seq;
7b0bddfa 4466 /* CopARYBASE is now "virtual", in that it's stored as a flag bit in
c28fe1ec
NC
4467 CopHINTS and a possible value in cop_hints_hash, so no need to copy it.
4468 */
72dc9ed5 4469 cop->cop_warnings = DUP_WARNINGS(PL_curcop->cop_warnings);
c28fe1ec
NC
4470 cop->cop_hints_hash = PL_curcop->cop_hints_hash;
4471 if (cop->cop_hints_hash) {
cbb1fbea 4472 HINTS_REFCNT_LOCK;
c28fe1ec 4473 cop->cop_hints_hash->refcounted_he_refcnt++;
cbb1fbea 4474 HINTS_REFCNT_UNLOCK;
b3ca2e83 4475 }
dca6062a 4476 if (label) {
dca6062a 4477 cop->cop_hints_hash
012da8e5 4478 = Perl_store_cop_label(aTHX_ cop->cop_hints_hash, label);
dca6062a
NC
4479
4480 PL_hints |= HINT_BLOCK_SCOPE;
4481 /* It seems that we need to defer freeing this pointer, as other parts
4482 of the grammar end up wanting to copy it after this op has been
4483 created. */
4484 SAVEFREEPV(label);
dca6062a 4485 }
79072805 4486
53a7735b 4487 if (PL_parser && PL_parser->copline == NOLINE)
57843af0 4488 CopLINE_set(cop, CopLINE(PL_curcop));
79072805 4489 else {
53a7735b
DM
4490 CopLINE_set(cop, PL_parser->copline);
4491 if (PL_parser)
4492 PL_parser->copline = NOLINE;
79072805 4493 }
57843af0 4494#ifdef USE_ITHREADS
f4dd75d9 4495 CopFILE_set(cop, CopFILE(PL_curcop)); /* XXX share in a pvtable? */
57843af0 4496#else
f4dd75d9 4497 CopFILEGV_set(cop, CopFILEGV(PL_curcop));
57843af0 4498#endif
11faa288 4499 CopSTASH_set(cop, PL_curstash);
79072805 4500
65269a95
TB
4501 if ((PERLDB_LINE || PERLDB_SAVESRC) && PL_curstash != PL_debstash) {
4502 /* this line can have a breakpoint - store the cop in IV */
80a702cd
RGS
4503 AV *av = CopFILEAVx(PL_curcop);
4504 if (av) {
4505 SV * const * const svp = av_fetch(av, (I32)CopLINE(cop), FALSE);
4506 if (svp && *svp != &PL_sv_undef ) {
4507 (void)SvIOK_on(*svp);
4508 SvIV_set(*svp, PTR2IV(cop));
4509 }
1eb1540c 4510 }
93a17b20
LW
4511 }
4512
f6f3a1fe
RGS
4513 if (flags & OPf_SPECIAL)
4514 op_null((OP*)cop);
722969e2 4515 return prepend_elem(OP_LINESEQ, (OP*)cop, o);
79072805
LW
4516}
4517
bbce6d69 4518
79072805 4519OP *
864dbfa3 4520Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
79072805 4521{
27da23d5 4522 dVAR;
7918f24d
NC
4523
4524 PERL_ARGS_ASSERT_NEWLOGOP;
4525
883ffac3
CS
4526 return new_logop(type, flags, &first, &other);
4527}
4528
3bd495df 4529STATIC OP *
71c4dbc3
VP
4530S_search_const(pTHX_ OP *o)
4531{
4532 PERL_ARGS_ASSERT_SEARCH_CONST;
4533
4534 switch (o->op_type) {
4535 case OP_CONST:
4536 return o;
4537 case OP_NULL:
4538 if (o->op_flags & OPf_KIDS)
4539 return search_const(cUNOPo->op_first);
4540 break;
4541 case OP_LEAVE:
4542 case OP_SCOPE:
4543 case OP_LINESEQ:
4544 {
4545 OP *kid;
4546 if (!(o->op_flags & OPf_KIDS))
4547 return NULL;
4548 kid = cLISTOPo->op_first;
4549 do {
4550 switch (kid->op_type) {
4551 case OP_ENTER:
4552 case OP_NULL:
4553 case OP_NEXTSTATE:
4554 kid = kid->op_sibling;
4555 break;
4556 default:
4557 if (kid != cLISTOPo->op_last)
4558 return NULL;
4559 goto last;
4560 }
4561 } while (kid);
4562 if (!kid)
4563 kid = cLISTOPo->op_last;
4564last:
4565 return search_const(kid);
4566 }
4567 }
4568
4569 return NULL;
4570}
4571
4572STATIC OP *
cea2e8a9 4573S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
883ffac3 4574{
27da23d5 4575 dVAR;
79072805 4576 LOGOP *logop;
11343788 4577 OP *o;
71c4dbc3
VP
4578 OP *first;
4579 OP *other;
4580 OP *cstop = NULL;
edbe35ea 4581 int prepend_not = 0;
79072805 4582
7918f24d
NC
4583 PERL_ARGS_ASSERT_NEW_LOGOP;
4584
71c4dbc3
VP
4585 first = *firstp;
4586 other = *otherp;
4587
a0d0e21e
LW
4588 if (type == OP_XOR) /* Not short circuit, but here by precedence. */
4589 return newBINOP(type, flags, scalar(first), scalar(other));
4590
e69777c1
GG
4591 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LOGOP);
4592
8990e307 4593 scalarboolean(first);
edbe35ea 4594 /* optimize AND and OR ops that have NOTs as children */
68726e16 4595 if (first->op_type == OP_NOT
b6214b80 4596 && (first->op_flags & OPf_KIDS)
edbe35ea
VP
4597 && ((first->op_flags & OPf_SPECIAL) /* unless ($x) { } */
4598 || (other->op_type == OP_NOT)) /* if (!$x && !$y) { } */
b6214b80 4599 && !PL_madskills) {
79072805
LW
4600 if (type == OP_AND || type == OP_OR) {
4601 if (type == OP_AND)
4602 type = OP_OR;
4603 else
4604 type = OP_AND;
07f3cdf5 4605 op_null(first);
edbe35ea 4606 if (other->op_type == OP_NOT) { /* !a AND|OR !b => !(a OR|AND b) */
07f3cdf5 4607 op_null(other);
edbe35ea
VP
4608 prepend_not = 1; /* prepend a NOT op later */
4609 }
79072805
LW
4610 }
4611 }
71c4dbc3
VP
4612 /* search for a constant op that could let us fold the test */
4613 if ((cstop = search_const(first))) {
4614 if (cstop->op_private & OPpCONST_STRICT)
4615 no_bareword_allowed(cstop);
a2a5de95
NC
4616 else if ((cstop->op_private & OPpCONST_BARE))
4617 Perl_ck_warner(aTHX_ packWARN(WARN_BAREWORD), "Bareword found in conditional");
71c4dbc3
VP
4618 if ((type == OP_AND && SvTRUE(((SVOP*)cstop)->op_sv)) ||
4619 (type == OP_OR && !SvTRUE(((SVOP*)cstop)->op_sv)) ||
4620 (type == OP_DOR && !SvOK(((SVOP*)cstop)->op_sv))) {
5f66b61c 4621 *firstp = NULL;
d6fee5c7
DM
4622 if (other->op_type == OP_CONST)
4623 other->op_private |= OPpCONST_SHORTCIRCUIT;
eb8433b7
NC
4624 if (PL_madskills) {
4625 OP *newop = newUNOP(OP_NULL, 0, other);
4626 op_getmad(first, newop, '1');
4627 newop->op_targ = type; /* set "was" field */
4628 return newop;
4629 }
4630 op_free(first);
dd3e51dc
VP
4631 if (other->op_type == OP_LEAVE)
4632 other = newUNOP(OP_NULL, OPf_SPECIAL, other);
79072805
LW
4633 return other;
4634 }
4635 else {
7921d0f2 4636 /* check for C<my $x if 0>, or C<my($x,$y) if 0> */
6867be6d 4637 const OP *o2 = other;
7921d0f2
DM
4638 if ( ! (o2->op_type == OP_LIST
4639 && (( o2 = cUNOPx(o2)->op_first))
4640 && o2->op_type == OP_PUSHMARK
4641 && (( o2 = o2->op_sibling)) )
4642 )
4643 o2 = other;
4644 if ((o2->op_type == OP_PADSV || o2->op_type == OP_PADAV
4645 || o2->op_type == OP_PADHV)
4646 && o2->op_private & OPpLVAL_INTRO
a2a5de95 4647 && !(o2->op_private & OPpPAD_STATE))
7921d0f2 4648 {
d1d15184
NC
4649 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
4650 "Deprecated use of my() in false conditional");
7921d0f2
DM
4651 }
4652
5f66b61c 4653 *otherp = NULL;
d6fee5c7
DM
4654 if (first->op_type == OP_CONST)
4655 first->op_private |= OPpCONST_SHORTCIRCUIT;
eb8433b7
NC
4656 if (PL_madskills) {
4657 first = newUNOP(OP_NULL, 0, first);
4658 op_getmad(other, first, '2');
4659 first->op_targ = type; /* set "was" field */
4660 }
4661 else
4662 op_free(other);
79072805
LW
4663 return first;
4664 }
4665 }
041457d9
DM
4666 else if ((first->op_flags & OPf_KIDS) && type != OP_DOR
4667 && ckWARN(WARN_MISC)) /* [#24076] Don't warn for <FH> err FOO. */
59e10468 4668 {
b22e6366
AL
4669 const OP * const k1 = ((UNOP*)first)->op_first;
4670 const OP * const k2 = k1->op_sibling;
a6006777 4671 OPCODE warnop = 0;
4672 switch (first->op_type)
4673 {
4674 case OP_NULL:
4675 if (k2 && k2->op_type == OP_READLINE
4676 && (k2->op_flags & OPf_STACKED)
1c846c1f 4677 && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
72b16652 4678 {
a6006777 4679 warnop = k2->op_type;
72b16652 4680 }
a6006777 4681 break;
4682
4683 case OP_SASSIGN:
68dc0745 4684 if (k1->op_type == OP_READDIR
4685 || k1->op_type == OP_GLOB
72b16652 4686 || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
68dc0745 4687 || k1->op_type == OP_EACH)
72b16652
GS
4688 {
4689 warnop = ((k1->op_type == OP_NULL)
eb160463 4690 ? (OPCODE)k1->op_targ : k1->op_type);
72b16652 4691 }
a6006777 4692 break;
4693 }
8ebc5c01 4694 if (warnop) {
6867be6d 4695 const line_t oldline = CopLINE(PL_curcop);
53a7735b 4696 CopLINE_set(PL_curcop, PL_parser->copline);
9014280d 4697 Perl_warner(aTHX_ packWARN(WARN_MISC),
599cee73 4698 "Value of %s%s can be \"0\"; test with defined()",
22c35a8c 4699 PL_op_desc[warnop],
68dc0745 4700 ((warnop == OP_READLINE || warnop == OP_GLOB)
4701 ? " construct" : "() operator"));
57843af0 4702 CopLINE_set(PL_curcop, oldline);
8ebc5c01 4703 }
a6006777 4704 }
79072805
LW
4705
4706 if (!other)
4707 return first;
4708
c963b151 4709 if (type == OP_ANDASSIGN || type == OP_ORASSIGN || type == OP_DORASSIGN)
a0d0e21e
LW
4710 other->op_private |= OPpASSIGN_BACKWARDS; /* other is an OP_SASSIGN */
4711
b7dc083c 4712 NewOp(1101, logop, 1, LOGOP);
79072805 4713
eb160463 4714 logop->op_type = (OPCODE)type;
22c35a8c 4715 logop->op_ppaddr = PL_ppaddr[type];
79072805 4716 logop->op_first = first;
585ec06d 4717 logop->op_flags = (U8)(flags | OPf_KIDS);
79072805 4718 logop->op_other = LINKLIST(other);
eb160463 4719 logop->op_private = (U8)(1 | (flags >> 8));
79072805
LW
4720
4721 /* establish postfix order */
4722 logop->op_next = LINKLIST(first);
4723 first->op_next = (OP*)logop;
4724 first->op_sibling = other;
4725
463d09e6
RGS
4726 CHECKOP(type,logop);
4727
edbe35ea 4728 o = newUNOP(prepend_not ? OP_NOT : OP_NULL, 0, (OP*)logop);
11343788 4729 other->op_next = o;
79072805 4730
11343788 4731 return o;
79072805
LW
4732}
4733
4734OP *
864dbfa3 4735Perl_newCONDOP(pTHX_ I32 flags, OP *first, OP *trueop, OP *falseop)
79072805 4736{
27da23d5 4737 dVAR;
1a67a97c
SM
4738 LOGOP *logop;
4739 OP *start;
11343788 4740 OP *o;
71c4dbc3 4741 OP *cstop;
79072805 4742
7918f24d
NC
4743 PERL_ARGS_ASSERT_NEWCONDOP;
4744
b1cb66bf 4745 if (!falseop)
4746 return newLOGOP(OP_AND, 0, first, trueop);
4747 if (!trueop)
4748 return newLOGOP(OP_OR, 0, first, falseop);
79072805 4749
8990e307 4750 scalarboolean(first);
71c4dbc3 4751 if ((cstop = search_const(first))) {
5b6782b2 4752 /* Left or right arm of the conditional? */
71c4dbc3 4753 const bool left = SvTRUE(((SVOP*)cstop)->op_sv);
5b6782b2
NC
4754 OP *live = left ? trueop : falseop;
4755 OP *const dead = left ? falseop : trueop;
71c4dbc3
VP
4756 if (cstop->op_private & OPpCONST_BARE &&
4757 cstop->op_private & OPpCONST_STRICT) {
4758 no_bareword_allowed(cstop);
b22e6366 4759 }
5b6782b2
NC
4760 if (PL_madskills) {
4761 /* This is all dead code when PERL_MAD is not defined. */
4762 live = newUNOP(OP_NULL, 0, live);
4763 op_getmad(first, live, 'C');
4764 op_getmad(dead, live, left ? 'e' : 't');
4765 } else {
4766 op_free(first);
4767 op_free(dead);
79072805 4768 }
ef9da979
FC
4769 if (live->op_type == OP_LEAVE)
4770 live = newUNOP(OP_NULL, OPf_SPECIAL, live);
5b6782b2 4771 return live;
79072805 4772 }
1a67a97c
SM
4773 NewOp(1101, logop, 1, LOGOP);
4774 logop->op_type = OP_COND_EXPR;
4775 logop->op_ppaddr = PL_ppaddr[OP_COND_EXPR];
4776 logop->op_first = first;
585ec06d 4777 logop->op_flags = (U8)(flags | OPf_KIDS);
eb160463 4778 logop->op_private = (U8)(1 | (flags >> 8));
1a67a97c
SM
4779 logop->op_other = LINKLIST(trueop);
4780 logop->op_next = LINKLIST(falseop);
79072805 4781
463d09e6
RGS
4782 CHECKOP(OP_COND_EXPR, /* that's logop->op_type */
4783 logop);
79072805
LW
4784
4785 /* establish postfix order */
1a67a97c
SM
4786 start = LINKLIST(first);
4787 first->op_next = (OP*)logop;
79072805 4788
b1cb66bf 4789 first->op_sibling = trueop;
4790 trueop->op_sibling = falseop;
1a67a97c 4791 o = newUNOP(OP_NULL, 0, (OP*)logop);
79072805 4792
1a67a97c 4793 trueop->op_next = falseop->op_next = o;
79072805 4794
1a67a97c 4795 o->op_next = start;
11343788 4796 return o;
79072805
LW
4797}
4798
4799OP *
864dbfa3 4800Perl_newRANGE(pTHX_ I32 flags, OP *left, OP *right)
79072805 4801{
27da23d5 4802 dVAR;
1a67a97c 4803 LOGOP *range;
79072805
LW
4804 OP *flip;
4805 OP *flop;
1a67a97c 4806 OP *leftstart;
11343788 4807 OP *o;
79072805 4808
7918f24d
NC
4809 PERL_ARGS_ASSERT_NEWRANGE;
4810
1a67a97c 4811 NewOp(1101, range, 1, LOGOP);
79072805 4812
1a67a97c
SM
4813 range->op_type = OP_RANGE;
4814 range->op_ppaddr = PL_ppaddr[OP_RANGE];
4815 range->op_first = left;
4816 range->op_flags = OPf_KIDS;
4817 leftstart = LINKLIST(left);
4818 range->op_other = LINKLIST(right);
eb160463 4819 range->op_private = (U8)(1 | (flags >> 8));
79072805
LW
4820
4821 left->op_sibling = right;
4822
1a67a97c
SM
4823 range->op_next = (OP*)range;
4824 flip = newUNOP(OP_FLIP, flags, (OP*)range);
79072805 4825 flop = newUNOP(OP_FLOP, 0, flip);
11343788 4826 o = newUNOP(OP_NULL, 0, flop);
79072805 4827 linklist(flop);
1a67a97c 4828 range->op_next = leftstart;
79072805
LW
4829
4830 left->op_next = flip;
4831 right->op_next = flop;
4832
1a67a97c
SM
4833 range->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
4834 sv_upgrade(PAD_SV(range->op_targ), SVt_PVNV);
ed6116ce 4835 flip->op_targ = pad_alloc(OP_RANGE, SVs_PADMY);
79072805
LW
4836 sv_upgrade(PAD_SV(flip->op_targ), SVt_PVNV);
4837
4838 flip->op_private = left->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
4839 flop->op_private = right->op_type == OP_CONST ? OPpFLIP_LINENUM : 0;
4840
11343788 4841 flip->op_next = o;
79072805 4842 if (!flip->op_private || !flop->op_private)
11343788 4843 linklist(o); /* blow off optimizer unless constant */
79072805 4844
11343788 4845 return o;
79072805
LW
4846}
4847
4848OP *
864dbfa3 4849Perl_newLOOPOP(pTHX_ I32 flags, I32 debuggable, OP *expr, OP *block)
79072805 4850{
97aff369 4851 dVAR;
463ee0b2 4852 OP* listop;
11343788 4853 OP* o;
73d840c0 4854 const bool once = block && block->op_flags & OPf_SPECIAL &&
a0d0e21e 4855 (block->op_type == OP_ENTERSUB || block->op_type == OP_NULL);
46c461b5
AL
4856
4857 PERL_UNUSED_ARG(debuggable);
93a17b20 4858
463ee0b2
LW
4859 if (expr) {
4860 if (once && expr->op_type == OP_CONST && !SvTRUE(((SVOP*)expr)->op_sv))
4861 return block; /* do {} while 0 does once */
114c60ec
BG
4862 if (expr->op_type == OP_READLINE
4863 || expr->op_type == OP_READDIR
4864 || expr->op_type == OP_GLOB
fb73857a 4865 || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
774d564b 4866 expr = newUNOP(OP_DEFINED, 0,
54b9620d 4867 newASSIGNOP(0, newDEFSVOP(), 0, expr) );
55d729e4 4868 } else if (expr->op_flags & OPf_KIDS) {
46c461b5
AL
4869 const OP * const k1 = ((UNOP*)expr)->op_first;
4870 const OP * const k2 = k1 ? k1->op_sibling : NULL;
55d729e4 4871 switch (expr->op_type) {
1c846c1f 4872 case OP_NULL:
114c60ec 4873 if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR)
55d729e4 4874 && (k2->op_flags & OPf_STACKED)
1c846c1f 4875 && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
55d729e4 4876 expr = newUNOP(OP_DEFINED, 0, expr);
1c846c1f 4877 break;
55d729e4
GS
4878
4879 case OP_SASSIGN:
06dc7ac6 4880 if (k1 && (k1->op_type == OP_READDIR
55d729e4 4881 || k1->op_type == OP_GLOB
6531c3e6 4882 || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
06dc7ac6 4883 || k1->op_type == OP_EACH))
55d729e4
GS
4884 expr = newUNOP(OP_DEFINED, 0, expr);
4885 break;
4886 }
774d564b 4887 }
463ee0b2 4888 }
93a17b20 4889
e1548254
RGS
4890 /* if block is null, the next append_elem() would put UNSTACK, a scalar
4891 * op, in listop. This is wrong. [perl #27024] */
4892 if (!block)
4893 block = newOP(OP_NULL, 0);
8990e307 4894 listop = append_elem(OP_LINESEQ, block, newOP(OP_UNSTACK, 0));
883ffac3 4895 o = new_logop(OP_AND, 0, &expr, &listop);
463ee0b2 4896
883ffac3
CS
4897 if (listop)
4898 ((LISTOP*)listop)->op_last->op_next = LINKLIST(o);
79072805 4899
11343788
MB
4900 if (once && o != listop)
4901 o->op_next = ((LOGOP*)cUNOPo->op_first)->op_other;
79072805 4902
11343788
MB
4903 if (o == listop)
4904 o = newUNOP(OP_NULL, 0, o); /* or do {} while 1 loses outer block */
748a9306 4905
11343788
MB
4906 o->op_flags |= flags;
4907 o = scope(o);
4908 o->op_flags |= OPf_SPECIAL; /* suppress POPBLOCK curpm restoration*/
4909 return o;
79072805
LW
4910}
4911
4912OP *
a034e688
DM
4913Perl_newWHILEOP(pTHX_ I32 flags, I32 debuggable, LOOP *loop, I32
4914whileline, OP *expr, OP *block, OP *cont, I32 has_my)
79072805 4915{
27da23d5 4916 dVAR;
79072805 4917 OP *redo;
c445ea15 4918 OP *next = NULL;
79072805 4919 OP *listop;
11343788 4920 OP *o;
1ba6ee2b 4921 U8 loopflags = 0;
46c461b5
AL
4922
4923 PERL_UNUSED_ARG(debuggable);
79072805 4924
2d03de9c 4925 if (expr) {
114c60ec
BG
4926 if (expr->op_type == OP_READLINE
4927 || expr->op_type == OP_READDIR
4928 || expr->op_type == OP_GLOB
2d03de9c
AL
4929 || (expr->op_type == OP_NULL && expr->op_targ == OP_GLOB)) {
4930 expr = newUNOP(OP_DEFINED, 0,
4931 newASSIGNOP(0, newDEFSVOP(), 0, expr) );
4932 } else if (expr->op_flags & OPf_KIDS) {
4933 const OP * const k1 = ((UNOP*)expr)->op_first;
4934 const OP * const k2 = (k1) ? k1->op_sibling : NULL;
4935 switch (expr->op_type) {
4936 case OP_NULL:
114c60ec 4937 if (k2 && (k2->op_type == OP_READLINE || k2->op_type == OP_READDIR)
2d03de9c
AL
4938 && (k2->op_flags & OPf_STACKED)
4939 && ((k1->op_flags & OPf_WANT) == OPf_WANT_SCALAR))
4940 expr = newUNOP(OP_DEFINED, 0, expr);
4941 break;
55d729e4 4942
2d03de9c 4943 case OP_SASSIGN:
72c8de1a 4944 if (k1 && (k1->op_type == OP_READDIR
2d03de9c
AL
4945 || k1->op_type == OP_GLOB
4946 || (k1->op_type == OP_NULL && k1->op_targ == OP_GLOB)
72c8de1a 4947 || k1->op_type == OP_EACH))
2d03de9c
AL
4948 expr = newUNOP(OP_DEFINED, 0, expr);
4949 break;
4950 }
55d729e4 4951 }
748a9306 4952 }
79072805
LW
4953
4954 if (!block)
4955 block = newOP(OP_NULL, 0);
a034e688 4956 else if (cont || has_my) {
87246558
GS
4957 block = scope(block);
4958 }
79072805 4959
1ba6ee2b 4960 if (cont) {
79072805 4961 next = LINKLIST(cont);
1ba6ee2b 4962 }
fb73857a 4963 if (expr) {
551405c4 4964 OP * const unstack = newOP(OP_UNSTACK, 0);
85538317
GS
4965 if (!next)
4966 next = unstack;
4967 cont = append_elem(OP_LINESEQ, cont, unstack);
fb73857a 4968 }
79072805 4969
ce3e5c45 4970 assert(block);
463ee0b2 4971 listop = append_list(OP_LINESEQ, (LISTOP*)block, (LISTOP*)cont);
ce3e5c45 4972 assert(listop);
79072805
LW
4973 redo = LINKLIST(listop);
4974
4975 if (expr) {
53a7735b 4976 PL_parser->copline = (line_t)whileline;
883ffac3
CS
4977 scalar(listop);
4978 o = new_logop(OP_AND, 0, &expr, &listop);
11343788 4979 if (o == expr && o->op_type == OP_CONST && !SvTRUE(cSVOPo->op_sv)) {
85e6fe83 4980 op_free(expr); /* oops, it's a while (0) */
463ee0b2 4981 op_free((OP*)loop);
5f66b61c 4982 return NULL; /* listop already freed by new_logop */
463ee0b2 4983 }
883ffac3 4984 if (listop)
497b47a8 4985 ((LISTOP*)listop)->op_last->op_next =
883ffac3 4986 (o == listop ? redo : LINKLIST(o));
79072805
LW
4987 }
4988 else
11343788 4989 o = listop;
79072805
LW
4990
4991 if (!loop) {
b7dc083c 4992 NewOp(1101,loop,1,LOOP);
79072805 4993 loop->op_type = OP_ENTERLOOP;
22c35a8c 4994 loop->op_ppaddr = PL_ppaddr[OP_ENTERLOOP];
79072805
LW
4995 loop->op_private = 0;
4996 loop->op_next = (OP*)loop;
4997 }
4998
11343788 4999 o = newBINOP(OP_LEAVELOOP, 0, (OP*)loop, o);
79072805
LW
5000
5001 loop->op_redoop = redo;
11343788 5002 loop->op_lastop = o;
1ba6ee2b 5003 o->op_private |= loopflags;
79072805
LW
5004
5005 if (next)
5006 loop->op_nextop = next;
5007 else
11343788 5008 loop->op_nextop = o;
79072805 5009
11343788
MB
5010 o->op_flags |= flags;
5011 o->op_private |= (flags >> 8);
5012 return o;
79072805
LW
5013}
5014
5015OP *
66a1b24b 5016Perl_newFOROP(pTHX_ I32 flags, char *label, line_t forline, OP *sv, OP *expr, OP *block, OP *cont)
79072805 5017{
27da23d5 5018 dVAR;
79072805 5019 LOOP *loop;
fb73857a 5020 OP *wop;
4bbc6d12 5021 PADOFFSET padoff = 0;
4633a7c4 5022 I32 iterflags = 0;
241416b8 5023 I32 iterpflags = 0;
d4c19fe8 5024 OP *madsv = NULL;
79072805 5025
7918f24d
NC
5026 PERL_ARGS_ASSERT_NEWFOROP;
5027
79072805 5028 if (sv) {
85e6fe83 5029 if (sv->op_type == OP_RV2SV) { /* symbol table variable */
241416b8 5030 iterpflags = sv->op_private & OPpOUR_INTRO; /* for our $x () */
748a9306 5031 sv->op_type = OP_RV2GV;
22c35a8c 5032 sv->op_ppaddr = PL_ppaddr[OP_RV2GV];
0be9a6bb
RH
5033
5034 /* The op_type check is needed to prevent a possible segfault
5035 * if the loop variable is undeclared and 'strict vars' is in
5036 * effect. This is illegal but is nonetheless parsed, so we
5037 * may reach this point with an OP_CONST where we're expecting
5038 * an OP_GV.
5039 */
5040 if (cUNOPx(sv)->op_first->op_type == OP_GV
5041 && cGVOPx_gv(cUNOPx(sv)->op_first) == PL_defgv)
0d863452 5042 iterpflags |= OPpITER_DEF;
79072805 5043 }
85e6fe83 5044 else if (sv->op_type == OP_PADSV) { /* private variable */
241416b8 5045 iterpflags = sv->op_private & OPpLVAL_INTRO; /* for my $x () */
85e6fe83 5046 padoff = sv->op_targ;
eb8433b7
NC
5047 if (PL_madskills)
5048 madsv = sv;
5049 else {
5050 sv->op_targ = 0;
5051 op_free(sv);
5052 }
5f66b61c 5053 sv = NULL;
85e6fe83 5054 }
79072805 5055 else
cea2e8a9 5056 Perl_croak(aTHX_ "Can't use %s for loop variable", PL_op_desc[sv->op_type]);
f8503592
NC
5057 if (padoff) {
5058 SV *const namesv = PAD_COMPNAME_SV(padoff);
5059 STRLEN len;
5060 const char *const name = SvPV_const(namesv, len);
5061
5062 if (len == 2 && name[0] == '$' && name[1] == '_')
5063 iterpflags |= OPpITER_DEF;
5064 }
79072805
LW
5065 }
5066 else {
f8f98e0a 5067 const PADOFFSET offset = Perl_pad_findmy(aTHX_ STR_WITH_LEN("$_"), 0);
00b1698f 5068 if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
aabe9514
RGS
5069 sv = newGVOP(OP_GV, 0, PL_defgv);
5070 }
5071 else {
5072 padoff = offset;
aabe9514 5073 }
0d863452 5074 iterpflags |= OPpITER_DEF;
79072805 5075 }
5f05dabc 5076 if (expr->op_type == OP_RV2AV || expr->op_type == OP_PADAV) {
89ea2908 5077 expr = mod(force_list(scalar(ref(expr, OP_ITER))), OP_GREPSTART);
4633a7c4
LW
5078 iterflags |= OPf_STACKED;
5079 }
89ea2908
GA
5080 else if (expr->op_type == OP_NULL &&
5081 (expr->op_flags & OPf_KIDS) &&
5082 ((BINOP*)expr)->op_first->op_type == OP_FLOP)
5083 {
5084 /* Basically turn for($x..$y) into the same as for($x,$y), but we
5085 * set the STACKED flag to indicate that these values are to be
5086 * treated as min/max values by 'pp_iterinit'.
5087 */
d4c19fe8 5088 const UNOP* const flip = (UNOP*)((UNOP*)((BINOP*)expr)->op_first)->op_first;
551405c4 5089 LOGOP* const range = (LOGOP*) flip->op_first;
66a1b24b
AL
5090 OP* const left = range->op_first;
5091 OP* const right = left->op_sibling;
5152d7c7 5092 LISTOP* listop;
89ea2908
GA
5093
5094 range->op_flags &= ~OPf_KIDS;
5f66b61c 5095 range->op_first = NULL;
89ea2908 5096
5152d7c7 5097 listop = (LISTOP*)newLISTOP(OP_LIST, 0, left, right);
1a67a97c
SM
5098 listop->op_first->op_next = range->op_next;
5099 left->op_next = range->op_other;
5152d7c7
GS
5100 right->op_next = (OP*)listop;
5101 listop->op_next = listop->op_first;
89ea2908 5102
eb8433b7
NC
5103#ifdef PERL_MAD
5104 op_getmad(expr,(OP*)listop,'O');
5105#else
89ea2908 5106 op_free(expr);
eb8433b7 5107#endif
5152d7c7 5108 expr = (OP*)(listop);
93c66552 5109 op_null(expr);
89ea2908
GA
5110 iterflags |= OPf_STACKED;
5111 }
5112 else {
5113 expr = mod(force_list(expr), OP_GREPSTART);
5114 }
5115
4633a7c4 5116 loop = (LOOP*)list(convert(OP_ENTERITER, iterflags,
89ea2908 5117 append_elem(OP_LIST, expr, scalar(sv))));
85e6fe83 5118 assert(!loop->op_next);
241416b8 5119 /* for my $x () sets OPpLVAL_INTRO;
14f338dc 5120 * for our $x () sets OPpOUR_INTRO */
c5661c80 5121 loop->op_private = (U8)iterpflags;
b7dc083c 5122#ifdef PL_OP_SLAB_ALLOC
155aba94
GS
5123 {
5124 LOOP *tmp;
5125 NewOp(1234,tmp,1,LOOP);
bd5f3bc4 5126 Copy(loop,tmp,1,LISTOP);
bfafaa29 5127 S_op_destroy(aTHX_ (OP*)loop);
155aba94
GS
5128 loop = tmp;
5129 }
b7dc083c 5130#else
10edeb5d 5131 loop = (LOOP*)PerlMemShared_realloc(loop, sizeof(LOOP));
1c846c1f 5132#endif
85e6fe83 5133 loop->op_targ = padoff;
a034e688 5134 wop = newWHILEOP(flags, 1, loop, forline, newOP(OP_ITER, 0), block, cont, 0);
eb8433b7
NC
5135 if (madsv)
5136 op_getmad(madsv, (OP*)loop, 'v');
53a7735b 5137 PL_parser->copline = forline;
fb73857a 5138 return newSTATEOP(0, label, wop);
79072805
LW
5139}
5140
8990e307 5141OP*
864dbfa3 5142Perl_newLOOPEX(pTHX_ I32 type, OP *label)
8990e307 5143{
97aff369 5144 dVAR;
11343788 5145 OP *o;
2d8e6c8d 5146
7918f24d
NC
5147 PERL_ARGS_ASSERT_NEWLOOPEX;
5148
e69777c1
GG
5149 assert((PL_opargs[type] & OA_CLASS_MASK) == OA_LOOPEXOP);
5150
8990e307 5151 if (type != OP_GOTO || label->op_type == OP_CONST) {
cdaebead
MB
5152 /* "last()" means "last" */
5153 if (label->op_type == OP_STUB && (label->op_flags & OPf_PARENS))
5154 o = newOP(type, OPf_SPECIAL);
5155 else {
ea71c68d 5156 o = newPVOP(type, 0, savesharedpv(label->op_type == OP_CONST
4ea561bc 5157 ? SvPV_nolen_const(((SVOP*)label)->op_sv)
666ea192 5158 : ""));
cdaebead 5159 }
eb8433b7
NC
5160#ifdef PERL_MAD
5161 op_getmad(label,o,'L');
5162#else
8990e307 5163 op_free(label);
eb8433b7 5164#endif
8990e307
LW
5165 }
5166 else {
e3aba57a
RGS
5167 /* Check whether it's going to be a goto &function */
5168 if (label->op_type == OP_ENTERSUB
5169 && !(label->op_flags & OPf_STACKED))
a0d0e21e 5170 label = newUNOP(OP_REFGEN, 0, mod(label, OP_REFGEN));
11343788 5171 o = newUNOP(type, OPf_STACKED, label);
8990e307 5172 }
3280af22 5173 PL_hints |= HINT_BLOCK_SCOPE;
11343788 5174 return o;
8990e307
LW
5175}
5176
0d863452
RH
5177/* if the condition is a literal array or hash
5178 (or @{ ... } etc), make a reference to it.
5179 */
5180STATIC OP *
5181S_ref_array_or_hash(pTHX_ OP *cond)
5182{
5183 if (cond
5184 && (cond->op_type == OP_RV2AV
5185 || cond->op_type == OP_PADAV
5186 || cond->op_type == OP_RV2HV
5187 || cond->op_type == OP_PADHV))
5188
5189 return newUNOP(OP_REFGEN,
5190 0, mod(cond, OP_REFGEN));
5191
5192 else
5193 return cond;
5194}
5195
5196/* These construct the optree fragments representing given()
5197 and when() blocks.
5198
5199 entergiven and enterwhen are LOGOPs; the op_other pointer
5200 points up to the associated leave op. We need this so we
5201 can put it in the context and make break/continue work.
5202 (Also, of course, pp_enterwhen will jump straight to
5203 op_other if the match fails.)
5204 */
5205
4136a0f7 5206STATIC OP *
0d863452
RH
5207S_newGIVWHENOP(pTHX_ OP *cond, OP *block,
5208 I32 enter_opcode, I32 leave_opcode,
5209 PADOFFSET entertarg)
5210{
97aff369 5211 dVAR;
0d863452
RH
5212 LOGOP *enterop;
5213 OP *o;
5214
7918f24d
NC
5215 PERL_ARGS_ASSERT_NEWGIVWHENOP;
5216
0d863452 5217 NewOp(1101, enterop, 1, LOGOP);
61a59f30 5218 enterop->op_type = (Optype)enter_opcode;
0d863452
RH
5219 enterop->op_ppaddr = PL_ppaddr[enter_opcode];
5220 enterop->op_flags = (U8) OPf_KIDS;
5221 enterop->op_targ = ((entertarg == NOT_IN_PAD) ? 0 : entertarg);
5222 enterop->op_private = 0;
5223
5224 o = newUNOP(leave_opcode, 0, (OP *) enterop);
5225
5226 if (cond) {
5227 enterop->op_first = scalar(cond);
5228 cond->op_sibling = block;
5229
5230 o->op_next = LINKLIST(cond);
5231 cond->op_next = (OP *) enterop;
5232 }
5233 else {
5234 /* This is a default {} block */
5235 enterop->op_first = block;
5236 enterop->op_flags |= OPf_SPECIAL;
5237
5238 o->op_next = (OP *) enterop;
5239 }
5240
5241 CHECKOP(enter_opcode, enterop); /* Currently does nothing, since
5242 entergiven and enterwhen both
5243 use ck_null() */
5244
5245 enterop->op_next = LINKLIST(block);
5246 block->op_next = enterop->op_other = o;
5247
5248 return o;
5249}
5250
5251/* Does this look like a boolean operation? For these purposes
5252 a boolean operation is:
5253 - a subroutine call [*]
5254 - a logical connective
5255 - a comparison operator
5256 - a filetest operator, with the exception of -s -M -A -C
5257 - defined(), exists() or eof()
5258 - /$re/ or $foo =~ /$re/
5259
5260 [*] possibly surprising
5261 */
4136a0f7 5262STATIC bool
ef519e13 5263S_looks_like_bool(pTHX_ const OP *o)
0d863452 5264{
97aff369 5265 dVAR;
7918f24d
NC
5266
5267 PERL_ARGS_ASSERT_LOOKS_LIKE_BOOL;
5268
0d863452
RH
5269 switch(o->op_type) {
5270 case OP_OR:
f92e1a16 5271 case OP_DOR:
0d863452
RH
5272 return looks_like_bool(cLOGOPo->op_first);
5273
5274 case OP_AND:
5275 return (
5276 looks_like_bool(cLOGOPo->op_first)
5277 && looks_like_bool(cLOGOPo->op_first->op_sibling));
5278
1e1d4b91
JJ
5279 case OP_NULL:
5280 return (
5281 o->op_flags & OPf_KIDS
5282 && looks_like_bool(cUNOPo->op_first));
5283
5341b2b7
JJ
5284 case OP_SCALAR:
5285 return looks_like_bool(cUNOPo->op_first);
5286
5287
0d863452
RH
5288 case OP_ENTERSUB:
5289
5290 case OP_NOT: case OP_XOR:
0d863452
RH
5291
5292 case OP_EQ: case OP_NE: case OP_LT:
5293 case OP_GT: case OP_LE: case OP_GE:
5294
5295 case OP_I_EQ: case OP_I_NE: case OP_I_LT:
5296 case OP_I_GT: case OP_I_LE: case OP_I_GE:
5297
5298 case OP_SEQ: case OP_SNE: case OP_SLT:
5299 case OP_SGT: case OP_SLE: case OP_SGE:
5300
5301 case OP_SMARTMATCH:
5302
5303 case OP_FTRREAD: case OP_FTRWRITE: case OP_FTREXEC:
5304 case OP_FTEREAD: case OP_FTEWRITE: case OP_FTEEXEC:
5305 case OP_FTIS: case OP_FTEOWNED: case OP_FTROWNED:
5306 case OP_FTZERO: case OP_FTSOCK: case OP_FTCHR:
5307 case OP_FTBLK: case OP_FTFILE: case OP_FTDIR:
5308 case OP_FTPIPE: case OP_FTLINK: case OP_FTSUID:
5309 case OP_FTSGID: case OP_FTSVTX: case OP_FTTTY:
5310 case OP_FTTEXT: case OP_FTBINARY:
5311
5312 case OP_DEFINED: case OP_EXISTS:
5313 case OP_MATCH: case OP_EOF:
5314
f118ea0d
RGS
5315 case OP_FLOP:
5316
0d863452
RH
5317 return TRUE;
5318
5319 case OP_CONST:
5320 /* Detect comparisons that have been optimized away */
5321 if (cSVOPo->op_sv == &PL_sv_yes
5322 || cSVOPo->op_sv == &PL_sv_no)
5323
5324 return TRUE;
6e03d743
RGS
5325 else
5326 return FALSE;
6e03d743 5327
0d863452
RH
5328 /* FALL THROUGH */
5329 default:
5330 return FALSE;
5331 }
5332}
5333
5334OP *
5335Perl_newGIVENOP(pTHX_ OP *cond, OP *block, PADOFFSET defsv_off)
5336{
97aff369 5337 dVAR;
7918f24d 5338 PERL_ARGS_ASSERT_NEWGIVENOP;
0d863452
RH
5339 return newGIVWHENOP(
5340 ref_array_or_hash(cond),
5341 block,
5342 OP_ENTERGIVEN, OP_LEAVEGIVEN,
5343 defsv_off);
5344}
5345
5346/* If cond is null, this is a default {} block */
5347OP *
5348Perl_newWHENOP(pTHX_ OP *cond, OP *block)
5349{
ef519e13 5350 const bool cond_llb = (!cond || looks_like_bool(cond));
0d863452
RH
5351 OP *cond_op;
5352
7918f24d
NC
5353 PERL_ARGS_ASSERT_NEWWHENOP;
5354
0d863452
RH
5355 if (cond_llb)
5356 cond_op = cond;
5357 else {
5358 cond_op = newBINOP(OP_SMARTMATCH, OPf_SPECIAL,
5359 newDEFSVOP(),
5360 scalar(ref_array_or_hash(cond)));
5361 }
5362
5363 return newGIVWHENOP(
5364 cond_op,
5365 append_elem(block->op_type, block, newOP(OP_BREAK, OPf_SPECIAL)),
5366 OP_ENTERWHEN, OP_LEAVEWHEN, 0);
5367}
5368
7dafbf52
DM
5369/*
5370=for apidoc cv_undef
5371
5372Clear out all the active components of a CV. This can happen either
5373by an explicit C<undef &foo>, or by the reference count going to zero.
5374In the former case, we keep the CvOUTSIDE pointer, so that any anonymous
5375children can still follow the full lexical scope chain.
5376
5377=cut
5378*/
5379
79072805 5380void
864dbfa3 5381Perl_cv_undef(pTHX_ CV *cv)
79072805 5382{
27da23d5 5383 dVAR;
503de470 5384
7918f24d
NC
5385 PERL_ARGS_ASSERT_CV_UNDEF;
5386
503de470
DM
5387 DEBUG_X(PerlIO_printf(Perl_debug_log,
5388 "CV undef: cv=0x%"UVxf" comppad=0x%"UVxf"\n",
5389 PTR2UV(cv), PTR2UV(PL_comppad))
5390 );
5391
a636914a 5392#ifdef USE_ITHREADS
aed2304a 5393 if (CvFILE(cv) && !CvISXSUB(cv)) {
35f1c1c7 5394 /* for XSUBs CvFILE point directly to static memory; __FILE__ */
a636914a 5395 Safefree(CvFILE(cv));
a636914a 5396 }
b3123a61 5397 CvFILE(cv) = NULL;
a636914a
RH
5398#endif
5399
aed2304a 5400 if (!CvISXSUB(cv) && CvROOT(cv)) {
bb172083 5401 if (SvTYPE(cv) == SVt_PVCV && CvDEPTH(cv))
cea2e8a9 5402 Perl_croak(aTHX_ "Can't undef active subroutine");
8990e307 5403 ENTER;
a0d0e21e 5404
f3548bdc 5405 PAD_SAVE_SETNULLPAD();
a0d0e21e 5406
282f25c9 5407 op_free(CvROOT(cv));
5f66b61c
AL
5408 CvROOT(cv) = NULL;
5409 CvSTART(cv) = NULL;
8990e307 5410 LEAVE;
79072805 5411 }
ad64d0ec 5412 SvPOK_off(MUTABLE_SV(cv)); /* forget prototype */
a0714e2c 5413 CvGV(cv) = NULL;
a3985cdc
DM
5414
5415 pad_undef(cv);
5416
7dafbf52
DM
5417 /* remove CvOUTSIDE unless this is an undef rather than a free */
5418 if (!SvREFCNT(cv) && CvOUTSIDE(cv)) {
5419 if (!CvWEAKOUTSIDE(cv))
5420 SvREFCNT_dec(CvOUTSIDE(cv));
601f1833 5421 CvOUTSIDE(cv) = NULL;
7dafbf52 5422 }
beab0874 5423 if (CvCONST(cv)) {
ad64d0ec 5424 SvREFCNT_dec(MUTABLE_SV(CvXSUBANY(cv).any_ptr));
beab0874
JT
5425 CvCONST_off(cv);
5426 }
d04ba589 5427 if (CvISXSUB(cv) && CvXSUB(cv)) {
96a5add6 5428 CvXSUB(cv) = NULL;
50762d59 5429 }
7dafbf52
DM
5430 /* delete all flags except WEAKOUTSIDE */
5431 CvFLAGS(cv) &= CVf_WEAKOUTSIDE;
79072805
LW
5432}
5433
3fe9a6f1 5434void
cbf82dd0
NC
5435Perl_cv_ckproto_len(pTHX_ const CV *cv, const GV *gv, const char *p,
5436 const STRLEN len)
5437{
7918f24d
NC
5438 PERL_ARGS_ASSERT_CV_CKPROTO_LEN;
5439
cbf82dd0
NC
5440 /* Can't just use a strcmp on the prototype, as CONSTSUBs "cheat" by
5441 relying on SvCUR, and doubling up the buffer to hold CvFILE(). */
5442 if (((!p != !SvPOK(cv)) /* One has prototype, one has not. */
5443 || (p && (len != SvCUR(cv) /* Not the same length. */
5444 || memNE(p, SvPVX_const(cv), len))))
5445 && ckWARN_d(WARN_PROTOTYPE)) {
2d03de9c 5446 SV* const msg = sv_newmortal();
a0714e2c 5447 SV* name = NULL;
3fe9a6f1 5448
5449 if (gv)
bd61b366 5450 gv_efullname3(name = sv_newmortal(), gv, NULL);
6502358f 5451 sv_setpvs(msg, "Prototype mismatch:");
46fc3d4c 5452 if (name)
be2597df 5453 Perl_sv_catpvf(aTHX_ msg, " sub %"SVf, SVfARG(name));
3fe9a6f1 5454 if (SvPOK(cv))
be2597df 5455 Perl_sv_catpvf(aTHX_ msg, " (%"SVf")", SVfARG(cv));
ebe643b9 5456 else
396482e1
GA
5457 sv_catpvs(msg, ": none");
5458 sv_catpvs(msg, " vs ");
46fc3d4c 5459 if (p)
cbf82dd0 5460 Perl_sv_catpvf(aTHX_ msg, "(%.*s)", (int) len, p);
46fc3d4c 5461 else
396482e1 5462 sv_catpvs(msg, "none");
be2597df 5463 Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE), "%"SVf, SVfARG(msg));
3fe9a6f1 5464 }
5465}
5466
35f1c1c7
SB
5467static void const_sv_xsub(pTHX_ CV* cv);
5468
beab0874 5469/*
ccfc67b7
JH
5470
5471=head1 Optree Manipulation Functions
5472
beab0874
JT
5473=for apidoc cv_const_sv
5474
5475If C<cv> is a constant sub eligible for inlining. returns the constant
5476value returned by the sub. Otherwise, returns NULL.
5477
5478Constant subs can be created with C<newCONSTSUB> or as described in
5479L<perlsub/"Constant Functions">.
5480
5481=cut
5482*/
760ac839 5483SV *
d45f5b30 5484Perl_cv_const_sv(pTHX_ const CV *const cv)
760ac839 5485{
96a5add6 5486 PERL_UNUSED_CONTEXT;
5069cc75
NC
5487 if (!cv)
5488 return NULL;
5489 if (!(SvTYPE(cv) == SVt_PVCV || SvTYPE(cv) == SVt_PVFM))
5490 return NULL;
ad64d0ec 5491 return CvCONST(cv) ? MUTABLE_SV(CvXSUBANY(cv).any_ptr) : NULL;
fe5e78ed 5492}
760ac839 5493
b5c19bd7
DM
5494/* op_const_sv: examine an optree to determine whether it's in-lineable.
5495 * Can be called in 3 ways:
5496 *
5497 * !cv
5498 * look for a single OP_CONST with attached value: return the value
5499 *
5500 * cv && CvCLONE(cv) && !CvCONST(cv)
5501 *
5502 * examine the clone prototype, and if contains only a single
5503 * OP_CONST referencing a pad const, or a single PADSV referencing
5504 * an outer lexical, return a non-zero value to indicate the CV is
5505 * a candidate for "constizing" at clone time
5506 *
5507 * cv && CvCONST(cv)
5508 *
5509 * We have just cloned an anon prototype that was marked as a const
5510 * candidiate. Try to grab the current value, and in the case of
5511 * PADSV, ignore it if it has multiple references. Return the value.
5512 */
5513
fe5e78ed 5514SV *
6867be6d 5515Perl_op_const_sv(pTHX_ const OP *o, CV *cv)
fe5e78ed 5516{
97aff369 5517 dVAR;
a0714e2c 5518 SV *sv = NULL;
fe5e78ed 5519
c631f32b
GG
5520 if (PL_madskills)
5521 return NULL;
5522
0f79a09d 5523 if (!o)
a0714e2c 5524 return NULL;
1c846c1f
NIS
5525
5526 if (o->op_type == OP_LINESEQ && cLISTOPo->op_first)
fe5e78ed
GS
5527 o = cLISTOPo->op_first->op_sibling;
5528
5529 for (; o; o = o->op_next) {
890ce7af 5530 const OPCODE type = o->op_type;
fe5e78ed 5531
1c846c1f 5532 if (sv && o->op_next == o)
fe5e78ed 5533 return sv;
e576b457
JT
5534 if (o->op_next != o) {
5535 if (type == OP_NEXTSTATE || type == OP_NULL || type == OP_PUSHMARK)
5536 continue;
5537 if (type == OP_DBSTATE)
5538 continue;
5539 }
54310121 5540 if (type == OP_LEAVESUB || type == OP_RETURN)
5541 break;
5542 if (sv)
a0714e2c 5543 return NULL;
7766f137 5544 if (type == OP_CONST && cSVOPo->op_sv)
5dc0d613 5545 sv = cSVOPo->op_sv;
b5c19bd7 5546 else if (cv && type == OP_CONST) {
dd2155a4 5547 sv = PAD_BASE_SV(CvPADLIST(cv), o->op_targ);
beab0874 5548 if (!sv)
a0714e2c 5549 return NULL;
b5c19bd7
DM
5550 }
5551 else if (cv && type == OP_PADSV) {
5552 if (CvCONST(cv)) { /* newly cloned anon */
5553 sv = PAD_BASE_SV(CvPADLIST(cv), o->op_targ);
5554 /* the candidate should have 1 ref from this pad and 1 ref
5555 * from the parent */
5556 if (!sv || SvREFCNT(sv) != 2)
a0714e2c 5557 return NULL;
beab0874 5558 sv = newSVsv(sv);
b5c19bd7
DM
5559 SvREADONLY_on(sv);
5560 return sv;
5561 }
5562 else {
5563 if (PAD_COMPNAME_FLAGS(o->op_targ) & SVf_FAKE)
5564 sv = &PL_sv_undef; /* an arbitrary non-null value */
beab0874 5565 }
760ac839 5566 }
b5c19bd7 5567 else {
a0714e2c 5568 return NULL;
b5c19bd7 5569 }
760ac839
LW
5570 }
5571 return sv;
5572}
5573
eb8433b7
NC
5574#ifdef PERL_MAD
5575OP *
5576#else
09bef843 5577void
eb8433b7 5578#endif
09bef843
SB
5579Perl_newMYSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
5580{
99129197
NC
5581#if 0
5582 /* This would be the return value, but the return cannot be reached. */
eb8433b7
NC
5583 OP* pegop = newOP(OP_NULL, 0);
5584#endif
5585
46c461b5
AL
5586 PERL_UNUSED_ARG(floor);
5587
09bef843
SB
5588 if (o)
5589 SAVEFREEOP(o);
5590 if (proto)
5591 SAVEFREEOP(proto);
5592 if (attrs)
5593 SAVEFREEOP(attrs);
5594 if (block)
5595 SAVEFREEOP(block);
5596 Perl_croak(aTHX_ "\"my sub\" not yet implemented");
eb8433b7 5597#ifdef PERL_MAD
99129197 5598 NORETURN_FUNCTION_END;
eb8433b7 5599#endif
09bef843
SB
5600}
5601
748a9306 5602CV *
864dbfa3 5603Perl_newSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *block)
79072805 5604{
5f66b61c 5605 return Perl_newATTRSUB(aTHX_ floor, o, proto, NULL, block);
09bef843
SB
5606}
5607
5608CV *
5609Perl_newATTRSUB(pTHX_ I32 floor, OP *o, OP *proto, OP *attrs, OP *block)
5610{
27da23d5 5611 dVAR;
83ee9e09 5612 GV *gv;
5c144d81 5613 const char *ps;
ea6e9374 5614 STRLEN ps_len;
c445ea15 5615 register CV *cv = NULL;
beab0874 5616 SV *const_sv;
b48b272a
NC
5617 /* If the subroutine has no body, no attributes, and no builtin attributes
5618 then it's just a sub declaration, and we may be able to get away with
5619 storing with a placeholder scalar in the symbol table, rather than a
5620 full GV and CV. If anything is present then it will take a full CV to
5621 store it. */
5622 const I32 gv_fetch_flags
eb8433b7
NC
5623 = (block || attrs || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
5624 || PL_madskills)
b48b272a 5625 ? GV_ADDMULTI : GV_ADDMULTI | GV_NOINIT;
4ea561bc 5626 const char * const name = o ? SvPV_nolen_const(cSVOPo->op_sv) : NULL;
ed4a8a9b 5627 bool has_name;
8e742a20
MHM
5628
5629 if (proto) {
5630 assert(proto->op_type == OP_CONST);
4ea561bc 5631 ps = SvPV_const(((SVOP*)proto)->op_sv, ps_len);
8e742a20
MHM
5632 }
5633 else
bd61b366 5634 ps = NULL;
8e742a20 5635
ed4a8a9b
NC
5636 if (name) {
5637 gv = gv_fetchsv(cSVOPo->op_sv, gv_fetch_flags, SVt_PVCV);
5638 has_name = TRUE;
5639 } else if (PERLDB_NAMEANON && CopLINE(PL_curcop)) {
aec46f14 5640 SV * const sv = sv_newmortal();
c99da370
JH
5641 Perl_sv_setpvf(aTHX_ sv, "%s[%s:%"IVdf"]",
5642 PL_curstash ? "__ANON__" : "__ANON__::__ANON__",
83ee9e09 5643 CopFILE(PL_curcop), (IV)CopLINE(PL_curcop));
ed4a8a9b
NC
5644 gv = gv_fetchsv(sv, gv_fetch_flags, SVt_PVCV);
5645 has_name = TRUE;
c1754fce
NC
5646 } else if (PL_curstash) {
5647 gv = gv_fetchpvs("__ANON__", gv_fetch_flags, SVt_PVCV);
ed4a8a9b 5648 has_name = FALSE;
c1754fce
NC
5649 } else {
5650 gv = gv_fetchpvs("__ANON__::__ANON__", gv_fetch_flags, SVt_PVCV);
ed4a8a9b 5651 has_name = FALSE;
c1754fce 5652 }
83ee9e09 5653
eb8433b7
NC
5654 if (!PL_madskills) {
5655 if (o)
5656 SAVEFREEOP(o);
5657 if (proto)
5658 SAVEFREEOP(proto);
5659 if (attrs)
5660 SAVEFREEOP(attrs);
5661 }
3fe9a6f1 5662
09bef843 5663 if (SvTYPE(gv) != SVt_PVGV) { /* Maybe prototype now, and had at
55d729e4
GS
5664 maximum a prototype before. */
5665 if (SvTYPE(gv) > SVt_NULL) {
ad64d0ec 5666 if (!SvPOK((const SV *)gv)
9b387841 5667 && !(SvIOK((const SV *)gv) && SvIVX((const SV *)gv) == -1))
f248d071 5668 {
9b387841 5669 Perl_ck_warner_d(aTHX_ packWARN(WARN_PROTOTYPE), "Runaway prototype");
f248d071 5670 }
ea726b52 5671 cv_ckproto_len((const CV *)gv, NULL, ps, ps_len);
55d729e4
GS
5672 }
5673 if (ps)
ad64d0ec 5674 sv_setpvn(MUTABLE_SV(gv), ps, ps_len);
55d729e4 5675 else
ad64d0ec 5676 sv_setiv(MUTABLE_SV(gv), -1);
e1a479c5 5677
3280af22
NIS
5678 SvREFCNT_dec(PL_compcv);
5679 cv = PL_compcv = NULL;
beab0874 5680 goto done;
55d729e4
GS
5681 }
5682
601f1833 5683 cv = (!name || GvCVGEN(gv)) ? NULL : GvCV(gv);
beab0874 5684
eb8433b7
NC
5685 if (!block || !ps || *ps || attrs
5686 || (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS)
5687#ifdef PERL_MAD
5688 || block->op_type == OP_NULL
5689#endif
5690 )
a0714e2c 5691 const_sv = NULL;
beab0874 5692 else
601f1833 5693 const_sv = op_const_sv(block, NULL);
beab0874
JT
5694
5695 if (cv) {
6867be6d 5696 const bool exists = CvROOT(cv) || CvXSUB(cv);
5bd07a3d 5697
60ed1d8c
GS
5698 /* if the subroutine doesn't exist and wasn't pre-declared
5699 * with a prototype, assume it will be AUTOLOADed,
5700 * skipping the prototype check
5701 */
5702 if (exists || SvPOK(cv))
cbf82dd0 5703 cv_ckproto_len(cv, gv, ps, ps_len);
68dc0745 5704 /* already defined (or promised)? */
60ed1d8c 5705 if (exists || GvASSUMECV(gv)) {
eb8433b7
NC
5706 if ((!block
5707#ifdef PERL_MAD
5708 || block->op_type == OP_NULL
5709#endif
5710 )&& !attrs) {
d3cea301
SB
5711 if (CvFLAGS(PL_compcv)) {
5712 /* might have had built-in attrs applied */
5713 CvFLAGS(cv) |= (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS);
5714 }
aa689395 5715 /* just a "sub foo;" when &foo is already defined */
3280af22 5716 SAVEFREESV(PL_compcv);
aa689395 5717 goto done;
5718 }
eb8433b7
NC
5719 if (block
5720#ifdef PERL_MAD
5721 && block->op_type != OP_NULL
5722#endif
5723 ) {
beab0874
JT
5724 if (ckWARN(WARN_REDEFINE)
5725 || (CvCONST(cv)
5726 && (!const_sv || sv_cmp(cv_const_sv(cv), const_sv))))
5727 {
6867be6d 5728 const line_t oldline = CopLINE(PL_curcop);
53a7735b
DM
5729 if (PL_parser && PL_parser->copline != NOLINE)
5730 CopLINE_set(PL_curcop, PL_parser->copline);
9014280d 5731 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
666ea192
JH
5732 CvCONST(cv) ? "Constant subroutine %s redefined"
5733 : "Subroutine %s redefined", name);
beab0874
JT
5734 CopLINE_set(PL_curcop, oldline);
5735 }
eb8433b7
NC
5736#ifdef PERL_MAD
5737 if (!PL_minus_c) /* keep old one around for madskills */
5738#endif
5739 {
5740 /* (PL_madskills unset in used file.) */
5741 SvREFCNT_dec(cv);
5742 }
601f1833 5743 cv = NULL;
79072805 5744 }
79072805
LW
5745 }
5746 }
beab0874 5747 if (const_sv) {
f84c484e 5748 SvREFCNT_inc_simple_void_NN(const_sv);
beab0874 5749 if (cv) {
0768512c 5750 assert(!CvROOT(cv) && !CvCONST(cv));
ad64d0ec 5751 sv_setpvs(MUTABLE_SV(cv), ""); /* prototype is "" */
beab0874
JT
5752 CvXSUBANY(cv).any_ptr = const_sv;
5753 CvXSUB(cv) = const_sv_xsub;
5754 CvCONST_on(cv);
d04ba589 5755 CvISXSUB_on(cv);
beab0874
JT
5756 }
5757 else {
601f1833 5758 GvCV(gv) = NULL;
beab0874
JT
5759 cv = newCONSTSUB(NULL, name, const_sv);
5760 }
e1a479c5
BB
5761 mro_method_changed_in( /* sub Foo::Bar () { 123 } */
5762 (CvGV(cv) && GvSTASH(CvGV(cv)))
5763 ? GvSTASH(CvGV(cv))
5764 : CvSTASH(cv)
5765 ? CvSTASH(cv)
5766 : PL_curstash
5767 );
eb8433b7
NC
5768 if (PL_madskills)
5769 goto install_block;
beab0874
JT
5770 op_free(block);
5771 SvREFCNT_dec(PL_compcv);
5772 PL_compcv = NULL;
beab0874
JT
5773 goto done;
5774 }
09330df8
Z
5775 if (cv) { /* must reuse cv if autoloaded */
5776 /* transfer PL_compcv to cv */
5777 if (block
eb8433b7 5778#ifdef PERL_MAD
09330df8 5779 && block->op_type != OP_NULL
eb8433b7 5780#endif
09330df8
Z
5781 ) {
5782 cv_undef(cv);
5783 CvFLAGS(cv) = CvFLAGS(PL_compcv);
5784 if (!CvWEAKOUTSIDE(cv))
5785 SvREFCNT_dec(CvOUTSIDE(cv));
5786 CvOUTSIDE(cv) = CvOUTSIDE(PL_compcv);
5787 CvOUTSIDE_SEQ(cv) = CvOUTSIDE_SEQ(PL_compcv);
5788 CvOUTSIDE(PL_compcv) = 0;
5789 CvPADLIST(cv) = CvPADLIST(PL_compcv);
5790 CvPADLIST(PL_compcv) = 0;
5791 /* inner references to PL_compcv must be fixed up ... */
5792 pad_fixup_inner_anons(CvPADLIST(cv), PL_compcv, cv);
5793 if (PERLDB_INTER)/* Advice debugger on the new sub. */
5794 ++PL_sub_generation;
09bef843
SB
5795 }
5796 else {
09330df8
Z
5797 /* Might have had built-in attributes applied -- propagate them. */
5798 CvFLAGS(cv) |= (CvFLAGS(PL_compcv) & CVf_BUILTIN_ATTRS);
09bef843 5799 }
282f25c9 5800 /* ... before we throw it away */
3280af22 5801 SvREFCNT_dec(PL_compcv);
b5c19bd7 5802 PL_compcv = cv;
a0d0e21e
LW
5803 }
5804 else {
3280af22 5805 cv = PL_compcv;
44a8e56a 5806 if (name) {
5807 GvCV(gv) = cv;
eb8433b7
NC
5808 if (PL_madskills) {
5809 if (strEQ(name, "import")) {
ad64d0ec 5810 PL_formfeed = MUTABLE_SV(cv);
06f07c2f 5811 /* diag_listed_as: SKIPME */
fea10cf6 5812 Perl_warner(aTHX_ packWARN(WARN_VOID), "0x%"UVxf"\n", PTR2UV(cv));
eb8433b7
NC
5813 }
5814 }
44a8e56a 5815 GvCVGEN(gv) = 0;
e1a479c5 5816 mro_method_changed_in(GvSTASH(gv)); /* sub Foo::bar { (shift)+1 } */
44a8e56a 5817 }
a0d0e21e 5818 }
09330df8
Z
5819 if (!CvGV(cv)) {
5820 CvGV(cv) = gv;
5821 CvFILE_set_from_cop(cv, PL_curcop);
5822 CvSTASH(cv) = PL_curstash;
5823 }
5824 if (attrs) {
5825 /* Need to do a C<use attributes $stash_of_cv,\&cv,@attrs>. */
5826 HV *stash = name && GvSTASH(CvGV(cv)) ? GvSTASH(CvGV(cv)) : PL_curstash;
5827 apply_attrs(stash, MUTABLE_SV(cv), attrs, FALSE);
5828 }
8990e307 5829
3fe9a6f1 5830 if (ps)
ad64d0ec 5831 sv_setpvn(MUTABLE_SV(cv), ps, ps_len);
4633a7c4 5832
13765c85 5833 if (PL_parser && PL_parser->error_count) {
c07a80fd 5834 op_free(block);
5f66b61c 5835 block = NULL;
68dc0745 5836 if (name) {
6867be6d 5837 const char *s = strrchr(name, ':');
68dc0745 5838 s = s ? s+1 : name;
6d4c2119 5839 if (strEQ(s, "BEGIN")) {
e1ec3a88 5840 const char not_safe[] =
6d4c2119 5841 "BEGIN not safe after errors--compilation aborted";
faef0170 5842 if (PL_in_eval & EVAL_KEEPERR)
cea2e8a9 5843 Perl_croak(aTHX_ not_safe);
6d4c2119
CS
5844 else {
5845 /* force display of errors found but not reported */
38a03e6e 5846 sv_catpv(ERRSV, not_safe);
be2597df 5847 Perl_croak(aTHX_ "%"SVf, SVfARG(ERRSV));
6d4c2119
CS
5848 }
5849 }
68dc0745 5850 }
c07a80fd 5851 }
eb8433b7 5852 install_block:
beab0874
JT
5853 if (!block)
5854 goto done;
a0d0e21e 5855
aac018bb
NC
5856 /* If we assign an optree to a PVCV, then we've defined a subroutine that
5857 the debugger could be able to set a breakpoint in, so signal to
5858 pp_entereval that it should not throw away any saved lines at scope
5859 exit. */
5860
fd06b02c 5861 PL_breakable_sub_gen++;
7766f137 5862 if (CvLVALUE(cv)) {
78f9721b
SM
5863 CvROOT(cv) = newUNOP(OP_LEAVESUBLV, 0,
5864 mod(scalarseq(block), OP_LEAVESUBLV));
7e5d8ed2 5865 block->op_attached = 1;
7766f137
GS
5866 }
5867 else {
09c2fd24
AE
5868 /* This makes sub {}; work as expected. */
5869 if (block->op_type == OP_STUB) {
1496a290 5870 OP* const newblock = newSTATEOP(0, NULL, 0);
eb8433b7
NC
5871#ifdef PERL_MAD
5872 op_getmad(block,newblock,'B');
5873#else
09c2fd24 5874 op_free(block);
eb8433b7
NC
5875#endif
5876 block = newblock;
09c2fd24 5877 }
7e5d8ed2
DM
5878 else
5879 block->op_attached = 1;
7766f137
GS
5880 CvROOT(cv) = newUNOP(OP_LEAVESUB, 0, scalarseq(block));
5881 }
5882 CvROOT(cv)->op_private |= OPpREFCOUNTED;
5883 OpREFCNT_set(CvROOT(cv), 1);
5884 CvSTART(cv) = LINKLIST(CvROOT(cv));
5885 CvROOT(cv)->op_next = 0;
a2efc822 5886 CALL_PEEP(CvSTART(cv));
7766f137
GS
5887
5888 /* now that optimizer has done its work, adjust pad values */
54310121 5889
dd2155a4
DM
5890 pad_tidy(CvCLONE(cv) ? padtidy_SUBCLONE : padtidy_SUB);
5891
5892 if (CvCLONE(cv)) {
beab0874
JT
5893 assert(!CvCONST(cv));
5894 if (ps && !*ps && op_const_sv(block, cv))
5895 CvCONST_on(cv);
a0d0e21e 5896 }
79072805 5897
ed4a8a9b 5898 if (has_name) {
3280af22 5899 if (PERLDB_SUBLINE && PL_curstash != PL_debstash) {
561b68a9 5900 SV * const sv = newSV(0);
c4420975 5901 SV * const tmpstr = sv_newmortal();
5c1737d1
NC
5902 GV * const db_postponed = gv_fetchpvs("DB::postponed",
5903 GV_ADDMULTI, SVt_PVHV);
44a8e56a 5904 HV *hv;
5905
ed094faf
GS
5906 Perl_sv_setpvf(aTHX_ sv, "%s:%ld-%ld",
5907 CopFILE(PL_curcop),
cc49e20b 5908 (long)PL_subline, (long)CopLINE(PL_curcop));
bd61b366 5909 gv_efullname3(tmpstr, gv, NULL);
04fe65b0
RGS
5910 (void)hv_store(GvHV(PL_DBsub), SvPVX_const(tmpstr),
5911 SvCUR(tmpstr), sv, 0);
44a8e56a 5912 hv = GvHVn(db_postponed);
551405c4
AL
5913 if (HvFILL(hv) > 0 && hv_exists(hv, SvPVX_const(tmpstr), SvCUR(tmpstr))) {
5914 CV * const pcv = GvCV(db_postponed);
5915 if (pcv) {
5916 dSP;
5917 PUSHMARK(SP);
5918 XPUSHs(tmpstr);
5919 PUTBACK;
ad64d0ec 5920 call_sv(MUTABLE_SV(pcv), G_DISCARD);
551405c4 5921 }
44a8e56a 5922 }
5923 }
79072805 5924
13765c85 5925 if (name && ! (PL_parser && PL_parser->error_count))
0cd10f52 5926 process_special_blocks(name, gv, cv);
33fb7a6e 5927 }
ed094faf 5928
33fb7a6e 5929 done:
53a7735b
DM
5930 if (PL_parser)
5931 PL_parser->copline = NOLINE;
33fb7a6e
NC
5932 LEAVE_SCOPE(floor);
5933 return cv;
5934}
ed094faf 5935
33fb7a6e
NC
5936STATIC void
5937S_process_special_blocks(pTHX_ const char *const fullname, GV *const gv,
5938 CV *const cv)
5939{
5940 const char *const colon = strrchr(fullname,':');
5941 const char *const name = colon ? colon + 1 : fullname;
5942
7918f24d
NC
5943 PERL_ARGS_ASSERT_PROCESS_SPECIAL_BLOCKS;
5944
33fb7a6e 5945 if (*name == 'B') {
6952d67e 5946 if (strEQ(name, "BEGIN")) {
6867be6d 5947 const I32 oldscope = PL_scopestack_ix;
28757baa 5948 ENTER;
57843af0
GS
5949 SAVECOPFILE(&PL_compiling);
5950 SAVECOPLINE(&PL_compiling);
28757baa 5951
a58fb6f9 5952 DEBUG_x( dump_sub(gv) );
ad64d0ec 5953 Perl_av_create_and_push(aTHX_ &PL_beginav, MUTABLE_SV(cv));
ea2f84a3 5954 GvCV(gv) = 0; /* cv has been hijacked */
3280af22 5955 call_list(oldscope, PL_beginav);
a6006777 5956
3280af22 5957 PL_curcop = &PL_compiling;
623e6609 5958 CopHINTS_set(&PL_compiling, PL_hints);
28757baa 5959 LEAVE;
5960 }
33fb7a6e
NC
5961 else
5962 return;
5963 } else {
5964 if (*name == 'E') {
5965 if strEQ(name, "END") {
a58fb6f9 5966 DEBUG_x( dump_sub(gv) );
ad64d0ec 5967 Perl_av_create_and_unshift_one(aTHX_ &PL_endav, MUTABLE_SV(cv));
33fb7a6e
NC
5968 } else
5969 return;
5970 } else if (*name == 'U') {
5971 if (strEQ(name, "UNITCHECK")) {
5972 /* It's never too late to run a unitcheck block */
ad64d0ec 5973 Perl_av_create_and_unshift_one(aTHX_ &PL_unitcheckav, MUTABLE_SV(cv));
33fb7a6e
NC
5974 }
5975 else
5976 return;
5977 } else if (*name == 'C') {
5978 if (strEQ(name, "CHECK")) {
a2a5de95
NC
5979 if (PL_main_start)
5980 Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
5981 "Too late to run CHECK block");
ad64d0ec 5982 Perl_av_create_and_unshift_one(aTHX_ &PL_checkav, MUTABLE_SV(cv));
33fb7a6e
NC
5983 }
5984 else
5985 return;
5986 } else if (*name == 'I') {
5987 if (strEQ(name, "INIT")) {
a2a5de95
NC
5988 if (PL_main_start)
5989 Perl_ck_warner(aTHX_ packWARN(WARN_VOID),
5990 "Too late to run INIT block");
ad64d0ec 5991 Perl_av_create_and_push(aTHX_ &PL_initav, MUTABLE_SV(cv));
33fb7a6e
NC
5992 }
5993 else
5994 return;
5995 } else
5996 return;
a58fb6f9 5997 DEBUG_x( dump_sub(gv) );
33fb7a6e 5998 GvCV(gv) = 0; /* cv has been hijacked */
79072805 5999 }
79072805
LW
6000}
6001
954c1994
GS
6002/*
6003=for apidoc newCONSTSUB
6004
6005Creates a constant sub equivalent to Perl C<sub FOO () { 123 }> which is
6006eligible for inlining at compile-time.
6007
99ab892b
NC
6008Passing NULL for SV creates a constant sub equivalent to C<sub BAR () {}>,
6009which won't be called if used as a destructor, but will suppress the overhead
6010of a call to C<AUTOLOAD>. (This form, however, isn't eligible for inlining at
6011compile time.)
6012
954c1994
GS
6013=cut
6014*/
6015
beab0874 6016CV *
e1ec3a88 6017Perl_newCONSTSUB(pTHX_ HV *stash, const char *name, SV *sv)
5476c433 6018{
27da23d5 6019 dVAR;
beab0874 6020 CV* cv;
cbf82dd0 6021#ifdef USE_ITHREADS
54d012c6 6022 const char *const file = CopFILE(PL_curcop);
cbf82dd0
NC
6023#else
6024 SV *const temp_sv = CopFILESV(PL_curcop);
def18e4c 6025 const char *const file = temp_sv ? SvPV_nolen_const(temp_sv) : NULL;
cbf82dd0 6026#endif
5476c433 6027
11faa288 6028 ENTER;
11faa288 6029
401667e9
DM
6030 if (IN_PERL_RUNTIME) {
6031 /* at runtime, it's not safe to manipulate PL_curcop: it may be
6032 * an op shared between threads. Use a non-shared COP for our
6033 * dirty work */
6034 SAVEVPTR(PL_curcop);
6035 PL_curcop = &PL_compiling;
6036 }
f4dd75d9 6037 SAVECOPLINE(PL_curcop);
53a7735b 6038 CopLINE_set(PL_curcop, PL_parser ? PL_parser->copline : NOLINE);
f4dd75d9
GS
6039
6040 SAVEHINTS();
3280af22 6041 PL_hints &= ~HINT_BLOCK_SCOPE;
11faa288
GS
6042
6043 if (stash) {
6044 SAVESPTR(PL_curstash);
6045 SAVECOPSTASH(PL_curcop);
6046 PL_curstash = stash;
05ec9bb3 6047 CopSTASH_set(PL_curcop,stash);
11faa288 6048 }
5476c433 6049
cbf82dd0
NC
6050 /* file becomes the CvFILE. For an XS, it's supposed to be static storage,
6051 and so doesn't get free()d. (It's expected to be from the C pre-
6052 processor __FILE__ directive). But we need a dynamically allocated one,
77004dee 6053 and we need it to get freed. */
54d012c6
NC
6054 cv = newXS_flags(name, const_sv_xsub, file ? file : "", "",
6055 XS_DYNAMIC_FILENAME);
beab0874
JT
6056 CvXSUBANY(cv).any_ptr = sv;
6057 CvCONST_on(cv);
5476c433 6058
65e66c80 6059#ifdef USE_ITHREADS
02f28d44
MHM
6060 if (stash)
6061 CopSTASH_free(PL_curcop);
65e66c80 6062#endif
11faa288 6063 LEAVE;
beab0874
JT
6064
6065 return cv;
5476c433
JD
6066}
6067
77004dee
NC
6068CV *
6069Perl_newXS_flags(pTHX_ const char *name, XSUBADDR_t subaddr,
6070 const char *const filename, const char *const proto,
6071 U32 flags)
6072{
6073 CV *cv = newXS(name, subaddr, filename);
6074
7918f24d
NC
6075 PERL_ARGS_ASSERT_NEWXS_FLAGS;
6076
77004dee
NC
6077 if (flags & XS_DYNAMIC_FILENAME) {
6078 /* We need to "make arrangements" (ie cheat) to ensure that the
6079 filename lasts as long as the PVCV we just created, but also doesn't
6080 leak */
6081 STRLEN filename_len = strlen(filename);
6082 STRLEN proto_and_file_len = filename_len;
6083 char *proto_and_file;
6084 STRLEN proto_len;
6085
6086 if (proto) {
6087 proto_len = strlen(proto);
6088 proto_and_file_len += proto_len;
6089
6090 Newx(proto_and_file, proto_and_file_len + 1, char);
6091 Copy(proto, proto_and_file, proto_len, char);
6092 Copy(filename, proto_and_file + proto_len, filename_len + 1, char);
6093 } else {
6094 proto_len = 0;
6095 proto_and_file = savepvn(filename, filename_len);
6096 }
6097
6098 /* This gets free()d. :-) */
ad64d0ec 6099 sv_usepvn_flags(MUTABLE_SV(cv), proto_and_file, proto_and_file_len,
77004dee
NC
6100 SV_HAS_TRAILING_NUL);
6101 if (proto) {
6102 /* This gives us the correct prototype, rather than one with the
6103 file name appended. */
6104 SvCUR_set(cv, proto_len);
6105 } else {
6106 SvPOK_off(cv);
6107 }
81a2b3b6 6108 CvFILE(cv) = proto_and_file + proto_len;
77004dee 6109 } else {
ad64d0ec 6110 sv_setpv(MUTABLE_SV(cv), proto);
77004dee
NC
6111 }
6112 return cv;
6113}
6114
954c1994
GS
6115/*
6116=for apidoc U||newXS
6117
77004dee
NC
6118Used by C<xsubpp> to hook up XSUBs as Perl subs. I<filename> needs to be
6119static storage, as it is used directly as CvFILE(), without a copy being made.
954c1994
GS
6120
6121=cut
6122*/
6123
57d3b86d 6124CV *
bfed75c6 6125Perl_newXS(pTHX_ const char *name, XSUBADDR_t subaddr, const char *filename)
a0d0e21e 6126{
97aff369 6127 dVAR;
666ea192
JH
6128 GV * const gv = gv_fetchpv(name ? name :
6129 (PL_curstash ? "__ANON__" : "__ANON__::__ANON__"),
6130 GV_ADDMULTI, SVt_PVCV);
79072805 6131 register CV *cv;
44a8e56a 6132
7918f24d
NC
6133 PERL_ARGS_ASSERT_NEWXS;
6134
1ecdd9a8
HS
6135 if (!subaddr)
6136 Perl_croak(aTHX_ "panic: no address for '%s' in '%s'", name, filename);
6137
601f1833 6138 if ((cv = (name ? GvCV(gv) : NULL))) {
44a8e56a 6139 if (GvCVGEN(gv)) {
6140 /* just a cached method */
6141 SvREFCNT_dec(cv);
601f1833 6142 cv = NULL;
44a8e56a 6143 }
6144 else if (CvROOT(cv) || CvXSUB(cv) || GvASSUMECV(gv)) {
6145 /* already defined (or promised) */
1df70142 6146 /* XXX It's possible for this HvNAME_get to return null, and get passed into strEQ */
66a1b24b
AL
6147 if (ckWARN(WARN_REDEFINE)) {
6148 GV * const gvcv = CvGV(cv);
6149 if (gvcv) {
6150 HV * const stash = GvSTASH(gvcv);
6151 if (stash) {
8b38226b
AL
6152 const char *redefined_name = HvNAME_get(stash);
6153 if ( strEQ(redefined_name,"autouse") ) {
66a1b24b 6154 const line_t oldline = CopLINE(PL_curcop);
53a7735b
DM
6155 if (PL_parser && PL_parser->copline != NOLINE)
6156 CopLINE_set(PL_curcop, PL_parser->copline);
66a1b24b 6157 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
666ea192
JH
6158 CvCONST(cv) ? "Constant subroutine %s redefined"
6159 : "Subroutine %s redefined"
6160 ,name);
66a1b24b
AL
6161 CopLINE_set(PL_curcop, oldline);
6162 }
6163 }
6164 }
a0d0e21e
LW
6165 }
6166 SvREFCNT_dec(cv);
601f1833 6167 cv = NULL;
79072805 6168 }
79072805 6169 }
44a8e56a 6170
6171 if (cv) /* must reuse cv if autoloaded */
6172 cv_undef(cv);
a0d0e21e 6173 else {
ea726b52 6174 cv = MUTABLE_CV(newSV_type(SVt_PVCV));
44a8e56a 6175 if (name) {
6176 GvCV(gv) = cv;
6177 GvCVGEN(gv) = 0;
e1a479c5 6178 mro_method_changed_in(GvSTASH(gv)); /* newXS */
44a8e56a 6179 }
a0d0e21e 6180 }
65c50114 6181 CvGV(cv) = gv;
b195d487 6182 (void)gv_fetchfile(filename);
dd374669 6183 CvFILE(cv) = (char *)filename; /* NOTE: not copied, as it is expected to be
57843af0 6184 an external constant string */
d04ba589 6185 CvISXSUB_on(cv);
a0d0e21e 6186 CvXSUB(cv) = subaddr;
44a8e56a 6187
33fb7a6e
NC
6188 if (name)
6189 process_special_blocks(name, gv, cv);
8990e307 6190 else
a5f75d66 6191 CvANON_on(cv);
44a8e56a 6192
a0d0e21e 6193 return cv;
79072805
LW
6194}
6195
eb8433b7
NC
6196#ifdef PERL_MAD
6197OP *
6198#else
79072805 6199void
eb8433b7 6200#endif
864dbfa3 6201Perl_newFORM(pTHX_ I32 floor, OP *o, OP *block)
79072805 6202{
97aff369 6203 dVAR;
79072805 6204 register CV *cv;
eb8433b7
NC
6205#ifdef PERL_MAD
6206 OP* pegop = newOP(OP_NULL, 0);
6207#endif
79072805 6208
0bd48802 6209 GV * const gv = o
f776e3cd 6210 ? gv_fetchsv(cSVOPo->op_sv, GV_ADD, SVt_PVFM)
fafc274c 6211 : gv_fetchpvs("STDOUT", GV_ADD|GV_NOTQUAL, SVt_PVFM);
0bd48802 6212
a5f75d66 6213 GvMULTI_on(gv);
155aba94 6214 if ((cv = GvFORM(gv))) {
599cee73 6215 if (ckWARN(WARN_REDEFINE)) {
6867be6d 6216 const line_t oldline = CopLINE(PL_curcop);
53a7735b
DM
6217 if (PL_parser && PL_parser->copline != NOLINE)
6218 CopLINE_set(PL_curcop, PL_parser->copline);
ee6d2783
NC
6219 if (o) {
6220 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
6221 "Format %"SVf" redefined", SVfARG(cSVOPo->op_sv));
6222 } else {
6223 Perl_warner(aTHX_ packWARN(WARN_REDEFINE),
6224 "Format STDOUT redefined");
6225 }
57843af0 6226 CopLINE_set(PL_curcop, oldline);
79072805 6227 }
8990e307 6228 SvREFCNT_dec(cv);
79072805 6229 }
3280af22 6230 cv = PL_compcv;
79072805 6231 GvFORM(gv) = cv;
65c50114 6232 CvGV(cv) = gv;
a636914a 6233 CvFILE_set_from_cop(cv, PL_curcop);
79072805 6234
a0d0e21e 6235
dd2155a4 6236 pad_tidy(padtidy_FORMAT);
79072805 6237 CvROOT(cv) = newUNOP(OP_LEAVEWRITE, 0, scalarseq(block));
7934575e
GS
6238 CvROOT(cv)->op_private |= OPpREFCOUNTED;
6239 OpREFCNT_set(CvROOT(cv), 1);
79072805
LW
6240 CvSTART(cv) = LINKLIST(CvROOT(cv));
6241 CvROOT(cv)->op_next = 0;
a2efc822 6242 CALL_PEEP(CvSTART(cv));
eb8433b7
NC
6243#ifdef PERL_MAD
6244 op_getmad(o,pegop,'n');
6245 op_getmad_weak(block, pegop, 'b');
6246#else
11343788 6247 op_free(o);
eb8433b7 6248#endif
53a7735b
DM
6249 if (PL_parser)
6250 PL_parser->copline = NOLINE;
8990e307 6251 LEAVE_SCOPE(floor);
eb8433b7
NC
6252#ifdef PERL_MAD
6253 return pegop;
6254#endif
79072805
LW
6255}
6256
6257OP *
864dbfa3 6258Perl_newANONLIST(pTHX_ OP *o)
79072805 6259{
78c72037 6260 return convert(OP_ANONLIST, OPf_SPECIAL, o);
79072805
LW
6261}
6262
6263OP *
864dbfa3 6264Perl_newANONHASH(pTHX_ OP *o)
79072805 6265{
78c72037 6266 return convert(OP_ANONHASH, OPf_SPECIAL, o);
a0d0e21e
LW
6267}
6268
6269OP *
864dbfa3 6270Perl_newANONSUB(pTHX_ I32 floor, OP *proto, OP *block)
a0d0e21e 6271{
5f66b61c 6272 return newANONATTRSUB(floor, proto, NULL, block);
09bef843
SB
6273}
6274
6275OP *
6276Perl_newANONATTRSUB(pTHX_ I32 floor, OP *proto, OP *attrs, OP *block)
6277{
a0d0e21e 6278 return newUNOP(OP_REFGEN, 0,
09bef843 6279 newSVOP(OP_ANONCODE, 0,
ad64d0ec 6280 MUTABLE_SV(newATTRSUB(floor, 0, proto, attrs, block))));
79072805
LW
6281}
6282
6283OP *
864dbfa3 6284Perl_oopsAV(pTHX_ OP *o)
79072805 6285{
27da23d5 6286 dVAR;
7918f24d
NC
6287
6288 PERL_ARGS_ASSERT_OOPSAV;
6289
ed6116ce
LW
6290 switch (o->op_type) {
6291 case OP_PADSV:
6292 o->op_type = OP_PADAV;
22c35a8c 6293 o->op_ppaddr = PL_ppaddr[OP_PADAV];
51e247a3 6294 return ref(o, OP_RV2AV);
b2ffa427 6295
ed6116ce 6296 case OP_RV2SV:
79072805 6297 o->op_type = OP_RV2AV;
22c35a8c 6298 o->op_ppaddr = PL_ppaddr[OP_RV2AV];
79072805 6299 ref(o, OP_RV2AV);
ed6116ce
LW
6300 break;
6301
6302 default:
9b387841 6303 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "oops: oopsAV");
ed6116ce
LW
6304 break;
6305 }
79072805
LW
6306 return o;
6307}
6308
6309OP *
864dbfa3 6310Perl_oopsHV(pTHX_ OP *o)
79072805 6311{
27da23d5 6312 dVAR;
7918f24d
NC
6313
6314 PERL_ARGS_ASSERT_OOPSHV;
6315
ed6116ce
LW
6316 switch (o->op_type) {
6317 case OP_PADSV:
6318 case OP_PADAV:
6319 o->op_type = OP_PADHV;
22c35a8c 6320 o->op_ppaddr = PL_ppaddr[OP_PADHV];
51e247a3 6321 return ref(o, OP_RV2HV);
ed6116ce
LW
6322
6323 case OP_RV2SV:
6324 case OP_RV2AV:
79072805 6325 o->op_type = OP_RV2HV;
22c35a8c 6326 o->op_ppaddr = PL_ppaddr[OP_RV2HV];
79072805 6327 ref(o, OP_RV2HV);
ed6116ce
LW
6328 break;
6329
6330 default:
9b387841 6331 Perl_ck_warner_d(aTHX_ packWARN(WARN_INTERNAL), "oops: oopsHV");
ed6116ce
LW
6332 break;
6333 }
79072805
LW
6334 return o;
6335}
6336
6337OP *
864dbfa3 6338Perl_newAVREF(pTHX_ OP *o)
79072805 6339{
27da23d5 6340 dVAR;
7918f24d
NC
6341
6342 PERL_ARGS_ASSERT_NEWAVREF;
6343
ed6116ce
LW
6344 if (o->op_type == OP_PADANY) {
6345 o->op_type = OP_PADAV;
22c35a8c 6346 o->op_ppaddr = PL_ppaddr[OP_PADAV];
93a17b20 6347 return o;
ed6116ce 6348 }
a2a5de95 6349 else if ((o->op_type == OP_RV2AV || o->op_type == OP_PADAV)) {
d1d15184 6350 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
a2a5de95 6351 "Using an array as a reference is deprecated");
a1063b2d 6352 }
79072805
LW
6353 return newUNOP(OP_RV2AV, 0, scalar(o));
6354}
6355
6356OP *
864dbfa3 6357Perl_newGVREF(pTHX_ I32 type, OP *o)
79072805 6358{
82092f1d 6359 if (type == OP_MAPSTART || type == OP_GREPSTART || type == OP_SORT)
a0d0e21e 6360 return newUNOP(OP_NULL, 0, o);
748a9306 6361 return ref(newUNOP(OP_RV2GV, OPf_REF, o), type);
79072805
LW
6362}
6363
6364OP *
864dbfa3 6365Perl_newHVREF(pTHX_ OP *o)
79072805 6366{
27da23d5 6367 dVAR;
7918f24d
NC
6368
6369 PERL_ARGS_ASSERT_NEWHVREF;
6370
ed6116ce
LW
6371 if (o->op_type == OP_PADANY) {
6372 o->op_type = OP_PADHV;
22c35a8c 6373 o->op_ppaddr = PL_ppaddr[OP_PADHV];
93a17b20 6374 return o;
ed6116ce 6375 }
a2a5de95 6376 else if ((o->op_type == OP_RV2HV || o->op_type == OP_PADHV)) {
d1d15184 6377 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
a2a5de95 6378 "Using a hash as a reference is deprecated");
a1063b2d 6379 }
79072805
LW
6380 return newUNOP(OP_RV2HV, 0, scalar(o));
6381}
6382
6383OP *
864dbfa3 6384Perl_newCVREF(pTHX_ I32 flags, OP *o)
79072805 6385{
c07a80fd 6386 return newUNOP(OP_RV2CV, flags, scalar(o));
79072805
LW
6387}
6388
6389OP *
864dbfa3 6390Perl_newSVREF(pTHX_ OP *o)
79072805 6391{
27da23d5 6392 dVAR;
7918f24d
NC
6393
6394 PERL_ARGS_ASSERT_NEWSVREF;
6395
ed6116ce
LW
6396 if (o->op_type == OP_PADANY) {
6397 o->op_type = OP_PADSV;
22c35a8c 6398 o->op_ppaddr = PL_ppaddr[OP_PADSV];
93a17b20 6399 return o;
ed6116ce 6400 }
79072805
LW
6401 return newUNOP(OP_RV2SV, 0, scalar(o));
6402}
6403
61b743bb
DM
6404/* Check routines. See the comments at the top of this file for details
6405 * on when these are called */
79072805
LW
6406
6407OP *
cea2e8a9 6408Perl_ck_anoncode(pTHX_ OP *o)
5f05dabc 6409{
7918f24d
NC
6410 PERL_ARGS_ASSERT_CK_ANONCODE;
6411
dd2155a4 6412 cSVOPo->op_targ = pad_add_anon(cSVOPo->op_sv, o->op_type);
eb8433b7 6413 if (!PL_madskills)
1d866c12 6414 cSVOPo->op_sv = NULL;
5dc0d613 6415 return o;
5f05dabc 6416}
6417
6418OP *
cea2e8a9 6419Perl_ck_bitop(pTHX_ OP *o)
55497cff 6420{
97aff369 6421 dVAR;
7918f24d
NC
6422
6423 PERL_ARGS_ASSERT_CK_BITOP;
6424
276b2a0c
RGS
6425#define OP_IS_NUMCOMPARE(op) \
6426 ((op) == OP_LT || (op) == OP_I_LT || \
6427 (op) == OP_GT || (op) == OP_I_GT || \
6428 (op) == OP_LE || (op) == OP_I_LE || \
6429 (op) == OP_GE || (op) == OP_I_GE || \
6430 (op) == OP_EQ || (op) == OP_I_EQ || \
6431 (op) == OP_NE || (op) == OP_I_NE || \
6432 (op) == OP_NCMP || (op) == OP_I_NCMP)
d5ec2987 6433 o->op_private = (U8)(PL_hints & HINT_INTEGER);
2b84528b
RGS
6434 if (!(o->op_flags & OPf_STACKED) /* Not an assignment */
6435 && (o->op_type == OP_BIT_OR
6436 || o->op_type == OP_BIT_AND
6437 || o->op_type == OP_BIT_XOR))
276b2a0c 6438 {
1df70142
AL
6439 const OP * const left = cBINOPo->op_first;
6440 const OP * const right = left->op_sibling;
96a925ab
YST
6441 if ((OP_IS_NUMCOMPARE(left->op_type) &&
6442 (left->op_flags & OPf_PARENS) == 0) ||
6443 (OP_IS_NUMCOMPARE(right->op_type) &&
6444 (right->op_flags & OPf_PARENS) == 0))
a2a5de95
NC
6445 Perl_ck_warner(aTHX_ packWARN(WARN_PRECEDENCE),
6446 "Possible precedence problem on bitwise %c operator",
6447 o->op_type == OP_BIT_OR ? '|'
6448 : o->op_type == OP_BIT_AND ? '&' : '^'
6449 );
276b2a0c 6450 }
5dc0d613 6451 return o;
55497cff 6452}
6453
6454OP *
cea2e8a9 6455Perl_ck_concat(pTHX_ OP *o)
79072805 6456{
0bd48802 6457 const OP * const kid = cUNOPo->op_first;
7918f24d
NC
6458
6459 PERL_ARGS_ASSERT_CK_CONCAT;
96a5add6 6460 PERL_UNUSED_CONTEXT;
7918f24d 6461
df91b2c5
AE
6462 if (kid->op_type == OP_CONCAT && !(kid->op_private & OPpTARGET_MY) &&
6463 !(kUNOP->op_first->op_flags & OPf_MOD))
0165acc7 6464 o->op_flags |= OPf_STACKED;
11343788 6465 return o;
79072805
LW
6466}
6467
6468OP *
cea2e8a9 6469Perl_ck_spair(pTHX_ OP *o)
79072805 6470{
27da23d5 6471 dVAR;
7918f24d
NC
6472
6473 PERL_ARGS_ASSERT_CK_SPAIR;
6474
11343788 6475 if (o->op_flags & OPf_KIDS) {
79072805 6476 OP* newop;
a0d0e21e 6477 OP* kid;
6867be6d 6478 const OPCODE type = o->op_type;
5dc0d613 6479 o = modkids(ck_fun(o), type);
11343788 6480 kid = cUNOPo->op_first;
a0d0e21e 6481 newop = kUNOP->op_first->op_sibling;
1496a290
AL
6482 if (newop) {
6483 const OPCODE type = newop->op_type;
6484 if (newop->op_sibling || !(PL_opargs[type] & OA_RETSCALAR) ||
6485 type == OP_PADAV || type == OP_PADHV ||
6486 type == OP_RV2AV || type == OP_RV2HV)
6487 return o;
a0d0e21e 6488 }
eb8433b7
NC
6489#ifdef PERL_MAD
6490 op_getmad(kUNOP->op_first,newop,'K');
6491#else
a0d0e21e 6492 op_free(kUNOP->op_first);
eb8433b7 6493#endif
a0d0e21e
LW
6494 kUNOP->op_first = newop;
6495 }
22c35a8c 6496 o->op_ppaddr = PL_ppaddr[++o->op_type];
11343788 6497 return ck_fun(o);
a0d0e21e
LW
6498}
6499
6500OP *
cea2e8a9 6501Perl_ck_delete(pTHX_ OP *o)
a0d0e21e 6502{
7918f24d
NC
6503 PERL_ARGS_ASSERT_CK_DELETE;
6504
11343788 6505 o = ck_fun(o);
5dc0d613 6506 o->op_private = 0;
11343788 6507 if (o->op_flags & OPf_KIDS) {
551405c4 6508 OP * const kid = cUNOPo->op_first;
01020589
GS
6509 switch (kid->op_type) {
6510 case OP_ASLICE:
6511 o->op_flags |= OPf_SPECIAL;
6512 /* FALL THROUGH */
6513 case OP_HSLICE:
5dc0d613 6514 o->op_private |= OPpSLICE;
01020589
GS
6515 break;
6516 case OP_AELEM:
6517 o->op_flags |= OPf_SPECIAL;
6518 /* FALL THROUGH */
6519 case OP_HELEM:
6520 break;
6521 default:
6522 Perl_croak(aTHX_ "%s argument is not a HASH or ARRAY element or slice",
53e06cf0 6523 OP_DESC(o));
01020589 6524 }
7332a6c4
VP
6525 if (kid->op_private & OPpLVAL_INTRO)
6526 o->op_private |= OPpLVAL_INTRO;
93c66552 6527 op_null(kid);
79072805 6528 }
11343788 6529 return o;
79072805
LW
6530}
6531
6532OP *
96e176bf
CL
6533Perl_ck_die(pTHX_ OP *o)
6534{
7918f24d
NC
6535 PERL_ARGS_ASSERT_CK_DIE;
6536
96e176bf
CL
6537#ifdef VMS
6538 if (VMSISH_HUSHED) o->op_private |= OPpHUSH_VMSISH;
6539#endif
6540 return ck_fun(o);
6541}
6542
6543OP *
cea2e8a9 6544Perl_ck_eof(pTHX_ OP *o)
79072805 6545{
97aff369 6546 dVAR;
79072805 6547
7918f24d
NC
6548 PERL_ARGS_ASSERT_CK_EOF;
6549
11343788
MB
6550 if (o->op_flags & OPf_KIDS) {
6551 if (cLISTOPo->op_first->op_type == OP_STUB) {
1d866c12
AL
6552 OP * const newop
6553 = newUNOP(o->op_type, OPf_SPECIAL, newGVOP(OP_GV, 0, PL_argvgv));
eb8433b7
NC
6554#ifdef PERL_MAD
6555 op_getmad(o,newop,'O');
6556#else
11343788 6557 op_free(o);
eb8433b7
NC
6558#endif
6559 o = newop;
8990e307 6560 }
11343788 6561 return ck_fun(o);
79072805 6562 }
11343788 6563 return o;
79072805
LW
6564}
6565
6566OP *
cea2e8a9 6567Perl_ck_eval(pTHX_ OP *o)
79072805 6568{
27da23d5 6569 dVAR;
7918f24d
NC
6570
6571 PERL_ARGS_ASSERT_CK_EVAL;
6572
3280af22 6573 PL_hints |= HINT_BLOCK_SCOPE;
11343788 6574 if (o->op_flags & OPf_KIDS) {
46c461b5 6575 SVOP * const kid = (SVOP*)cUNOPo->op_first;
79072805 6576
93a17b20 6577 if (!kid) {
11343788 6578 o->op_flags &= ~OPf_KIDS;
93c66552 6579 op_null(o);
79072805 6580 }
b14574b4 6581 else if (kid->op_type == OP_LINESEQ || kid->op_type == OP_STUB) {
79072805 6582 LOGOP *enter;
eb8433b7 6583#ifdef PERL_MAD
1d866c12 6584 OP* const oldo = o;
eb8433b7 6585#endif
79072805 6586
11343788 6587 cUNOPo->op_first = 0;
eb8433b7 6588#ifndef PERL_MAD
11343788 6589 op_free(o);
eb8433b7 6590#endif
79072805 6591
b7dc083c 6592 NewOp(1101, enter, 1, LOGOP);
79072805 6593 enter->op_type = OP_ENTERTRY;
22c35a8c 6594 enter->op_ppaddr = PL_ppaddr[OP_ENTERTRY];
79072805
LW
6595 enter->op_private = 0;
6596
6597 /* establish postfix order */
6598 enter->op_next = (OP*)enter;
6599
3a7a94e2
RGS
6600 CHECKOP(OP_ENTERTRY, enter);
6601
11343788
MB
6602 o = prepend_elem(OP_LINESEQ, (OP*)enter, (OP*)kid);
6603 o->op_type = OP_LEAVETRY;
22c35a8c 6604 o->op_ppaddr = PL_ppaddr[OP_LEAVETRY];
11343788 6605 enter->op_other = o;
eb8433b7 6606 op_getmad(oldo,o,'O');
11343788 6607 return o;
79072805 6608 }
b5c19bd7 6609 else {
473986ff 6610 scalar((OP*)kid);
b5c19bd7
DM
6611 PL_cv_has_eval = 1;
6612 }
79072805
LW
6613 }
6614 else {
eb8433b7 6615#ifdef PERL_MAD
1d866c12 6616 OP* const oldo = o;
eb8433b7 6617#else
11343788 6618 op_free(o);
eb8433b7 6619#endif
54b9620d 6620 o = newUNOP(OP_ENTEREVAL, 0, newDEFSVOP());
eb8433b7 6621 op_getmad(oldo,o,'O');
79072805 6622 }
3280af22 6623 o->op_targ = (PADOFFSET)PL_hints;
7168684c 6624 if ((PL_hints & HINT_LOCALIZE_HH) != 0 && GvHV(PL_hintgv)) {
996c9baa
VP
6625 /* Store a copy of %^H that pp_entereval can pick up. */
6626 OP *hhop = newSVOP(OP_HINTSEVAL, 0,
ad64d0ec 6627 MUTABLE_SV(Perl_hv_copy_hints_hv(aTHX_ GvHV(PL_hintgv))));
0d863452
RH
6628 cUNOPo->op_first->op_sibling = hhop;
6629 o->op_private |= OPpEVAL_HAS_HH;
6630 }
11343788 6631 return o;
79072805
LW
6632}
6633
6634OP *
d98f61e7
GS
6635Perl_ck_exit(pTHX_ OP *o)
6636{
7918f24d
NC
6637 PERL_ARGS_ASSERT_CK_EXIT;
6638
d98f61e7 6639#ifdef VMS
551405c4 6640 HV * const table = GvHV(PL_hintgv);
d98f61e7 6641 if (table) {
a4fc7abc 6642 SV * const * const svp = hv_fetchs(table, "vmsish_exit", FALSE);
d98f61e7
GS
6643 if (svp && *svp && SvTRUE(*svp))
6644 o->op_private |= OPpEXIT_VMSISH;
6645 }
96e176bf 6646 if (VMSISH_HUSHED) o->op_private |= OPpHUSH_VMSISH;
d98f61e7
GS
6647#endif
6648 return ck_fun(o);
6649}
6650
6651OP *
cea2e8a9 6652Perl_ck_exec(pTHX_ OP *o)
79072805 6653{
7918f24d
NC
6654 PERL_ARGS_ASSERT_CK_EXEC;
6655
11343788 6656 if (o->op_flags & OPf_STACKED) {
6867be6d 6657 OP *kid;
11343788
MB
6658 o = ck_fun(o);
6659 kid = cUNOPo->op_first->op_sibling;
8990e307 6660 if (kid->op_type == OP_RV2GV)
93c66552 6661 op_null(kid);
79072805 6662 }
463ee0b2 6663 else
11343788
MB
6664 o = listkids(o);
6665 return o;
79072805
LW
6666}
6667
6668OP *
cea2e8a9 6669Perl_ck_exists(pTHX_ OP *o)
5f05dabc 6670{
97aff369 6671 dVAR;
7918f24d
NC
6672
6673 PERL_ARGS_ASSERT_CK_EXISTS;
6674
5196be3e
MB
6675 o = ck_fun(o);
6676 if (o->op_flags & OPf_KIDS) {
46c461b5 6677 OP * const kid = cUNOPo->op_first;
afebc493
GS
6678 if (kid->op_type == OP_ENTERSUB) {
6679 (void) ref(kid, o->op_type);
13765c85
DM
6680 if (kid->op_type != OP_RV2CV
6681 && !(PL_parser && PL_parser->error_count))
afebc493 6682 Perl_croak(aTHX_ "%s argument is not a subroutine name",
53e06cf0 6683 OP_DESC(o));
afebc493
GS
6684 o->op_private |= OPpEXISTS_SUB;
6685 }
6686 else if (kid->op_type == OP_AELEM)
01020589
GS
6687 o->op_flags |= OPf_SPECIAL;
6688 else if (kid->op_type != OP_HELEM)
b0fdf69e 6689 Perl_croak(aTHX_ "%s argument is not a HASH or ARRAY element or a subroutine",
53e06cf0 6690 OP_DESC(o));
93c66552 6691 op_null(kid);
5f05dabc 6692 }
5196be3e 6693 return o;
5f05dabc 6694}
6695
79072805 6696OP *
cea2e8a9 6697Perl_ck_rvconst(pTHX_ register OP *o)
79072805 6698{
27da23d5 6699 dVAR;
0bd48802 6700 SVOP * const kid = (SVOP*)cUNOPo->op_first;
85e6fe83 6701
7918f24d
NC
6702 PERL_ARGS_ASSERT_CK_RVCONST;
6703
3280af22 6704 o->op_private |= (PL_hints & HINT_STRICT_REFS);
e26df76a
NC
6705 if (o->op_type == OP_RV2CV)
6706 o->op_private &= ~1;
6707
79072805 6708 if (kid->op_type == OP_CONST) {
44a8e56a 6709 int iscv;
6710 GV *gv;
504618e9 6711 SV * const kidsv = kid->op_sv;
44a8e56a 6712
779c5bc9
GS
6713 /* Is it a constant from cv_const_sv()? */
6714 if (SvROK(kidsv) && SvREADONLY(kidsv)) {
0bd48802 6715 SV * const rsv = SvRV(kidsv);
42d0e0b7 6716 const svtype type = SvTYPE(rsv);
bd61b366 6717 const char *badtype = NULL;
779c5bc9
GS
6718
6719 switch (o->op_type) {
6720 case OP_RV2SV:
42d0e0b7 6721 if (type > SVt_PVMG)
779c5bc9
GS
6722 badtype = "a SCALAR";
6723 break;
6724 case OP_RV2AV:
42d0e0b7 6725 if (type != SVt_PVAV)
779c5bc9
GS
6726 badtype = "an ARRAY";
6727 break;
6728 case OP_RV2HV:
42d0e0b7 6729 if (type != SVt_PVHV)
779c5bc9 6730 badtype = "a HASH";
779c5bc9
GS
6731 break;
6732 case OP_RV2CV:
42d0e0b7 6733 if (type != SVt_PVCV)
779c5bc9
GS
6734 badtype = "a CODE";
6735 break;
6736 }
6737 if (badtype)
cea2e8a9 6738 Perl_croak(aTHX_ "Constant is not %s reference", badtype);
779c5bc9
GS
6739 return o;
6740 }
ce10b5d1
RGS
6741 else if ((o->op_type == OP_RV2HV || o->op_type == OP_RV2SV) &&
6742 (PL_hints & HINT_STRICT_REFS) && SvPOK(kidsv)) {
6743 /* If this is an access to a stash, disable "strict refs", because
6744 * stashes aren't auto-vivified at compile-time (unless we store
6745 * symbols in them), and we don't want to produce a run-time
6746 * stricture error when auto-vivifying the stash. */
6747 const char *s = SvPV_nolen(kidsv);
6748 const STRLEN l = SvCUR(kidsv);
6749 if (l > 1 && s[l-1] == ':' && s[l-2] == ':')
6750 o->op_private &= ~HINT_STRICT_REFS;
6751 }
6752 if ((o->op_private & HINT_STRICT_REFS) && (kid->op_private & OPpCONST_BARE)) {
5f66b61c 6753 const char *badthing;
5dc0d613 6754 switch (o->op_type) {
44a8e56a 6755 case OP_RV2SV:
6756 badthing = "a SCALAR";
6757 break;
6758 case OP_RV2AV:
6759 badthing = "an ARRAY";
6760 break;
6761 case OP_RV2HV:
6762 badthing = "a HASH";
6763 break;
5f66b61c
AL
6764 default:
6765 badthing = NULL;
6766 break;
44a8e56a 6767 }
6768 if (badthing)
1c846c1f 6769 Perl_croak(aTHX_
95b63a38 6770 "Can't use bareword (\"%"SVf"\") as %s ref while \"strict refs\" in use",
be2597df 6771 SVfARG(kidsv), badthing);
44a8e56a 6772 }
93233ece
CS
6773 /*
6774 * This is a little tricky. We only want to add the symbol if we
6775 * didn't add it in the lexer. Otherwise we get duplicate strict
6776 * warnings. But if we didn't add it in the lexer, we must at
6777 * least pretend like we wanted to add it even if it existed before,
6778 * or we get possible typo warnings. OPpCONST_ENTERED says
6779 * whether the lexer already added THIS instance of this symbol.
6780 */
5196be3e 6781 iscv = (o->op_type == OP_RV2CV) * 2;
93233ece 6782 do {
7a5fd60d 6783 gv = gv_fetchsv(kidsv,
748a9306 6784 iscv | !(kid->op_private & OPpCONST_ENTERED),
a0d0e21e
LW
6785 iscv
6786 ? SVt_PVCV
11343788 6787 : o->op_type == OP_RV2SV
a0d0e21e 6788 ? SVt_PV
11343788 6789 : o->op_type == OP_RV2AV
a0d0e21e 6790 ? SVt_PVAV
11343788 6791 : o->op_type == OP_RV2HV
a0d0e21e
LW
6792 ? SVt_PVHV
6793 : SVt_PVGV);
93233ece
CS
6794 } while (!gv && !(kid->op_private & OPpCONST_ENTERED) && !iscv++);
6795 if (gv) {
6796 kid->op_type = OP_GV;
6797 SvREFCNT_dec(kid->op_sv);
350de78d 6798#ifdef USE_ITHREADS
638eceb6 6799 /* XXX hack: dependence on sizeof(PADOP) <= sizeof(SVOP) */
350de78d 6800 kPADOP->op_padix = pad_alloc(OP_GV, SVs_PADTMP);
dd2155a4 6801 SvREFCNT_dec(PAD_SVl(kPADOP->op_padix));
743e66e6 6802 GvIN_PAD_on(gv);
ad64d0ec 6803 PAD_SETSV(kPADOP->op_padix, MUTABLE_SV(SvREFCNT_inc_simple_NN(gv)));
350de78d 6804#else
b37c2d43 6805 kid->op_sv = SvREFCNT_inc_simple_NN(gv);
350de78d 6806#endif
23f1ca44 6807 kid->op_private = 0;
76cd736e 6808 kid->op_ppaddr = PL_ppaddr[OP_GV];
a0d0e21e 6809 }
79072805 6810 }
11343788 6811 return o;
79072805
LW
6812}
6813
6814OP *
cea2e8a9 6815Perl_ck_ftst(pTHX_ OP *o)
79072805 6816{
27da23d5 6817 dVAR;
6867be6d 6818 const I32 type = o->op_type;
79072805 6819
7918f24d
NC
6820 PERL_ARGS_ASSERT_CK_FTST;
6821
d0dca557 6822 if (o->op_flags & OPf_REF) {
6f207bd3 6823 NOOP;
d0dca557
JD
6824 }
6825 else if (o->op_flags & OPf_KIDS && cUNOPo->op_first->op_type != OP_STUB) {
551405c4 6826 SVOP * const kid = (SVOP*)cUNOPo->op_first;
1496a290 6827 const OPCODE kidtype = kid->op_type;
79072805 6828
1496a290 6829 if (kidtype == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
551405c4 6830 OP * const newop = newGVOP(type, OPf_REF,
f776e3cd 6831 gv_fetchsv(kid->op_sv, GV_ADD, SVt_PVIO));
eb8433b7
NC
6832#ifdef PERL_MAD
6833 op_getmad(o,newop,'O');
6834#else
11343788 6835 op_free(o);
eb8433b7 6836#endif
1d866c12 6837 return newop;
79072805 6838 }
6ecf81d6 6839 if ((PL_hints & HINT_FILETEST_ACCESS) && OP_IS_FILETEST_ACCESS(o->op_type))
1af34c76 6840 o->op_private |= OPpFT_ACCESS;
1496a290
AL
6841 if (PL_check[kidtype] == MEMBER_TO_FPTR(Perl_ck_ftst)
6842 && kidtype != OP_STAT && kidtype != OP_LSTAT)
fbb0b3b3 6843 o->op_private |= OPpFT_STACKED;
79072805
LW
6844 }
6845 else {
eb8433b7 6846#ifdef PERL_MAD
1d866c12 6847 OP* const oldo = o;
eb8433b7 6848#else
11343788 6849 op_free(o);
eb8433b7 6850#endif
79072805 6851 if (type == OP_FTTTY)
8fde6460 6852 o = newGVOP(type, OPf_REF, PL_stdingv);
79072805 6853 else
d0dca557 6854 o = newUNOP(type, 0, newDEFSVOP());
eb8433b7 6855 op_getmad(oldo,o,'O');
79072805 6856 }
11343788 6857 return o;
79072805
LW
6858}
6859
6860OP *
cea2e8a9 6861Perl_ck_fun(pTHX_ OP *o)
79072805 6862{
97aff369 6863 dVAR;
6867be6d 6864 const int type = o->op_type;
22c35a8c 6865 register I32 oa = PL_opargs[type] >> OASHIFT;
aeea060c 6866
7918f24d
NC
6867 PERL_ARGS_ASSERT_CK_FUN;
6868
11343788 6869 if (o->op_flags & OPf_STACKED) {
79072805
LW
6870 if ((oa & OA_OPTIONAL) && (oa >> 4) && !((oa >> 4) & OA_OPTIONAL))
6871 oa &= ~OA_OPTIONAL;
6872 else
11343788 6873 return no_fh_allowed(o);
79072805
LW
6874 }
6875
11343788 6876 if (o->op_flags & OPf_KIDS) {
6867be6d
AL
6877 OP **tokid = &cLISTOPo->op_first;
6878 register OP *kid = cLISTOPo->op_first;
6879 OP *sibl;
6880 I32 numargs = 0;
6881
8990e307 6882 if (kid->op_type == OP_PUSHMARK ||
155aba94 6883 (kid->op_type == OP_NULL && kid->op_targ == OP_PUSHMARK))
8990e307 6884 {
79072805
LW
6885 tokid = &kid->op_sibling;
6886 kid = kid->op_sibling;
6887 }
22c35a8c 6888 if (!kid && PL_opargs[type] & OA_DEFGV)
54b9620d 6889 *tokid = kid = newDEFSVOP();
79072805
LW
6890
6891 while (oa && kid) {
6892 numargs++;
6893 sibl = kid->op_sibling;
eb8433b7
NC
6894#ifdef PERL_MAD
6895 if (!sibl && kid->op_type == OP_STUB) {
6896 numargs--;
6897 break;
6898 }
6899#endif
79072805
LW
6900 switch (oa & 7) {
6901 case OA_SCALAR:
62c18ce2
GS
6902 /* list seen where single (scalar) arg expected? */
6903 if (numargs == 1 && !(oa >> 4)
6904 && kid->op_type == OP_LIST && type != OP_SCALAR)
6905 {
6906 return too_many_arguments(o,PL_op_desc[type]);
6907 }
79072805
LW
6908 scalar(kid);
6909 break;
6910 case OA_LIST:
6911 if (oa < 16) {
6912 kid = 0;
6913 continue;
6914 }
6915 else
6916 list(kid);
6917 break;
6918 case OA_AVREF:
936edb8b 6919 if ((type == OP_PUSH || type == OP_UNSHIFT)
a2a5de95
NC
6920 && !kid->op_sibling)
6921 Perl_ck_warner(aTHX_ packWARN(WARN_SYNTAX),
6922 "Useless use of %s with no values",
6923 PL_op_desc[type]);
b2ffa427 6924
79072805 6925 if (kid->op_type == OP_CONST &&
62c18ce2
GS
6926 (kid->op_private & OPpCONST_BARE))
6927 {
551405c4 6928 OP * const newop = newAVREF(newGVOP(OP_GV, 0,
f776e3cd 6929 gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVAV) ));
d1d15184 6930 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
a2a5de95
NC
6931 "Array @%"SVf" missing the @ in argument %"IVdf" of %s()",
6932 SVfARG(((SVOP*)kid)->op_sv), (IV)numargs, PL_op_desc[type]);
eb8433b7
NC
6933#ifdef PERL_MAD
6934 op_getmad(kid,newop,'K');
6935#else
79072805 6936 op_free(kid);
eb8433b7 6937#endif
79072805
LW
6938 kid = newop;
6939 kid->op_sibling = sibl;
6940 *tokid = kid;
6941 }
8990e307 6942 else if (kid->op_type != OP_RV2AV && kid->op_type != OP_PADAV)
35cd451c 6943 bad_type(numargs, "array", PL_op_desc[type], kid);
a0d0e21e 6944 mod(kid, type);
79072805
LW
6945 break;
6946 case OA_HVREF:
6947 if (kid->op_type == OP_CONST &&
62c18ce2
GS
6948 (kid->op_private & OPpCONST_BARE))
6949 {
551405c4 6950 OP * const newop = newHVREF(newGVOP(OP_GV, 0,
f776e3cd 6951 gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVHV) ));
d1d15184 6952 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
a2a5de95
NC
6953 "Hash %%%"SVf" missing the %% in argument %"IVdf" of %s()",
6954 SVfARG(((SVOP*)kid)->op_sv), (IV)numargs, PL_op_desc[type]);
eb8433b7
NC
6955#ifdef PERL_MAD
6956 op_getmad(kid,newop,'K');
6957#else
79072805 6958 op_free(kid);
eb8433b7 6959#endif
79072805
LW
6960 kid = newop;
6961 kid->op_sibling = sibl;
6962 *tokid = kid;
6963 }
8990e307 6964 else if (kid->op_type != OP_RV2HV && kid->op_type != OP_PADHV)
35cd451c 6965 bad_type(numargs, "hash", PL_op_desc[type], kid);
a0d0e21e 6966 mod(kid, type);
79072805
LW
6967 break;
6968 case OA_CVREF:
6969 {
551405c4 6970 OP * const newop = newUNOP(OP_NULL, 0, kid);
79072805
LW
6971 kid->op_sibling = 0;
6972 linklist(kid);
6973 newop->op_next = newop;
6974 kid = newop;
6975 kid->op_sibling = sibl;
6976 *tokid = kid;
6977 }
6978 break;
6979 case OA_FILEREF:
c340be78 6980 if (kid->op_type != OP_GV && kid->op_type != OP_RV2GV) {
79072805 6981 if (kid->op_type == OP_CONST &&
62c18ce2
GS
6982 (kid->op_private & OPpCONST_BARE))
6983 {
0bd48802 6984 OP * const newop = newGVOP(OP_GV, 0,
f776e3cd 6985 gv_fetchsv(((SVOP*)kid)->op_sv, GV_ADD, SVt_PVIO));
afbdacea 6986 if (!(o->op_private & 1) && /* if not unop */
8a996ce8 6987 kid == cLISTOPo->op_last)
364daeac 6988 cLISTOPo->op_last = newop;
eb8433b7
NC
6989#ifdef PERL_MAD
6990 op_getmad(kid,newop,'K');
6991#else
79072805 6992 op_free(kid);
eb8433b7 6993#endif
79072805
LW
6994 kid = newop;
6995 }
1ea32a52
GS
6996 else if (kid->op_type == OP_READLINE) {
6997 /* neophyte patrol: open(<FH>), close(<FH>) etc. */
53e06cf0 6998 bad_type(numargs, "HANDLE", OP_DESC(o), kid);
1ea32a52 6999 }
79072805 7000 else {
35cd451c 7001 I32 flags = OPf_SPECIAL;
a6c40364 7002 I32 priv = 0;
2c8ac474
GS
7003 PADOFFSET targ = 0;
7004
35cd451c 7005 /* is this op a FH constructor? */
853846ea 7006 if (is_handle_constructor(o,numargs)) {
bd61b366 7007 const char *name = NULL;
dd2155a4 7008 STRLEN len = 0;
2c8ac474
GS
7009
7010 flags = 0;
7011 /* Set a flag to tell rv2gv to vivify
853846ea
NIS
7012 * need to "prove" flag does not mean something
7013 * else already - NI-S 1999/05/07
2c8ac474
GS
7014 */
7015 priv = OPpDEREF;
7016 if (kid->op_type == OP_PADSV) {
f8503592
NC
7017 SV *const namesv
7018 = PAD_COMPNAME_SV(kid->op_targ);
7019 name = SvPV_const(namesv, len);
2c8ac474
GS
7020 }
7021 else if (kid->op_type == OP_RV2SV
7022 && kUNOP->op_first->op_type == OP_GV)
7023 {
0bd48802 7024 GV * const gv = cGVOPx_gv(kUNOP->op_first);
2c8ac474
GS
7025 name = GvNAME(gv);
7026 len = GvNAMELEN(gv);
7027 }
afd1915d
GS
7028 else if (kid->op_type == OP_AELEM
7029 || kid->op_type == OP_HELEM)
7030 {
735fec84 7031 OP *firstop;
551405c4 7032 OP *op = ((BINOP*)kid)->op_first;
a4fc7abc 7033 name = NULL;
551405c4 7034 if (op) {
a0714e2c 7035 SV *tmpstr = NULL;
551405c4 7036 const char * const a =
666ea192
JH
7037 kid->op_type == OP_AELEM ?
7038 "[]" : "{}";
0c4b0a3f
JH
7039 if (((op->op_type == OP_RV2AV) ||
7040 (op->op_type == OP_RV2HV)) &&
735fec84
RGS
7041 (firstop = ((UNOP*)op)->op_first) &&
7042 (firstop->op_type == OP_GV)) {
0c4b0a3f 7043 /* packagevar $a[] or $h{} */
735fec84 7044 GV * const gv = cGVOPx_gv(firstop);
0c4b0a3f
JH
7045 if (gv)
7046 tmpstr =
7047 Perl_newSVpvf(aTHX_
7048 "%s%c...%c",
7049 GvNAME(gv),
7050 a[0], a[1]);
7051 }
7052 else if (op->op_type == OP_PADAV
7053 || op->op_type == OP_PADHV) {
7054 /* lexicalvar $a[] or $h{} */
551405c4 7055 const char * const padname =
0c4b0a3f
JH
7056 PAD_COMPNAME_PV(op->op_targ);
7057 if (padname)
7058 tmpstr =
7059 Perl_newSVpvf(aTHX_
7060 "%s%c...%c",
7061 padname + 1,
7062 a[0], a[1]);
0c4b0a3f
JH
7063 }
7064 if (tmpstr) {
93524f2b 7065 name = SvPV_const(tmpstr, len);
0c4b0a3f
JH
7066 sv_2mortal(tmpstr);
7067 }
7068 }
7069 if (!name) {
7070 name = "__ANONIO__";
7071 len = 10;
7072 }
7073 mod(kid, type);
afd1915d 7074 }
2c8ac474
GS
7075 if (name) {
7076 SV *namesv;
7077 targ = pad_alloc(OP_RV2GV, SVs_PADTMP);
dd2155a4 7078 namesv = PAD_SVl(targ);
862a34c6 7079 SvUPGRADE(namesv, SVt_PV);
2c8ac474 7080 if (*name != '$')
76f68e9b 7081 sv_setpvs(namesv, "$");
2c8ac474
GS
7082 sv_catpvn(namesv, name, len);
7083 }
853846ea 7084 }
79072805 7085 kid->op_sibling = 0;
35cd451c 7086 kid = newUNOP(OP_RV2GV, flags, scalar(kid));
2c8ac474
GS
7087 kid->op_targ = targ;
7088 kid->op_private |= priv;
79072805
LW
7089 }
7090 kid->op_sibling = sibl;
7091 *tokid = kid;
7092 }
7093 scalar(kid);
7094 break;
7095 case OA_SCALARREF:
a0d0e21e 7096 mod(scalar(kid), type);
79072805
LW
7097 break;
7098 }
7099 oa >>= 4;
7100 tokid = &kid->op_sibling;
7101 kid = kid->op_sibling;
7102 }
eb8433b7
NC
7103#ifdef PERL_MAD
7104 if (kid && kid->op_type != OP_STUB)
7105 return too_many_arguments(o,OP_DESC(o));
7106 o->op_private |= numargs;
7107#else
7108 /* FIXME - should the numargs move as for the PERL_MAD case? */
11343788 7109 o->op_private |= numargs;
79072805 7110 if (kid)
53e06cf0 7111 return too_many_arguments(o,OP_DESC(o));
eb8433b7 7112#endif
11343788 7113 listkids(o);
79072805 7114 }
22c35a8c 7115 else if (PL_opargs[type] & OA_DEFGV) {
c56915e3 7116#ifdef PERL_MAD
c7fe699d 7117 OP *newop = newUNOP(type, 0, newDEFSVOP());
c56915e3 7118 op_getmad(o,newop,'O');
c7fe699d 7119 return newop;
c56915e3 7120#else
c7fe699d 7121 /* Ordering of these two is important to keep f_map.t passing. */
11343788 7122 op_free(o);
c7fe699d 7123 return newUNOP(type, 0, newDEFSVOP());
c56915e3 7124#endif
a0d0e21e
LW
7125 }
7126
79072805
LW
7127 if (oa) {
7128 while (oa & OA_OPTIONAL)
7129 oa >>= 4;
7130 if (oa && oa != OA_LIST)
53e06cf0 7131 return too_few_arguments(o,OP_DESC(o));
79072805 7132 }
11343788 7133 return o;
79072805
LW
7134}
7135
7136OP *
cea2e8a9 7137Perl_ck_glob(pTHX_ OP *o)
79072805 7138{
27da23d5 7139 dVAR;
fb73857a 7140 GV *gv;
7141
7918f24d
NC
7142 PERL_ARGS_ASSERT_CK_GLOB;
7143
649da076 7144 o = ck_fun(o);
1f2bfc8a 7145 if ((o->op_flags & OPf_KIDS) && !cLISTOPo->op_first->op_sibling)
54b9620d 7146 append_elem(OP_GLOB, o, newDEFSVOP());
fb73857a 7147
fafc274c 7148 if (!((gv = gv_fetchpvs("glob", GV_NOTQUAL, SVt_PVCV))
b9f751c0
GS
7149 && GvCVu(gv) && GvIMPORTED_CV(gv)))
7150 {
5c1737d1 7151 gv = gv_fetchpvs("CORE::GLOBAL::glob", 0, SVt_PVCV);
b9f751c0 7152 }
b1cb66bf 7153
52bb0670 7154#if !defined(PERL_EXTERNAL_GLOB)
72b16652 7155 /* XXX this can be tightened up and made more failsafe. */
f444d496 7156 if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
7d3fb230 7157 GV *glob_gv;
72b16652 7158 ENTER;
00ca71c1 7159 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
a0714e2c 7160 newSVpvs("File::Glob"), NULL, NULL, NULL);
5c1737d1
NC
7161 gv = gv_fetchpvs("CORE::GLOBAL::glob", 0, SVt_PVCV);
7162 glob_gv = gv_fetchpvs("File::Glob::csh_glob", 0, SVt_PVCV);
7d3fb230 7163 GvCV(gv) = GvCV(glob_gv);
ad64d0ec 7164 SvREFCNT_inc_void(MUTABLE_SV(GvCV(gv)));
7d3fb230 7165 GvIMPORTED_CV_on(gv);
72b16652
GS
7166 LEAVE;
7167 }
52bb0670 7168#endif /* PERL_EXTERNAL_GLOB */
72b16652 7169
b9f751c0 7170 if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
5196be3e 7171 append_elem(OP_GLOB, o,
80252599 7172 newSVOP(OP_CONST, 0, newSViv(PL_glob_index++)));
1f2bfc8a 7173 o->op_type = OP_LIST;
22c35a8c 7174 o->op_ppaddr = PL_ppaddr[OP_LIST];
1f2bfc8a 7175 cLISTOPo->op_first->op_type = OP_PUSHMARK;
22c35a8c 7176 cLISTOPo->op_first->op_ppaddr = PL_ppaddr[OP_PUSHMARK];
ad33f57d 7177 cLISTOPo->op_first->op_targ = 0;
1f2bfc8a 7178 o = newUNOP(OP_ENTERSUB, OPf_STACKED,
aeea060c 7179 append_elem(OP_LIST, o,
1f2bfc8a
MB
7180 scalar(newUNOP(OP_RV2CV, 0,
7181 newGVOP(OP_GV, 0, gv)))));
d58bf5aa
MB
7182 o = newUNOP(OP_NULL, 0, ck_subr(o));
7183 o->op_targ = OP_GLOB; /* hint at what it used to be */
7184 return o;
b1cb66bf 7185 }
7186 gv = newGVgen("main");
a0d0e21e 7187 gv_IOadd(gv);
11343788
MB
7188 append_elem(OP_GLOB, o, newGVOP(OP_GV, 0, gv));
7189 scalarkids(o);
649da076 7190 return o;
79072805
LW
7191}
7192
7193OP *
cea2e8a9 7194Perl_ck_grep(pTHX_ OP *o)
79072805 7195{
27da23d5 7196 dVAR;
03ca120d 7197 LOGOP *gwop = NULL;
79072805 7198 OP *kid;
6867be6d 7199 const OPCODE type = o->op_type == OP_GREPSTART ? OP_GREPWHILE : OP_MAPWHILE;
9f7d9405 7200 PADOFFSET offset;
79072805 7201
7918f24d
NC
7202 PERL_ARGS_ASSERT_CK_GREP;
7203
22c35a8c 7204 o->op_ppaddr = PL_ppaddr[OP_GREPSTART];
13765c85 7205 /* don't allocate gwop here, as we may leak it if PL_parser->error_count > 0 */
aeea060c 7206
11343788 7207 if (o->op_flags & OPf_STACKED) {
a0d0e21e 7208 OP* k;
11343788
MB
7209 o = ck_sort(o);
7210 kid = cLISTOPo->op_first->op_sibling;
d09ad856
BS
7211 if (!cUNOPx(kid)->op_next)
7212 Perl_croak(aTHX_ "panic: ck_grep");
e3c9a8b9 7213 for (k = cUNOPx(kid)->op_first; k; k = k->op_next) {
a0d0e21e
LW
7214 kid = k;
7215 }
03ca120d 7216 NewOp(1101, gwop, 1, LOGOP);
a0d0e21e 7217 kid->op_next = (OP*)gwop;
11343788 7218 o->op_flags &= ~OPf_STACKED;
93a17b20 7219 }
11343788 7220 kid = cLISTOPo->op_first->op_sibling;
a0d0e21e
LW
7221 if (type == OP_MAPWHILE)
7222 list(kid);
7223 else
7224 scalar(kid);
11343788 7225 o = ck_fun(o);
13765c85 7226 if (PL_parser && PL_parser->error_count)
11343788 7227 return o;
aeea060c 7228 kid = cLISTOPo->op_first->op_sibling;
79072805 7229 if (kid->op_type != OP_NULL)
cea2e8a9 7230 Perl_croak(aTHX_ "panic: ck_grep");
79072805
LW
7231 kid = kUNOP->op_first;
7232
03ca120d
MHM
7233 if (!gwop)
7234 NewOp(1101, gwop, 1, LOGOP);
a0d0e21e 7235 gwop->op_type = type;
22c35a8c 7236 gwop->op_ppaddr = PL_ppaddr[type];
11343788 7237 gwop->op_first = listkids(o);
79072805 7238 gwop->op_flags |= OPf_KIDS;
79072805 7239 gwop->op_other = LINKLIST(kid);
79072805 7240 kid->op_next = (OP*)gwop;
f8f98e0a 7241 offset = Perl_pad_findmy(aTHX_ STR_WITH_LEN("$_"), 0);
00b1698f 7242 if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS_isOUR(offset)) {
59f00321
RGS
7243 o->op_private = gwop->op_private = 0;
7244 gwop->op_targ = pad_alloc(type, SVs_PADTMP);
7245 }
7246 else {
7247 o->op_private = gwop->op_private = OPpGREP_LEX;
7248 gwop->op_targ = o->op_targ = offset;
7249 }
79072805 7250
11343788 7251 kid = cLISTOPo->op_first->op_sibling;
a0d0e21e 7252 if (!kid || !kid->op_sibling)
53e06cf0 7253 return too_few_arguments(o,OP_DESC(o));
a0d0e21e
LW
7254 for (kid = kid->op_sibling; kid; kid = kid->op_sibling)
7255 mod(kid, OP_GREPSTART);
7256
79072805
LW
7257 return (OP*)gwop;
7258}
7259
7260OP *
cea2e8a9 7261Perl_ck_index(pTHX_ OP *o)
79072805 7262{
7918f24d
NC
7263 PERL_ARGS_ASSERT_CK_INDEX;
7264
11343788
MB
7265 if (o->op_flags & OPf_KIDS) {
7266 OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
0b71040e
LW
7267 if (kid)
7268 kid = kid->op_sibling; /* get past "big" */
79072805 7269 if (kid && kid->op_type == OP_CONST)
2779dcf1 7270 fbm_compile(((SVOP*)kid)->op_sv, 0);
79072805 7271 }
11343788 7272 return ck_fun(o);
79072805
LW
7273}
7274
7275OP *
cea2e8a9 7276Perl_ck_lfun(pTHX_ OP *o)
79072805 7277{
6867be6d 7278 const OPCODE type = o->op_type;
7918f24d
NC
7279
7280 PERL_ARGS_ASSERT_CK_LFUN;
7281
5dc0d613 7282 return modkids(ck_fun(o), type);
79072805
LW
7283}
7284
7285OP *
cea2e8a9 7286Perl_ck_defined(pTHX_ OP *o) /* 19990527 MJD */
69794302 7287{
7918f24d
NC
7288 PERL_ARGS_ASSERT_CK_DEFINED;
7289
a2a5de95 7290 if ((o->op_flags & OPf_KIDS)) {
d0334bed
GS
7291 switch (cUNOPo->op_first->op_type) {
7292 case OP_RV2AV:
a8739d98
JH
7293 /* This is needed for
7294 if (defined %stash::)
7295 to work. Do not break Tk.
7296 */
1c846c1f 7297 break; /* Globals via GV can be undef */
d0334bed
GS
7298 case OP_PADAV:
7299 case OP_AASSIGN: /* Is this a good idea? */
d1d15184 7300 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
a2a5de95 7301 "defined(@array) is deprecated");
d1d15184 7302 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
a2a5de95 7303 "\t(Maybe you should just omit the defined()?)\n");
69794302 7304 break;
d0334bed
GS
7305 case OP_RV2HV:
7306 case OP_PADHV:
d1d15184 7307 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
a2a5de95 7308 "defined(%%hash) is deprecated");
d1d15184 7309 Perl_ck_warner_d(aTHX_ packWARN(WARN_DEPRECATED),
a2a5de95 7310 "\t(Maybe you should just omit the defined()?)\n");
d0334bed
GS
7311 break;
7312 default:
7313 /* no warning */
7314 break;
7315 }
69794302
MJD
7316 }
7317 return ck_rfun(o);
7318}
7319
7320OP *
e4b7ebf3
RGS
7321Perl_ck_readline(pTHX_ OP *o)
7322{
7918f24d
NC
7323 PERL_ARGS_ASSERT_CK_READLINE;
7324
e4b7ebf3
RGS
7325 if (!(o->op_flags & OPf_KIDS)) {
7326 OP * const newop
7327 = newUNOP(OP_READLINE, 0, newGVOP(OP_GV, 0, PL_argvgv));
7328#ifdef PERL_MAD
7329 op_getmad(o,newop,'O');
7330#else
7331 op_free(o);
7332#endif
7333 return newop;
7334 }
7335 return o;
7336}
7337
7338OP *
cea2e8a9 7339Perl_ck_rfun(pTHX_ OP *o)
8990e307 7340{
6867be6d 7341 const OPCODE type = o->op_type;
7918f24d
NC
7342
7343 PERL_ARGS_ASSERT_CK_RFUN;
7344
5dc0d613 7345 return refkids(ck_fun(o), type);
8990e307
LW
7346}
7347
7348OP *
cea2e8a9 7349Perl_ck_listiob(pTHX_ OP *o)
79072805
LW
7350{
7351 register OP *kid;
aeea060c 7352
7918f24d
NC
7353 PERL_ARGS_ASSERT_CK_LISTIOB;
7354
11343788 7355 kid = cLISTOPo->op_first;
79072805 7356 if (!kid) {
11343788
MB
7357 o = force_list(o);
7358 kid = cLISTOPo->op_first;
79072805
LW
7359 }
7360 if (kid->op_type == OP_PUSHMARK)
7361 kid = kid->op_sibling;
11343788 7362 if (kid && o->op_flags & OPf_STACKED)
79072805
LW
7363 kid = kid->op_sibling;
7364 else if (kid && !kid->op_sibling) { /* print HANDLE; */
7365 if (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE) {
11343788 7366 o->op_flags |= OPf_STACKED; /* make it a filehandle */
748a9306 7367 kid = newUNOP(OP_RV2GV, OPf_REF, scalar(kid));
11343788
MB
7368 cLISTOPo->op_first->op_sibling = kid;
7369 cLISTOPo->op_last = kid;
79072805
LW
7370 kid = kid->op_sibling;
7371 }
7372 }
b2ffa427 7373
79072805 7374 if (!kid)
54b9620d 7375 append_elem(o->op_type, o, newDEFSVOP());
79072805 7376
2de3dbcc 7377 return listkids(o);
bbce6d69 7378}
7379
7380OP *
0d863452
RH
7381Perl_ck_smartmatch(pTHX_ OP *o)
7382{
97aff369 7383 dVAR;
0d863452
RH
7384 if (0 == (o->op_flags & OPf_SPECIAL)) {
7385 OP *first = cBINOPo->op_first;
7386 OP *second = first->op_sibling;
7387
7388 /* Implicitly take a reference to an array or hash */
5f66b61c 7389 first->op_sibling = NULL;
0d863452
RH
7390 first = cBINOPo->op_first = ref_array_or_hash(first);
7391 second = first->op_sibling = ref_array_or_hash(second);
7392
7393 /* Implicitly take a reference to a regular expression */
7394 if (first->op_type == OP_MATCH) {
7395 first->op_type = OP_QR;
7396 first->op_ppaddr = PL_ppaddr[OP_QR];
7397 }
7398 if (second->op_type == OP_MATCH) {
7399 second->op_type = OP_QR;
7400 second->op_ppaddr = PL_ppaddr[OP_QR];
7401 }
7402 }
7403
7404 return o;
7405}
7406
7407
7408OP *
b162f9ea
IZ
7409Perl_ck_sassign(pTHX_ OP *o)
7410{
3088bf26 7411 dVAR;
1496a290 7412 OP * const kid = cLISTOPo->op_first;
7918f24d
NC
7413
7414 PERL_ARGS_ASSERT_CK_SASSIGN;
7415
b162f9ea
IZ
7416 /* has a disposable target? */
7417 if ((PL_opargs[kid->op_type] & OA_TARGLEX)
6b66af17
GS
7418 && !(kid->op_flags & OPf_STACKED)
7419 /* Cannot steal the second time! */
1b438339
GG
7420 && !(kid->op_private & OPpTARGET_MY)
7421 /* Keep the full thing for madskills */
7422 && !PL_madskills
7423 )
b162f9ea 7424 {
551405c4 7425 OP * const kkid = kid->op_sibling;
b162f9ea
IZ
7426
7427 /* Can just relocate the target. */
2c2d71f5
JH
7428 if (kkid && kkid->op_type == OP_PADSV
7429 && !(kkid->op_private & OPpLVAL_INTRO))
7430 {
b162f9ea 7431 kid->op_targ = kkid->op_targ;
743e66e6 7432 kkid->op_targ = 0;
b162f9ea
IZ
7433 /* Now we do not need PADSV and SASSIGN. */
7434 kid->op_sibling = o->op_sibling; /* NULL */
7435 cLISTOPo->op_first = NULL;
7436 op_free(o);
7437 op_free(kkid);
7438 kid->op_private |= OPpTARGET_MY; /* Used for context settings */
7439 return kid;
7440 }
7441 }
c5917253
NC
7442 if (kid->op_sibling) {
7443 OP *kkid = kid->op_sibling;
7444 if (kkid->op_type == OP_PADSV
7445 && (kkid->op_private & OPpLVAL_INTRO)
7446 && SvPAD_STATE(*av_fetch(PL_comppad_name, kkid->op_targ, FALSE))) {
7447 const PADOFFSET target = kkid->op_targ;
7448 OP *const other = newOP(OP_PADSV,
7449 kkid->op_flags
7450 | ((kkid->op_private & ~OPpLVAL_INTRO) << 8));
7451 OP *const first = newOP(OP_NULL, 0);
7452 OP *const nullop = newCONDOP(0, first, o, other);
7453 OP *const condop = first->op_next;
7454 /* hijacking PADSTALE for uninitialized state variables */
7455 SvPADSTALE_on(PAD_SVl(target));
7456
7457 condop->op_type = OP_ONCE;
7458 condop->op_ppaddr = PL_ppaddr[OP_ONCE];
7459 condop->op_targ = target;
7460 other->op_targ = target;
7461
95562366
NC
7462 /* Because we change the type of the op here, we will skip the
7463 assinment binop->op_last = binop->op_first->op_sibling; at the
7464 end of Perl_newBINOP(). So need to do it here. */
7465 cBINOPo->op_last = cBINOPo->op_first->op_sibling;
7466
c5917253
NC
7467 return nullop;
7468 }
7469 }
b162f9ea
IZ
7470 return o;
7471}
7472
7473OP *
cea2e8a9 7474Perl_ck_match(pTHX_ OP *o)
79072805 7475{
97aff369 7476 dVAR;
7918f24d
NC
7477
7478 PERL_ARGS_ASSERT_CK_MATCH;
7479
0d863452 7480 if (o->op_type != OP_QR && PL_compcv) {
f8f98e0a 7481 const PADOFFSET offset = Perl_pad_findmy(aTHX_ STR_WITH_LEN("$_"), 0);
00b1698f 7482 if (offset != NOT_IN_PAD && !(PAD_COMPNAME_FLAGS_isOUR(offset))) {
59f00321
RGS
7483 o->op_targ = offset;
7484 o->op_private |= OPpTARGET_MY;
7485 }
7486 }
7487 if (o->op_type == OP_MATCH || o->op_type == OP_QR)
7488 o->op_private |= OPpRUNTIME;
11343788 7489 return o;
79072805
LW
7490}
7491
7492OP *
f5d5a27c
CS
7493Perl_ck_method(pTHX_ OP *o)
7494{
551405c4 7495 OP * const kid = cUNOPo->op_first;
7918f24d
NC
7496
7497 PERL_ARGS_ASSERT_CK_METHOD;
7498
f5d5a27c
CS
7499 if (kid->op_type == OP_CONST) {
7500 SV* sv = kSVOP->op_sv;
a4fc7abc
AL
7501 const char * const method = SvPVX_const(sv);
7502 if (!(strchr(method, ':') || strchr(method, '\''))) {
f5d5a27c 7503 OP *cmop;
1c846c1f 7504 if (!SvREADONLY(sv) || !SvFAKE(sv)) {
a4fc7abc 7505 sv = newSVpvn_share(method, SvCUR(sv), 0);
1c846c1f
NIS
7506 }
7507 else {
a0714e2c 7508 kSVOP->op_sv = NULL;
1c846c1f 7509 }
f5d5a27c 7510 cmop = newSVOP(OP_METHOD_NAMED, 0, sv);
eb8433b7
NC
7511#ifdef PERL_MAD
7512 op_getmad(o,cmop,'O');
7513#else
f5d5a27c 7514 op_free(o);
eb8433b7 7515#endif
f5d5a27c
CS
7516 return cmop;
7517 }
7518 }
7519 return o;
7520}
7521
7522OP *
cea2e8a9 7523Perl_ck_null(pTHX_ OP *o)
79072805 7524{
7918f24d 7525 PERL_ARGS_ASSERT_CK_NULL;
96a5add6 7526 PERL_UNUSED_CONTEXT;
11343788 7527 return o;
79072805
LW
7528}
7529
7530OP *
16fe6d59
GS
7531Perl_ck_open(pTHX_ OP *o)
7532{
97aff369 7533 dVAR;
551405c4 7534 HV * const table = GvHV(PL_hintgv);
7918f24d
NC
7535
7536 PERL_ARGS_ASSERT_CK_OPEN;
7537
16fe6d59 7538 if (table) {
a4fc7abc 7539 SV **svp = hv_fetchs(table, "open_IN", FALSE);
16fe6d59 7540 if (svp && *svp) {
a79b25b7
VP
7541 STRLEN len = 0;
7542 const char *d = SvPV_const(*svp, len);
7543 const I32 mode = mode_from_discipline(d, len);
16fe6d59
GS
7544 if (mode & O_BINARY)
7545 o->op_private |= OPpOPEN_IN_RAW;
7546 else if (mode & O_TEXT)
7547 o->op_private |= OPpOPEN_IN_CRLF;
7548 }
7549
a4fc7abc 7550 svp = hv_fetchs(table, "open_OUT", FALSE);
16fe6d59 7551 if (svp && *svp) {
a79b25b7
VP
7552 STRLEN len = 0;
7553 const char *d = SvPV_const(*svp, len);
7554 const I32 mode = mode_from_discipline(d, len);
16fe6d59
GS
7555 if (mode & O_BINARY)
7556 o->op_private |= OPpOPEN_OUT_RAW;
7557 else if (mode & O_TEXT)
7558 o->op_private |= OPpOPEN_OUT_CRLF;
7559 }
7560 }
8d7403e6
RGS
7561 if (o->op_type == OP_BACKTICK) {
7562 if (!(o->op_flags & OPf_KIDS)) {
e4b7ebf3
RGS
7563 OP * const newop = newUNOP(OP_BACKTICK, 0, newDEFSVOP());
7564#ifdef PERL_MAD
7565 op_getmad(o,newop,'O');
7566#else
8d7403e6 7567 op_free(o);
e4b7ebf3
RGS
7568#endif
7569 return newop;
8d7403e6 7570 }
16fe6d59 7571 return o;
8d7403e6 7572 }
3b82e551
JH
7573 {
7574 /* In case of three-arg dup open remove strictness
7575 * from the last arg if it is a bareword. */
551405c4
AL
7576 OP * const first = cLISTOPx(o)->op_first; /* The pushmark. */
7577 OP * const last = cLISTOPx(o)->op_last; /* The bareword. */
3b82e551 7578 OP *oa;
b15aece3 7579 const char *mode;
3b82e551
JH
7580
7581 if ((last->op_type == OP_CONST) && /* The bareword. */
7582 (last->op_private & OPpCONST_BARE) &&
7583 (last->op_private & OPpCONST_STRICT) &&
7584 (oa = first->op_sibling) && /* The fh. */
7585 (oa = oa->op_sibling) && /* The mode. */
ea1d064a 7586 (oa->op_type == OP_CONST) &&
3b82e551 7587 SvPOK(((SVOP*)oa)->op_sv) &&
b15aece3 7588 (mode = SvPVX_const(((SVOP*)oa)->op_sv)) &&
3b82e551
JH
7589 mode[0] == '>' && mode[1] == '&' && /* A dup open. */
7590 (last == oa->op_sibling)) /* The bareword. */
7591 last->op_private &= ~OPpCONST_STRICT;
7592 }
16fe6d59
GS
7593 return ck_fun(o);
7594}
7595
7596OP *
cea2e8a9 7597Perl_ck_repeat(pTHX_ OP *o)
79072805 7598{
7918f24d
NC
7599 PERL_ARGS_ASSERT_CK_REPEAT;
7600
11343788
MB
7601 if (cBINOPo->op_first->op_flags & OPf_PARENS) {
7602 o->op_private |= OPpREPEAT_DOLIST;
7603 cBINOPo->op_first = force_list(cBINOPo->op_first);
79072805
LW
7604 }
7605 else
11343788
MB
7606 scalar(o);
7607 return o;
79072805
LW
7608}
7609
7610OP *
cea2e8a9 7611Perl_ck_require(pTHX_ OP *o)
8990e307 7612{
97aff369 7613 dVAR;
a0714e2c 7614 GV* gv = NULL;
ec4ab249 7615
7918f24d
NC
7616 PERL_ARGS_ASSERT_CK_REQUIRE;
7617
11343788 7618 if (o->op_flags & OPf_KIDS) { /* Shall we supply missing .pm? */
551405c4 7619 SVOP * const kid = (SVOP*)cUNOPo->op_first;
8990e307
LW
7620
7621 if (kid->op_type == OP_CONST && (kid->op_private & OPpCONST_BARE)) {
551405c4 7622 SV * const sv = kid->op_sv;
5c144d81 7623 U32 was_readonly = SvREADONLY(sv);
8990e307 7624 char *s;
cfff9797
NC
7625 STRLEN len;
7626 const char *end;
5c144d81
NC
7627
7628 if (was_readonly) {
7629 if (SvFAKE(sv)) {
7630 sv_force_normal_flags(sv, 0);
7631 assert(!SvREADONLY(sv));
7632 was_readonly = 0;
7633 } else {
7634 SvREADONLY_off(sv);
7635 }
7636 }
7637
cfff9797
NC
7638 s = SvPVX(sv);
7639 len = SvCUR(sv);
7640 end = s + len;
7641 for (; s < end; s++) {
a0d0e21e
LW
7642 if (*s == ':' && s[1] == ':') {
7643 *s = '/';
5c6b2528 7644 Move(s+2, s+1, end - s - 1, char);
cfff9797 7645 --end;
a0d0e21e 7646 }
8990e307 7647 }
cfff9797 7648 SvEND_set(sv, end);
396482e1 7649 sv_catpvs(sv, ".pm");
5c144d81 7650 SvFLAGS(sv) |= was_readonly;
8990e307
LW
7651 }
7652 }
ec4ab249 7653
a72a1c8b
RGS
7654 if (!(o->op_flags & OPf_SPECIAL)) { /* Wasn't written as CORE::require */
7655 /* handle override, if any */
fafc274c 7656 gv = gv_fetchpvs("require", GV_NOTQUAL, SVt_PVCV);
d6a985f2 7657 if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv))) {
a4fc7abc 7658 GV * const * const gvp = (GV**)hv_fetchs(PL_globalstash, "require", FALSE);
a0714e2c 7659 gv = gvp ? *gvp : NULL;
d6a985f2 7660 }
a72a1c8b 7661 }
ec4ab249 7662
b9f751c0 7663 if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
551405c4 7664 OP * const kid = cUNOPo->op_first;
f11453cb
NC
7665 OP * newop;
7666
ec4ab249 7667 cUNOPo->op_first = 0;
f11453cb 7668#ifndef PERL_MAD
ec4ab249 7669 op_free(o);
eb8433b7 7670#endif
f11453cb
NC
7671 newop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
7672 append_elem(OP_LIST, kid,
7673 scalar(newUNOP(OP_RV2CV, 0,
7674 newGVOP(OP_GV, 0,
7675 gv))))));
7676 op_getmad(o,newop,'O');
eb8433b7 7677 return newop;
ec4ab249
GA
7678 }
7679
11343788 7680 return ck_fun(o);
8990e307
LW
7681}
7682
78f9721b
SM
7683OP *
7684Perl_ck_return(pTHX_ OP *o)
7685{
97aff369 7686 dVAR;
e91684bf 7687 OP *kid;
7918f24d
NC
7688
7689 PERL_ARGS_ASSERT_CK_RETURN;
7690
e91684bf 7691 kid = cLISTOPo->op_first->op_sibling;
78f9721b 7692 if (CvLVALUE(PL_compcv)) {
e91684bf 7693 for (; kid; kid = kid->op_sibling)
78f9721b 7694 mod(kid, OP_LEAVESUBLV);
e91684bf
VP
7695 } else {
7696 for (; kid; kid = kid->op_sibling)
7697 if ((kid->op_type == OP_NULL)
1c8a4223 7698 && ((kid->op_flags & (OPf_SPECIAL|OPf_KIDS)) == (OPf_SPECIAL|OPf_KIDS))) {
e91684bf 7699 /* This is a do block */
1c8a4223
VP
7700 OP *op = kUNOP->op_first;
7701 if (op->op_type == OP_LEAVE && op->op_flags & OPf_KIDS) {
7702 op = cUNOPx(op)->op_first;
7703 assert(op->op_type == OP_ENTER && !(op->op_flags & OPf_SPECIAL));
7704 /* Force the use of the caller's context */
7705 op->op_flags |= OPf_SPECIAL;
7706 }
e91684bf 7707 }
78f9721b 7708 }
e91684bf 7709
78f9721b
SM
7710 return o;
7711}
7712
79072805 7713OP *
cea2e8a9 7714Perl_ck_select(pTHX_ OP *o)
79072805 7715{
27da23d5 7716 dVAR;
c07a80fd 7717 OP* kid;
7918f24d
NC
7718
7719 PERL_ARGS_ASSERT_CK_SELECT;
7720
11343788
MB
7721 if (o->op_flags & OPf_KIDS) {
7722 kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
2304df62 7723 if (kid && kid->op_sibling) {
11343788 7724 o->op_type = OP_SSELECT;
22c35a8c 7725 o->op_ppaddr = PL_ppaddr[OP_SSELECT];
11343788
MB
7726 o = ck_fun(o);
7727 return fold_constants(o);
79072805
LW
7728 }
7729 }
11343788
MB
7730 o = ck_fun(o);
7731 kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
c07a80fd 7732 if (kid && kid->op_type == OP_RV2GV)
7733 kid->op_private &= ~HINT_STRICT_REFS;
11343788 7734 return o;
79072805
LW
7735}
7736
7737OP *
cea2e8a9 7738Perl_ck_shift(pTHX_ OP *o)
79072805 7739{
97aff369 7740 dVAR;
6867be6d 7741 const I32 type = o->op_type;
79072805 7742
7918f24d
NC
7743 PERL_ARGS_ASSERT_CK_SHIFT;
7744
11343788 7745 if (!(o->op_flags & OPf_KIDS)) {
821005df 7746 OP *argop = newUNOP(OP_RV2AV, 0,
8fde6460 7747 scalar(newGVOP(OP_GV, 0, CvUNIQUE(PL_compcv) ? PL_argvgv : PL_defgv)));
eb8433b7 7748#ifdef PERL_MAD
821005df 7749 OP * const oldo = o;
eb8433b7
NC
7750 o = newUNOP(type, 0, scalar(argop));
7751 op_getmad(oldo,o,'O');
7752 return o;
7753#else
821005df 7754 op_free(o);
6d4ff0d2 7755 return newUNOP(type, 0, scalar(argop));
eb8433b7 7756#endif
79072805 7757 }
11343788 7758 return scalar(modkids(ck_fun(o), type));
79072805
LW
7759}
7760
7761OP *
cea2e8a9 7762Perl_ck_sort(pTHX_ OP *o)
79072805 7763{
97aff369 7764 dVAR;
8e3f9bdf 7765 OP *firstkid;
bbce6d69 7766
7918f24d
NC
7767 PERL_ARGS_ASSERT_CK_SORT;
7768
1496a290 7769 if (o->op_type == OP_SORT && (PL_hints & HINT_LOCALIZE_HH) != 0) {
a4fc7abc 7770 HV * const hinthv = GvHV(PL_hintgv);
7b9ef140 7771 if (hinthv) {
a4fc7abc 7772 SV ** const svp = hv_fetchs(hinthv, "sort", FALSE);
7b9ef140 7773 if (svp) {
a4fc7abc 7774 const I32 sorthints = (I32)SvIV(*svp);
7b9ef140
RH
7775 if ((sorthints & HINT_SORT_QUICKSORT) != 0)
7776 o->op_private |= OPpSORT_QSORT;
7777 if ((sorthints & HINT_SORT_STABLE) != 0)
7778 o->op_private |= OPpSORT_STABLE;
7779 }
7780 }
7781 }
7782
9ea6e965 7783 if (o->op_type == OP_SORT && o->op_flags & OPf_STACKED)
51a19bc0 7784 simplify_sort(o);
8e3f9bdf
GS
7785 firstkid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
7786 if (o->op_flags & OPf_STACKED) { /* may have been cleared */
9c5ffd7c 7787 OP *k = NULL;
8e3f9bdf 7788 OP *kid = cUNOPx(firstkid)->op_first; /* get past null */
79072805 7789
463ee0b2 7790 if (kid->op_type == OP_SCOPE || kid->op_type == OP_LEAVE) {
79072805 7791 linklist(kid);
463ee0b2
LW
7792 if (kid->op_type == OP_SCOPE) {
7793 k = kid->op_next;
7794 kid->op_next = 0;
79072805 7795 }
463ee0b2 7796 else if (kid->op_type == OP_LEAVE) {
11343788 7797 if (o->op_type == OP_SORT) {
93c66552 7798 op_null(kid); /* wipe out leave */
748a9306 7799 kid->op_next = kid;
463ee0b2 7800
748a9306
LW
7801 for (k = kLISTOP->op_first->op_next; k; k = k->op_next) {
7802 if (k->op_next == kid)
7803 k->op_next = 0;
71a29c3c
GS
7804 /* don't descend into loops */
7805 else if (k->op_type == OP_ENTERLOOP
7806 || k->op_type == OP_ENTERITER)
7807 {
7808 k = cLOOPx(k)->op_lastop;
7809 }
748a9306 7810 }
463ee0b2 7811 }
748a9306
LW
7812 else
7813 kid->op_next = 0; /* just disconnect the leave */
a0d0e21e 7814 k = kLISTOP->op_first;
463ee0b2 7815 }
a2efc822 7816 CALL_PEEP(k);
a0d0e21e 7817
8e3f9bdf
GS
7818 kid = firstkid;
7819 if (o->op_type == OP_SORT) {
7820 /* provide scalar context for comparison function/block */
7821 kid = scalar(kid);
a0d0e21e 7822 kid->op_next = kid;
8e3f9bdf 7823 }
a0d0e21e
LW
7824 else
7825 kid->op_next = k;
11343788 7826 o->op_flags |= OPf_SPECIAL;
79072805 7827 }
c6e96bcb 7828 else if (kid->op_type == OP_RV2SV || kid->op_type == OP_PADSV)
93c66552 7829 op_null(firstkid);
8e3f9bdf
GS
7830
7831 firstkid = firstkid->op_sibling;
79072805 7832 }
bbce6d69 7833
8e3f9bdf
GS
7834 /* provide list context for arguments */
7835 if (o->op_type == OP_SORT)
7836 list(firstkid);
7837
11343788 7838 return o;
79072805 7839}
bda4119b
GS
7840
7841STATIC void
cea2e8a9 7842S_simplify_sort(pTHX_ OP *o)
9c007264 7843{
97aff369 7844 dVAR;
9c007264
JH
7845 register OP *kid = cLISTOPo->op_first->op_sibling; /* get past pushmark */
7846 OP *k;
eb209983 7847 int descending;
350de78d 7848 GV *gv;
770526c1 7849 const char *gvname;
7918f24d
NC
7850
7851 PERL_ARGS_ASSERT_SIMPLIFY_SORT;
7852
9c007264
JH
7853 if (!(o->op_flags & OPf_STACKED))
7854 return;
fafc274c
NC
7855 GvMULTI_on(gv_fetchpvs("a", GV_ADD|GV_NOTQUAL, SVt_PV));
7856 GvMULTI_on(gv_fetchpvs("b", GV_ADD|GV_NOTQUAL, SVt_PV));
82092f1d 7857 kid = kUNOP->op_first; /* get past null */
9c007264
JH
7858 if (kid->op_type != OP_SCOPE)
7859 return;
7860 kid = kLISTOP->op_last; /* get past scope */
7861 switch(kid->op_type) {
7862 case OP_NCMP:
7863 case OP_I_NCMP:
7864 case OP_SCMP:
7865 break;
7866 default:
7867 return;
7868 }
7869 k = kid; /* remember this node*/
7870 if (kBINOP->op_first->op_type != OP_RV2SV)
7871 return;
7872 kid = kBINOP->op_first; /* get past cmp */
7873 if (kUNOP->op_first->op_type != OP_GV)
7874 return;
7875 kid = kUNOP->op_first; /* get past rv2sv */
638eceb6 7876 gv = kGVOP_gv;
350de78d 7877 if (GvSTASH(gv) != PL_curstash)
9c007264 7878 return;
770526c1
NC
7879 gvname = GvNAME(gv);
7880 if (*gvname == 'a' && gvname[1] == '\0')
eb209983 7881 descending = 0;
770526c1 7882 else if (*gvname == 'b' && gvname[1] == '\0')
eb209983 7883 descending = 1;
9c007264
JH
7884 else
7885 return;
eb209983 7886
9c007264
JH
7887 kid = k; /* back to cmp */
7888 if (kBINOP->op_last->op_type != OP_RV2SV)
7889 return;
7890 kid = kBINOP->op_last; /* down to 2nd arg */
7891 if (kUNOP->op_first->op_type != OP_GV)
7892 return;
7893 kid = kUNOP->op_first; /* get past rv2sv */
638eceb6 7894 gv = kGVOP_gv;
770526c1
NC
7895 if (GvSTASH(gv) != PL_curstash)
7896 return;
7897 gvname = GvNAME(gv);
7898 if ( descending
7899 ? !(*gvname == 'a' && gvname[1] == '\0')
7900 : !(*gvname == 'b' && gvname[1] == '\0'))
9c007264
JH
7901 return;
7902 o->op_flags &= ~(OPf_STACKED | OPf_SPECIAL);
eb209983
NC
7903 if (descending)
7904 o->op_private |= OPpSORT_DESCEND;
9c007264
JH
7905 if (k->op_type == OP_NCMP)
7906 o->op_private |= OPpSORT_NUMERIC;
7907 if (k->op_type == OP_I_NCMP)
7908 o->op_private |= OPpSORT_NUMERIC | OPpSORT_INTEGER;
e507f050
SM
7909 kid = cLISTOPo->op_first->op_sibling;
7910 cLISTOPo->op_first->op_sibling = kid->op_sibling; /* bypass old block */
eb8433b7
NC
7911#ifdef PERL_MAD
7912 op_getmad(kid,o,'S'); /* then delete it */
7913#else
e507f050 7914 op_free(kid); /* then delete it */
eb8433b7 7915#endif
9c007264 7916}
79072805
LW
7917
7918OP *
cea2e8a9 7919Perl_ck_split(pTHX_ OP *o)
79072805 7920{
27da23d5 7921 dVAR;
79072805 7922 register OP *kid;
aeea060c 7923
7918f24d
NC
7924 PERL_ARGS_ASSERT_CK_SPLIT;
7925
11343788
MB
7926 if (o->op_flags & OPf_STACKED)
7927 return no_fh_allowed(o);
79072805 7928
11343788 7929 kid = cLISTOPo->op_first;
8990e307 7930 if (kid->op_type != OP_NULL)
cea2e8a9 7931 Perl_croak(aTHX_ "panic: ck_split");
8990e307 7932 kid = kid->op_sibling;
11343788
MB
7933 op_free(cLISTOPo->op_first);
7934 cLISTOPo->op_first = kid;
85e6fe83 7935 if (!kid) {
396482e1 7936 cLISTOPo->op_first = kid = newSVOP(OP_CONST, 0, newSVpvs(" "));
11343788 7937 cLISTOPo->op_last = kid; /* There was only one element previously */
85e6fe83 7938 }
79072805 7939
de4bf5b3 7940 if (kid->op_type != OP_MATCH || kid->op_flags & OPf_STACKED) {
551405c4 7941 OP * const sibl = kid->op_sibling;
463ee0b2 7942 kid->op_sibling = 0;
131b3ad0 7943 kid = pmruntime( newPMOP(OP_MATCH, OPf_SPECIAL), kid, 0);
11343788
MB
7944 if (cLISTOPo->op_first == cLISTOPo->op_last)
7945 cLISTOPo->op_last = kid;
7946 cLISTOPo->op_first = kid;
79072805
LW
7947 kid->op_sibling = sibl;
7948 }
7949
7950 kid->op_type = OP_PUSHRE;
22c35a8c 7951 kid->op_ppaddr = PL_ppaddr[OP_PUSHRE];
79072805 7952 scalar(kid);
a2a5de95
NC
7953 if (((PMOP *)kid)->op_pmflags & PMf_GLOBAL) {
7954 Perl_ck_warner(aTHX_ packWARN(WARN_REGEXP),
7955 "Use of /g modifier is meaningless in split");
f34840d8 7956 }
79072805
LW
7957
7958 if (!kid->op_sibling)
54b9620d 7959 append_elem(OP_SPLIT, o, newDEFSVOP());
79072805
LW
7960
7961 kid = kid->op_sibling;
7962 scalar(kid);
7963
7964 if (!kid->op_sibling)
11343788 7965 append_elem(OP_SPLIT, o, newSVOP(OP_CONST, 0, newSViv(0)));
ce3e5c45 7966 assert(kid->op_sibling);
79072805
LW
7967
7968 kid = kid->op_sibling;
7969 scalar(kid);
7970
7971 if (kid->op_sibling)
53e06cf0 7972 return too_many_arguments(o,OP_DESC(o));
79072805 7973
11343788 7974 return o;
79072805
LW
7975}
7976
7977OP *
1c846c1f 7978Perl_ck_join(pTHX_ OP *o)
eb6e2d6f 7979{
551405c4 7980 const OP * const kid = cLISTOPo->op_first->op_sibling;
7918f24d
NC
7981
7982 PERL_ARGS_ASSERT_CK_JOIN;
7983
041457d9
DM
7984 if (kid && kid->op_type == OP_MATCH) {
7985 if (ckWARN(WARN_SYNTAX)) {
6867be6d 7986 const REGEXP *re = PM_GETRE(kPMOP);
d2c6dc5e 7987 const char *pmstr = re ? RX_PRECOMP_const(re) : "STRING";
220fc49f 7988 const STRLEN len = re ? RX_PRELEN(re) : 6;
9014280d 7989 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
bcdf7404 7990 "/%.*s/ should probably be written as \"%.*s\"",
d83b45b8 7991 (int)len, pmstr, (int)len, pmstr);
eb6e2d6f
GS
7992 }
7993 }
7994 return ck_fun(o);
7995}
7996
7997OP *
cea2e8a9 7998Perl_ck_subr(pTHX_ OP *o)
79072805 7999{
97aff369 8000 dVAR;
11343788
MB
8001 OP *prev = ((cUNOPo->op_first->op_sibling)
8002 ? cUNOPo : ((UNOP*)cUNOPo->op_first))->op_first;
8003 OP *o2 = prev->op_sibling;
4633a7c4 8004 OP *cvop;
a0751766 8005 const char *proto = NULL;
cbf82dd0 8006 const char *proto_end = NULL;
c445ea15
AL
8007 CV *cv = NULL;
8008 GV *namegv = NULL;
4633a7c4
LW
8009 int optional = 0;
8010 I32 arg = 0;
5b794e05 8011 I32 contextclass = 0;
d3fcec1f 8012 const char *e = NULL;
0723351e 8013 bool delete_op = 0;
4633a7c4 8014
7918f24d
NC
8015 PERL_ARGS_ASSERT_CK_SUBR;
8016
d3011074 8017 o->op_private |= OPpENTERSUB_HASTARG;
11343788 8018 for (cvop = o2; cvop->op_sibling; cvop = cvop->op_sibling) ;
4633a7c4 8019 if (cvop->op_type == OP_RV2CV) {
11343788 8020 o->op_private |= (cvop->op_private & OPpENTERSUB_AMPER);
93c66552 8021 op_null(cvop); /* disable rv2cv */
f7461760
Z
8022 if (!(o->op_private & OPpENTERSUB_AMPER)) {
8023 SVOP *tmpop = (SVOP*)((UNOP*)cvop)->op_first;
8024 GV *gv = NULL;
8025 switch (tmpop->op_type) {
8026 case OP_GV: {
8027 gv = cGVOPx_gv(tmpop);
8028 cv = GvCVu(gv);
8029 if (!cv)
8030 tmpop->op_private |= OPpEARLY_CV;
8031 } break;
8032 case OP_CONST: {
8033 SV *sv = cSVOPx_sv(tmpop);
8034 if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVCV)
8035 cv = (CV*)SvRV(sv);
8036 } break;
8037 }
8038 if (cv && SvPOK(cv)) {
8039 STRLEN len;
8040 namegv = gv && CvANON(cv) ? gv : CvGV(cv);
8041 proto = SvPV(MUTABLE_SV(cv), len);
8042 proto_end = proto + len;
46fc3d4c 8043 }
4633a7c4
LW
8044 }
8045 }
f5d5a27c 8046 else if (cvop->op_type == OP_METHOD || cvop->op_type == OP_METHOD_NAMED) {
7a52d87a
GS
8047 if (o2->op_type == OP_CONST)
8048 o2->op_private &= ~OPpCONST_STRICT;
58a40671 8049 else if (o2->op_type == OP_LIST) {
5f66b61c
AL
8050 OP * const sib = ((UNOP*)o2)->op_first->op_sibling;
8051 if (sib && sib->op_type == OP_CONST)
8052 sib->op_private &= ~OPpCONST_STRICT;
58a40671 8053 }
7a52d87a 8054 }
3280af22
NIS
8055 o->op_private |= (PL_hints & HINT_STRICT_REFS);
8056 if (PERLDB_SUB && PL_curstash != PL_debstash)
11343788
MB
8057 o->op_private |= OPpENTERSUB_DB;
8058 while (o2 != cvop) {
eb8433b7 8059 OP* o3;
9fc012f4
GG
8060 if (PL_madskills && o2->op_type == OP_STUB) {
8061 o2 = o2->op_sibling;
8062 continue;
8063 }
eb8433b7
NC
8064 if (PL_madskills && o2->op_type == OP_NULL)
8065 o3 = ((UNOP*)o2)->op_first;
8066 else
8067 o3 = o2;
4633a7c4 8068 if (proto) {
cbf82dd0 8069 if (proto >= proto_end)
5dc0d613 8070 return too_many_arguments(o, gv_ename(namegv));
cbf82dd0
NC
8071
8072 switch (*proto) {
4633a7c4
LW
8073 case ';':
8074 optional = 1;
8075 proto++;
8076 continue;
b13fd70a 8077 case '_':
f00d1d61 8078 /* _ must be at the end */
cb40c25d 8079 if (proto[1] && proto[1] != ';')
f00d1d61 8080 goto oops;
4633a7c4
LW
8081 case '$':
8082 proto++;
8083 arg++;
11343788 8084 scalar(o2);
4633a7c4
LW
8085 break;
8086 case '%':
8087 case '@':
11343788 8088 list(o2);
4633a7c4
LW
8089 arg++;
8090 break;
8091 case '&':
8092 proto++;
8093 arg++;
eb8433b7 8094 if (o3->op_type != OP_REFGEN && o3->op_type != OP_UNDEF)
75fc29ea 8095 bad_type(arg,
666ea192
JH
8096 arg == 1 ? "block or sub {}" : "sub {}",
8097 gv_ename(namegv), o3);
4633a7c4
LW
8098 break;
8099 case '*':
2ba6ecf4 8100 /* '*' allows any scalar type, including bareword */
4633a7c4
LW
8101 proto++;
8102 arg++;
eb8433b7 8103 if (o3->op_type == OP_RV2GV)
2ba6ecf4 8104 goto wrapref; /* autoconvert GLOB -> GLOBref */
eb8433b7
NC
8105 else if (o3->op_type == OP_CONST)
8106 o3->op_private &= ~OPpCONST_STRICT;
8107 else if (o3->op_type == OP_ENTERSUB) {
9675f7ac 8108 /* accidental subroutine, revert to bareword */
eb8433b7 8109 OP *gvop = ((UNOP*)o3)->op_first;
9675f7ac
GS
8110 if (gvop && gvop->op_type == OP_NULL) {
8111 gvop = ((UNOP*)gvop)->op_first;
8112 if (gvop) {
8113 for (; gvop->op_sibling; gvop = gvop->op_sibling)
8114 ;
8115 if (gvop &&
8116 (gvop->op_private & OPpENTERSUB_NOPAREN) &&
8117 (gvop = ((UNOP*)gvop)->op_first) &&
8118 gvop->op_type == OP_GV)
8119 {
551405c4
AL
8120 GV * const gv = cGVOPx_gv(gvop);
8121 OP * const sibling = o2->op_sibling;
396482e1 8122 SV * const n = newSVpvs("");
eb8433b7 8123#ifdef PERL_MAD
1d866c12 8124 OP * const oldo2 = o2;
eb8433b7 8125#else
9675f7ac 8126 op_free(o2);
eb8433b7 8127#endif
2a797ae2 8128 gv_fullname4(n, gv, "", FALSE);
2692f720 8129 o2 = newSVOP(OP_CONST, 0, n);
eb8433b7 8130 op_getmad(oldo2,o2,'O');
9675f7ac
GS
8131 prev->op_sibling = o2;
8132 o2->op_sibling = sibling;
8133 }
8134 }
8135 }
8136 }
2ba6ecf4
GS
8137 scalar(o2);
8138 break;
5b794e05
JH
8139 case '[': case ']':
8140 goto oops;
8141 break;
4633a7c4
LW
8142 case '\\':
8143 proto++;
8144 arg++;
5b794e05 8145 again:
4633a7c4 8146 switch (*proto++) {
5b794e05
JH
8147 case '[':
8148 if (contextclass++ == 0) {
841d93c8 8149 e = strchr(proto, ']');
5b794e05
JH
8150 if (!e || e == proto)
8151 goto oops;
8152 }
8153 else
8154 goto oops;
8155 goto again;
8156 break;
8157 case ']':
466bafcd 8158 if (contextclass) {
a0751766
NC
8159 const char *p = proto;
8160 const char *const end = proto;
466bafcd 8161 contextclass = 0;
47127b64 8162 while (*--p != '[') {}
a0751766
NC
8163 bad_type(arg, Perl_form(aTHX_ "one of %.*s",
8164 (int)(end - p), p),
8165 gv_ename(namegv), o3);
466bafcd 8166 } else
5b794e05
JH
8167 goto oops;
8168 break;
4633a7c4 8169 case '*':
eb8433b7 8170 if (o3->op_type == OP_RV2GV)
5b794e05
JH
8171 goto wrapref;
8172 if (!contextclass)
eb8433b7 8173 bad_type(arg, "symbol", gv_ename(namegv), o3);
5b794e05 8174 break;
4633a7c4 8175 case '&':
eb8433b7 8176 if (o3->op_type == OP_ENTERSUB)
5b794e05
JH
8177 goto wrapref;
8178 if (!contextclass)
eb8433b7
NC
8179 bad_type(arg, "subroutine entry", gv_ename(namegv),
8180 o3);
5b794e05 8181 break;
4633a7c4 8182 case '$':
eb8433b7
NC
8183 if (o3->op_type == OP_RV2SV ||
8184 o3->op_type == OP_PADSV ||
8185 o3->op_type == OP_HELEM ||
5b9081af 8186 o3->op_type == OP_AELEM)
5b794e05
JH
8187 goto wrapref;
8188 if (!contextclass)
eb8433b7 8189 bad_type(arg, "scalar", gv_ename(namegv), o3);
5b794e05 8190 break;
4633a7c4 8191 case '@':
eb8433b7
NC
8192 if (o3->op_type == OP_RV2AV ||
8193 o3->op_type == OP_PADAV)
5b794e05
JH
8194 goto wrapref;
8195 if (!contextclass)
eb8433b7 8196 bad_type(arg, "array", gv_ename(namegv), o3);
5b794e05 8197 break;
4633a7c4 8198 case '%':
eb8433b7
NC
8199 if (o3->op_type == OP_RV2HV ||
8200 o3->op_type == OP_PADHV)
5b794e05
JH
8201 goto wrapref;
8202 if (!contextclass)
eb8433b7 8203 bad_type(arg, "hash", gv_ename(namegv), o3);
5b794e05
JH
8204 break;
8205 wrapref:
4633a7c4 8206 {
551405c4
AL
8207 OP* const kid = o2;
8208 OP* const sib = kid->op_sibling;
4633a7c4 8209 kid->op_sibling = 0;
6fa846a0
GS
8210 o2 = newUNOP(OP_REFGEN, 0, kid);
8211 o2->op_sibling = sib;
e858de61 8212 prev->op_sibling = o2;
4633a7c4 8213 }
841d93c8 8214 if (contextclass && e) {
5b794e05
JH
8215 proto = e + 1;
8216 contextclass = 0;
8217 }
4633a7c4
LW
8218 break;
8219 default: goto oops;
8220 }
5b794e05
JH
8221 if (contextclass)
8222 goto again;
4633a7c4 8223 break;
b1cb66bf 8224 case ' ':
8225 proto++;
8226 continue;
4633a7c4
LW
8227 default:
8228 oops:
35c1215d 8229 Perl_croak(aTHX_ "Malformed prototype for %s: %"SVf,
be2597df 8230 gv_ename(namegv), SVfARG(cv));
4633a7c4
LW
8231 }
8232 }
8233 else
11343788
MB
8234 list(o2);
8235 mod(o2, OP_ENTERSUB);
8236 prev = o2;
8237 o2 = o2->op_sibling;
551405c4 8238 } /* while */
236b555a
RGS
8239 if (o2 == cvop && proto && *proto == '_') {
8240 /* generate an access to $_ */
8241 o2 = newDEFSVOP();
8242 o2->op_sibling = prev->op_sibling;
8243 prev->op_sibling = o2; /* instead of cvop */
8244 }
cbf82dd0 8245 if (proto && !optional && proto_end > proto &&
236b555a 8246 (*proto != '@' && *proto != '%' && *proto != ';' && *proto != '_'))
5dc0d613 8247 return too_few_arguments(o, gv_ename(namegv));
0723351e 8248 if(delete_op) {
eb8433b7 8249#ifdef PERL_MAD
1d866c12 8250 OP * const oldo = o;
eb8433b7 8251#else
06492da6 8252 op_free(o);
eb8433b7 8253#endif
06492da6 8254 o=newSVOP(OP_CONST, 0, newSViv(0));
eb8433b7 8255 op_getmad(oldo,o,'O');
06492da6 8256 }
11343788 8257 return o;
79072805
LW
8258}
8259
8260OP *
cea2e8a9 8261Perl_ck_svconst(pTHX_ OP *o)
8990e307 8262{
7918f24d 8263 PERL_ARGS_ASSERT_CK_SVCONST;
96a5add6 8264 PERL_UNUSED_CONTEXT;
11343788
MB
8265 SvREADONLY_on(cSVOPo->op_sv);
8266 return o;
8990e307
LW
8267}
8268
8269OP *
d4ac975e
GA
8270Perl_ck_chdir(pTHX_ OP *o)
8271{
8272 if (o->op_flags & OPf_KIDS) {
1496a290 8273 SVOP * const kid = (SVOP*)cUNOPo->op_first;
d4ac975e
GA
8274
8275 if (kid && kid->op_type == OP_CONST &&
8276 (kid->op_private & OPpCONST_BARE))
8277 {
8278 o->op_flags |= OPf_SPECIAL;
8279 kid->op_private &= ~OPpCONST_STRICT;
8280 }
8281 }
8282 return ck_fun(o);
8283}
8284
8285OP *
cea2e8a9 8286Perl_ck_trunc(pTHX_ OP *o)
79072805 8287{
7918f24d
NC
8288 PERL_ARGS_ASSERT_CK_TRUNC;
8289
11343788
MB
8290 if (o->op_flags & OPf_KIDS) {
8291 SVOP *kid = (SVOP*)cUNOPo->op_first;
79072805 8292
a0d0e21e
LW
8293 if (kid->op_type == OP_NULL)
8294 kid = (SVOP*)kid->op_sibling;
bb53490d
GS
8295 if (kid && kid->op_type == OP_CONST &&
8296 (kid->op_private & OPpCONST_BARE))
8297 {
11343788 8298 o->op_flags |= OPf_SPECIAL;
bb53490d
GS
8299 kid->op_private &= ~OPpCONST_STRICT;
8300 }
79072805 8301 }
11343788 8302 return ck_fun(o);
79072805
LW
8303}
8304
35fba0d9 8305OP *
bab9c0ac
RGS
8306Perl_ck_unpack(pTHX_ OP *o)
8307{
8308 OP *kid = cLISTOPo->op_first;
7918f24d
NC
8309
8310 PERL_ARGS_ASSERT_CK_UNPACK;
8311
bab9c0ac
RGS
8312 if (kid->op_sibling) {
8313 kid = kid->op_sibling;
8314 if (!kid->op_sibling)
8315 kid->op_sibling = newDEFSVOP();
8316 }
8317 return ck_fun(o);
8318}
8319
8320OP *
35fba0d9
RG
8321Perl_ck_substr(pTHX_ OP *o)
8322{
7918f24d
NC
8323 PERL_ARGS_ASSERT_CK_SUBSTR;
8324
35fba0d9 8325 o = ck_fun(o);
1d866c12 8326 if ((o->op_flags & OPf_KIDS) && (o->op_private == 4)) {
35fba0d9
RG
8327 OP *kid = cLISTOPo->op_first;
8328
8329 if (kid->op_type == OP_NULL)
8330 kid = kid->op_sibling;
8331 if (kid)
8332 kid->op_flags |= OPf_MOD;
8333
8334 }
8335 return o;
8336}
8337
878d132a
NC
8338OP *
8339Perl_ck_each(pTHX_ OP *o)
8340{
d75c0fe7 8341 dVAR;
a916b302 8342 OP *kid = o->op_flags & OPf_KIDS ? cLISTOPo->op_first : NULL;
878d132a 8343
7918f24d
NC
8344 PERL_ARGS_ASSERT_CK_EACH;
8345
a916b302
RGS
8346 if (kid) {
8347 if (kid->op_type == OP_PADAV || kid->op_type == OP_RV2AV) {
8348 const unsigned new_type = o->op_type == OP_EACH ? OP_AEACH
8349 : o->op_type == OP_KEYS ? OP_AKEYS : OP_AVALUES;
8350 o->op_type = new_type;
8351 o->op_ppaddr = PL_ppaddr[new_type];
8352 }
8353 else if (!(kid->op_type == OP_PADHV || kid->op_type == OP_RV2HV
8354 || (kid->op_type == OP_CONST && kid->op_private & OPpCONST_BARE)
8355 )) {
8356 bad_type(1, "hash or array", PL_op_desc[o->op_type], kid);
8357 return o;
8358 }
878d132a
NC
8359 }
8360 return ck_fun(o);
8361}
8362
867fa1e2
YO
8363/* caller is supposed to assign the return to the
8364 container of the rep_op var */
20381b50 8365STATIC OP *
867fa1e2
YO
8366S_opt_scalarhv(pTHX_ OP *rep_op) {
8367 UNOP *unop;
8368
8369 PERL_ARGS_ASSERT_OPT_SCALARHV;
8370
8371 NewOp(1101, unop, 1, UNOP);
8372 unop->op_type = (OPCODE)OP_BOOLKEYS;
8373 unop->op_ppaddr = PL_ppaddr[OP_BOOLKEYS];
8374 unop->op_flags = (U8)(OPf_WANT_SCALAR | OPf_KIDS );
8375 unop->op_private = (U8)(1 | ((OPf_WANT_SCALAR | OPf_KIDS) >> 8));
8376 unop->op_first = rep_op;
8377 unop->op_next = rep_op->op_next;
8378 rep_op->op_next = (OP*)unop;
8379 rep_op->op_flags|=(OPf_REF | OPf_MOD);
8380 unop->op_sibling = rep_op->op_sibling;
8381 rep_op->op_sibling = NULL;
8382 /* unop->op_targ = pad_alloc(OP_BOOLKEYS, SVs_PADTMP); */
8383 if (rep_op->op_type == OP_PADHV) {
8384 rep_op->op_flags &= ~OPf_WANT_SCALAR;
8385 rep_op->op_flags |= OPf_WANT_LIST;
8386 }
8387 return (OP*)unop;
8388}
8389
2f9e2db0
VP
8390/* Checks if o acts as an in-place operator on an array. oright points to the
8391 * beginning of the right-hand side. Returns the left-hand side of the
8392 * assignment if o acts in-place, or NULL otherwise. */
8393
20381b50 8394STATIC OP *
2f9e2db0
VP
8395S_is_inplace_av(pTHX_ OP *o, OP *oright) {
8396 OP *o2;
8397 OP *oleft = NULL;
8398
8399 PERL_ARGS_ASSERT_IS_INPLACE_AV;
8400
8401 if (!oright ||
8402 (oright->op_type != OP_RV2AV && oright->op_type != OP_PADAV)
8403 || oright->op_next != o
8404 || (oright->op_private & OPpLVAL_INTRO)
8405 )
8406 return NULL;
8407
8408 /* o2 follows the chain of op_nexts through the LHS of the
8409 * assign (if any) to the aassign op itself */
8410 o2 = o->op_next;
8411 if (!o2 || o2->op_type != OP_NULL)
8412 return NULL;
8413 o2 = o2->op_next;
8414 if (!o2 || o2->op_type != OP_PUSHMARK)
8415 return NULL;
8416 o2 = o2->op_next;
8417 if (o2 && o2->op_type == OP_GV)
8418 o2 = o2->op_next;
8419 if (!o2
8420 || (o2->op_type != OP_PADAV && o2->op_type != OP_RV2AV)
8421 || (o2->op_private & OPpLVAL_INTRO)
8422 )
8423 return NULL;
8424 oleft = o2;
8425 o2 = o2->op_next;
8426 if (!o2 || o2->op_type != OP_NULL)
8427 return NULL;
8428 o2 = o2->op_next;
8429 if (!o2 || o2->op_type != OP_AASSIGN
8430 || (o2->op_flags & OPf_WANT) != OPf_WANT_VOID)
8431 return NULL;
8432
8433 /* check that the sort is the first arg on RHS of assign */
8434
8435 o2 = cUNOPx(o2)->op_first;
8436 if (!o2 || o2->op_type != OP_NULL)
8437 return NULL;
8438 o2 = cUNOPx(o2)->op_first;
8439 if (!o2 || o2->op_type != OP_PUSHMARK)
8440 return NULL;
8441 if (o2->op_sibling != o)
8442 return NULL;
8443
8444 /* check the array is the same on both sides */
8445 if (oleft->op_type == OP_RV2AV) {
8446 if (oright->op_type != OP_RV2AV
8447 || !cUNOPx(oright)->op_first
8448 || cUNOPx(oright)->op_first->op_type != OP_GV
8449 || cGVOPx_gv(cUNOPx(oleft)->op_first) !=
8450 cGVOPx_gv(cUNOPx(oright)->op_first)
8451 )
8452 return NULL;
8453 }
8454 else if (oright->op_type != OP_PADAV
8455 || oright->op_targ != oleft->op_targ
8456 )
8457 return NULL;
8458
8459 return oleft;
8460}
8461
61b743bb
DM
8462/* A peephole optimizer. We visit the ops in the order they're to execute.
8463 * See the comments at the top of this file for more details about when
8464 * peep() is called */
463ee0b2 8465
79072805 8466void
864dbfa3 8467Perl_peep(pTHX_ register OP *o)
79072805 8468{
27da23d5 8469 dVAR;
c445ea15 8470 register OP* oldop = NULL;
2d8e6c8d 8471
2814eb74 8472 if (!o || o->op_opt)
79072805 8473 return;
a0d0e21e 8474 ENTER;
462e5cf6 8475 SAVEOP();
7766f137 8476 SAVEVPTR(PL_curcop);
a0d0e21e 8477 for (; o; o = o->op_next) {
2814eb74 8478 if (o->op_opt)
a0d0e21e 8479 break;
6d7dd4a5
NC
8480 /* By default, this op has now been optimised. A couple of cases below
8481 clear this again. */
8482 o->op_opt = 1;
533c011a 8483 PL_op = o;
a0d0e21e
LW
8484 switch (o->op_type) {
8485 case OP_NEXTSTATE:
8486 case OP_DBSTATE:
3280af22 8487 PL_curcop = ((COP*)o); /* for warnings */
a0d0e21e
LW
8488 break;
8489
a0d0e21e 8490 case OP_CONST:
7a52d87a
GS
8491 if (cSVOPo->op_private & OPpCONST_STRICT)
8492 no_bareword_allowed(o);
7766f137 8493#ifdef USE_ITHREADS
996c9baa 8494 case OP_HINTSEVAL:
3848b962 8495 case OP_METHOD_NAMED:
7766f137
GS
8496 /* Relocate sv to the pad for thread safety.
8497 * Despite being a "constant", the SV is written to,
8498 * for reference counts, sv_upgrade() etc. */
8499 if (cSVOP->op_sv) {
6867be6d 8500 const PADOFFSET ix = pad_alloc(OP_CONST, SVs_PADTMP);
996c9baa 8501 if (o->op_type != OP_METHOD_NAMED && SvPADTMP(cSVOPo->op_sv)) {
6a7129a1 8502 /* If op_sv is already a PADTMP then it is being used by
9a049f1c 8503 * some pad, so make a copy. */
dd2155a4
DM
8504 sv_setsv(PAD_SVl(ix),cSVOPo->op_sv);
8505 SvREADONLY_on(PAD_SVl(ix));
6a7129a1
GS
8506 SvREFCNT_dec(cSVOPo->op_sv);
8507 }
996c9baa 8508 else if (o->op_type != OP_METHOD_NAMED
052ca17e
NC
8509 && cSVOPo->op_sv == &PL_sv_undef) {
8510 /* PL_sv_undef is hack - it's unsafe to store it in the
8511 AV that is the pad, because av_fetch treats values of
8512 PL_sv_undef as a "free" AV entry and will merrily
8513 replace them with a new SV, causing pad_alloc to think
8514 that this pad slot is free. (When, clearly, it is not)
8515 */
8516 SvOK_off(PAD_SVl(ix));
8517 SvPADTMP_on(PAD_SVl(ix));
8518 SvREADONLY_on(PAD_SVl(ix));
8519 }
6a7129a1 8520 else {
dd2155a4 8521 SvREFCNT_dec(PAD_SVl(ix));
6a7129a1 8522 SvPADTMP_on(cSVOPo->op_sv);
dd2155a4 8523 PAD_SETSV(ix, cSVOPo->op_sv);
9a049f1c 8524 /* XXX I don't know how this isn't readonly already. */
dd2155a4 8525 SvREADONLY_on(PAD_SVl(ix));
6a7129a1 8526 }
a0714e2c 8527 cSVOPo->op_sv = NULL;
7766f137
GS
8528 o->op_targ = ix;
8529 }
8530#endif
07447971
GS
8531 break;
8532
df91b2c5
AE
8533 case OP_CONCAT:
8534 if (o->op_next && o->op_next->op_type == OP_STRINGIFY) {
8535 if (o->op_next->op_private & OPpTARGET_MY) {
8536 if (o->op_flags & OPf_STACKED) /* chained concats */
a6aa0b75 8537 break; /* ignore_optimization */
df91b2c5
AE
8538 else {
8539 /* assert(PL_opargs[o->op_type] & OA_TARGLEX); */
8540 o->op_targ = o->op_next->op_targ;
8541 o->op_next->op_targ = 0;
8542 o->op_private |= OPpTARGET_MY;
8543 }
8544 }
8545 op_null(o->op_next);
8546 }
df91b2c5 8547 break;
6d7dd4a5
NC
8548 case OP_STUB:
8549 if ((o->op_flags & OPf_WANT) != OPf_WANT_LIST) {
8550 break; /* Scalar stub must produce undef. List stub is noop */
8551 }
8552 goto nothin;
79072805 8553 case OP_NULL:
acb36ea4 8554 if (o->op_targ == OP_NEXTSTATE
5edb5b2a 8555 || o->op_targ == OP_DBSTATE)
acb36ea4 8556 {
3280af22 8557 PL_curcop = ((COP*)o);
acb36ea4 8558 }
dad75012
AMS
8559 /* XXX: We avoid setting op_seq here to prevent later calls
8560 to peep() from mistakenly concluding that optimisation
8561 has already occurred. This doesn't fix the real problem,
8562 though (See 20010220.007). AMS 20010719 */
2814eb74 8563 /* op_seq functionality is now replaced by op_opt */
6d7dd4a5 8564 o->op_opt = 0;
f46f2f82 8565 /* FALL THROUGH */
79072805 8566 case OP_SCALAR:
93a17b20 8567 case OP_LINESEQ:
463ee0b2 8568 case OP_SCOPE:
6d7dd4a5 8569 nothin:
a0d0e21e
LW
8570 if (oldop && o->op_next) {
8571 oldop->op_next = o->op_next;
6d7dd4a5 8572 o->op_opt = 0;
79072805
LW
8573 continue;
8574 }
79072805
LW
8575 break;
8576
6a077020 8577 case OP_PADAV:
79072805 8578 case OP_GV:
6a077020 8579 if (o->op_type == OP_PADAV || o->op_next->op_type == OP_RV2AV) {
0bd48802 8580 OP* const pop = (o->op_type == OP_PADAV) ?
6a077020 8581 o->op_next : o->op_next->op_next;
a0d0e21e 8582 IV i;
f9dc862f 8583 if (pop && pop->op_type == OP_CONST &&
af5acbb4 8584 ((PL_op = pop->op_next)) &&
8990e307 8585 pop->op_next->op_type == OP_AELEM &&
a0d0e21e 8586 !(pop->op_next->op_private &
78f9721b 8587 (OPpLVAL_INTRO|OPpLVAL_DEFER|OPpDEREF|OPpMAYBE_LVSUB)) &&
fc15ae8f 8588 (i = SvIV(((SVOP*)pop)->op_sv) - CopARYBASE_get(PL_curcop))
a0d0e21e 8589 <= 255 &&
8990e307
LW
8590 i >= 0)
8591 {
350de78d 8592 GV *gv;
af5acbb4
DM
8593 if (cSVOPx(pop)->op_private & OPpCONST_STRICT)
8594 no_bareword_allowed(pop);
6a077020
DM
8595 if (o->op_type == OP_GV)
8596 op_null(o->op_next);
93c66552
DM
8597 op_null(pop->op_next);
8598 op_null(pop);
a0d0e21e
LW
8599 o->op_flags |= pop->op_next->op_flags & OPf_MOD;
8600 o->op_next = pop->op_next->op_next;
22c35a8c 8601 o->op_ppaddr = PL_ppaddr[OP_AELEMFAST];
a0d0e21e 8602 o->op_private = (U8)i;
6a077020
DM
8603 if (o->op_type == OP_GV) {
8604 gv = cGVOPo_gv;
8605 GvAVn(gv);
8606 }
8607 else
8608 o->op_flags |= OPf_SPECIAL;
8609 o->op_type = OP_AELEMFAST;
8610 }
6a077020
DM
8611 break;
8612 }
8613
8614 if (o->op_next->op_type == OP_RV2SV) {
8615 if (!(o->op_next->op_private & OPpDEREF)) {
8616 op_null(o->op_next);
8617 o->op_private |= o->op_next->op_private & (OPpLVAL_INTRO
8618 | OPpOUR_INTRO);
8619 o->op_next = o->op_next->op_next;
8620 o->op_type = OP_GVSV;
8621 o->op_ppaddr = PL_ppaddr[OP_GVSV];
8990e307 8622 }
79072805 8623 }
e476b1b5 8624 else if ((o->op_private & OPpEARLY_CV) && ckWARN(WARN_PROTOTYPE)) {
551405c4 8625 GV * const gv = cGVOPo_gv;
b15aece3 8626 if (SvTYPE(gv) == SVt_PVGV && GvCV(gv) && SvPVX_const(GvCV(gv))) {
76cd736e 8627 /* XXX could check prototype here instead of just carping */
551405c4 8628 SV * const sv = sv_newmortal();
bd61b366 8629 gv_efullname3(sv, gv, NULL);
9014280d 8630 Perl_warner(aTHX_ packWARN(WARN_PROTOTYPE),
35c1215d 8631 "%"SVf"() called too early to check prototype",
be2597df 8632 SVfARG(sv));
76cd736e
GS
8633 }
8634 }
89de2904
AMS
8635 else if (o->op_next->op_type == OP_READLINE
8636 && o->op_next->op_next->op_type == OP_CONCAT
8637 && (o->op_next->op_next->op_flags & OPf_STACKED))
8638 {
d2c45030
AMS
8639 /* Turn "$a .= <FH>" into an OP_RCATLINE. AMS 20010917 */
8640 o->op_type = OP_RCATLINE;
8641 o->op_flags |= OPf_STACKED;
8642 o->op_ppaddr = PL_ppaddr[OP_RCATLINE];
89de2904 8643 op_null(o->op_next->op_next);
d2c45030 8644 op_null(o->op_next);
89de2904 8645 }
76cd736e 8646
79072805 8647 break;
867fa1e2
YO
8648
8649 {
8650 OP *fop;
8651 OP *sop;
8652
8653 case OP_NOT:
8654 fop = cUNOP->op_first;
8655 sop = NULL;
8656 goto stitch_keys;
8657 break;
8658
8659 case OP_AND:
79072805 8660 case OP_OR:
c963b151 8661 case OP_DOR:
867fa1e2
YO
8662 fop = cLOGOP->op_first;
8663 sop = fop->op_sibling;
8664 while (cLOGOP->op_other->op_type == OP_NULL)
8665 cLOGOP->op_other = cLOGOP->op_other->op_next;
8666 peep(cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */
8667
8668 stitch_keys:
8669 o->op_opt = 1;
8670 if ((fop->op_type == OP_PADHV || fop->op_type == OP_RV2HV)
8671 || ( sop &&
8672 (sop->op_type == OP_PADHV || sop->op_type == OP_RV2HV)
8673 )
8674 ){
8675 OP * nop = o;
8676 OP * lop = o;
8677 if (!(nop->op_flags && OPf_WANT_VOID)) {
8678 while (nop && nop->op_next) {
8679 switch (nop->op_next->op_type) {
8680 case OP_NOT:
8681 case OP_AND:
8682 case OP_OR:
8683 case OP_DOR:
8684 lop = nop = nop->op_next;
8685 break;
8686 case OP_NULL:
8687 nop = nop->op_next;
8688 break;
8689 default:
8690 nop = NULL;
8691 break;
8692 }
8693 }
8694 }
8695 if (lop->op_flags && OPf_WANT_VOID) {
8696 if (fop->op_type == OP_PADHV || fop->op_type == OP_RV2HV)
8697 cLOGOP->op_first = opt_scalarhv(fop);
8698 if (sop && (sop->op_type == OP_PADHV || sop->op_type == OP_RV2HV))
8699 cLOGOP->op_first->op_sibling = opt_scalarhv(sop);
8700 }
8701 }
8702
8703
8704 break;
8705 }
8706
8707 case OP_MAPWHILE:
8708 case OP_GREPWHILE:
2c2d71f5
JH
8709 case OP_ANDASSIGN:
8710 case OP_ORASSIGN:
c963b151 8711 case OP_DORASSIGN:
1a67a97c
SM
8712 case OP_COND_EXPR:
8713 case OP_RANGE:
c5917253 8714 case OP_ONCE:
fd4d1407
IZ
8715 while (cLOGOP->op_other->op_type == OP_NULL)
8716 cLOGOP->op_other = cLOGOP->op_other->op_next;
a2efc822 8717 peep(cLOGOP->op_other); /* Recursive calls are not replaced by fptr calls */
79072805
LW
8718 break;
8719
79072805 8720 case OP_ENTERLOOP:
9c2ca71a 8721 case OP_ENTERITER:
58cccf98
SM
8722 while (cLOOP->op_redoop->op_type == OP_NULL)
8723 cLOOP->op_redoop = cLOOP->op_redoop->op_next;
79072805 8724 peep(cLOOP->op_redoop);
58cccf98
SM
8725 while (cLOOP->op_nextop->op_type == OP_NULL)
8726 cLOOP->op_nextop = cLOOP->op_nextop->op_next;
79072805 8727 peep(cLOOP->op_nextop);
58cccf98
SM
8728 while (cLOOP->op_lastop->op_type == OP_NULL)
8729 cLOOP->op_lastop = cLOOP->op_lastop->op_next;
79072805
LW
8730 peep(cLOOP->op_lastop);
8731 break;
8732
79072805 8733 case OP_SUBST:
29f2e912
NC
8734 assert(!(cPMOP->op_pmflags & PMf_ONCE));
8735 while (cPMOP->op_pmstashstartu.op_pmreplstart &&
8736 cPMOP->op_pmstashstartu.op_pmreplstart->op_type == OP_NULL)
8737 cPMOP->op_pmstashstartu.op_pmreplstart
8738 = cPMOP->op_pmstashstartu.op_pmreplstart->op_next;
8739 peep(cPMOP->op_pmstashstartu.op_pmreplstart);
79072805
LW
8740 break;
8741
a0d0e21e 8742 case OP_EXEC:
041457d9
DM
8743 if (o->op_next && o->op_next->op_type == OP_NEXTSTATE
8744 && ckWARN(WARN_SYNTAX))
8745 {
1496a290
AL
8746 if (o->op_next->op_sibling) {
8747 const OPCODE type = o->op_next->op_sibling->op_type;
8748 if (type != OP_EXIT && type != OP_WARN && type != OP_DIE) {
8749 const line_t oldline = CopLINE(PL_curcop);
8750 CopLINE_set(PL_curcop, CopLINE((COP*)o->op_next));
8751 Perl_warner(aTHX_ packWARN(WARN_EXEC),
8752 "Statement unlikely to be reached");
8753 Perl_warner(aTHX_ packWARN(WARN_EXEC),
8754 "\t(Maybe you meant system() when you said exec()?)\n");
8755 CopLINE_set(PL_curcop, oldline);
8756 }
a0d0e21e
LW
8757 }
8758 }
8759 break;
b2ffa427 8760
c750a3ec 8761 case OP_HELEM: {
e75d1f10 8762 UNOP *rop;
6d822dc4 8763 SV *lexname;
e75d1f10 8764 GV **fields;
6d822dc4 8765 SV **svp, *sv;
d5263905 8766 const char *key = NULL;
c750a3ec 8767 STRLEN keylen;
b2ffa427 8768
1c846c1f 8769 if (((BINOP*)o)->op_last->op_type != OP_CONST)
c750a3ec 8770 break;
1c846c1f
NIS
8771
8772 /* Make the CONST have a shared SV */
8773 svp = cSVOPx_svp(((BINOP*)o)->op_last);
38bb37b9 8774 if (!SvFAKE(sv = *svp) || !SvREADONLY(sv)) {
d5263905 8775 key = SvPV_const(sv, keylen);
25716404 8776 lexname = newSVpvn_share(key,
bb7a0f54 8777 SvUTF8(sv) ? -(I32)keylen : (I32)keylen,
25716404 8778 0);
1c846c1f
NIS
8779 SvREFCNT_dec(sv);
8780 *svp = lexname;
8781 }
e75d1f10
RD
8782
8783 if ((o->op_private & (OPpLVAL_INTRO)))
8784 break;
8785
8786 rop = (UNOP*)((BINOP*)o)->op_first;
8787 if (rop->op_type != OP_RV2HV || rop->op_first->op_type != OP_PADSV)
8788 break;
8789 lexname = *av_fetch(PL_comppad_name, rop->op_first->op_targ, TRUE);
00b1698f 8790 if (!SvPAD_TYPED(lexname))
e75d1f10 8791 break;
a4fc7abc 8792 fields = (GV**)hv_fetchs(SvSTASH(lexname), "FIELDS", FALSE);
e75d1f10
RD
8793 if (!fields || !GvHV(*fields))
8794 break;
93524f2b 8795 key = SvPV_const(*svp, keylen);
e75d1f10 8796 if (!hv_fetch(GvHV(*fields), key,
bb7a0f54 8797 SvUTF8(*svp) ? -(I32)keylen : (I32)keylen, FALSE))
e75d1f10
RD
8798 {
8799 Perl_croak(aTHX_ "No such class field \"%s\" "
8800 "in variable %s of type %s",
93524f2b 8801 key, SvPV_nolen_const(lexname), HvNAME_get(SvSTASH(lexname)));
e75d1f10
RD
8802 }
8803
6d822dc4
MS
8804 break;
8805 }
c750a3ec 8806
e75d1f10
RD
8807 case OP_HSLICE: {
8808 UNOP *rop;
8809 SV *lexname;
8810 GV **fields;
8811 SV **svp;
93524f2b 8812 const char *key;
e75d1f10
RD
8813 STRLEN keylen;
8814 SVOP *first_key_op, *key_op;
8815
8816 if ((o->op_private & (OPpLVAL_INTRO))
8817 /* I bet there's always a pushmark... */
8818 || ((LISTOP*)o)->op_first->op_sibling->op_type != OP_LIST)
8819 /* hmmm, no optimization if list contains only one key. */
8820 break;
8821 rop = (UNOP*)((LISTOP*)o)->op_last;
8822 if (rop->op_type != OP_RV2HV)
8823 break;
8824 if (rop->op_first->op_type == OP_PADSV)
8825 /* @$hash{qw(keys here)} */
8826 rop = (UNOP*)rop->op_first;
8827 else {
8828 /* @{$hash}{qw(keys here)} */
8829 if (rop->op_first->op_type == OP_SCOPE
8830 && cLISTOPx(rop->op_first)->op_last->op_type == OP_PADSV)
8831 {
8832 rop = (UNOP*)cLISTOPx(rop->op_first)->op_last;
8833 }
8834 else
8835 break;
8836 }
8837
8838 lexname = *av_fetch(PL_comppad_name, rop->op_targ, TRUE);
00b1698f 8839 if (!SvPAD_TYPED(lexname))
e75d1f10 8840 break;
a4fc7abc 8841 fields = (GV**)hv_fetchs(SvSTASH(lexname), "FIELDS", FALSE);
e75d1f10
RD
8842 if (!fields || !GvHV(*fields))
8843 break;
8844 /* Again guessing that the pushmark can be jumped over.... */
8845 first_key_op = (SVOP*)((LISTOP*)((LISTOP*)o)->op_first->op_sibling)
8846 ->op_first->op_sibling;
8847 for (key_op = first_key_op; key_op;
8848 key_op = (SVOP*)key_op->op_sibling) {
8849 if (key_op->op_type != OP_CONST)
8850 continue;
8851 svp = cSVOPx_svp(key_op);
93524f2b 8852 key = SvPV_const(*svp, keylen);
e75d1f10 8853 if (!hv_fetch(GvHV(*fields), key,
bb7a0f54 8854 SvUTF8(*svp) ? -(I32)keylen : (I32)keylen, FALSE))
e75d1f10
RD
8855 {
8856 Perl_croak(aTHX_ "No such class field \"%s\" "
8857 "in variable %s of type %s",
bfcb3514 8858 key, SvPV_nolen(lexname), HvNAME_get(SvSTASH(lexname)));
e75d1f10
RD
8859 }
8860 }
8861 break;
8862 }
8863
fe1bc4cf 8864 case OP_SORT: {
fe1bc4cf 8865 /* will point to RV2AV or PADAV op on LHS/RHS of assign */
551405c4 8866 OP *oleft;
fe1bc4cf
DM
8867 OP *o2;
8868
fe1bc4cf 8869 /* check that RHS of sort is a single plain array */
551405c4 8870 OP *oright = cUNOPo->op_first;
fe1bc4cf
DM
8871 if (!oright || oright->op_type != OP_PUSHMARK)
8872 break;
471178c0
NC
8873
8874 /* reverse sort ... can be optimised. */
8875 if (!cUNOPo->op_sibling) {
8876 /* Nothing follows us on the list. */
551405c4 8877 OP * const reverse = o->op_next;
471178c0
NC
8878
8879 if (reverse->op_type == OP_REVERSE &&
8880 (reverse->op_flags & OPf_WANT) == OPf_WANT_LIST) {
551405c4 8881 OP * const pushmark = cUNOPx(reverse)->op_first;
471178c0
NC
8882 if (pushmark && (pushmark->op_type == OP_PUSHMARK)
8883 && (cUNOPx(pushmark)->op_sibling == o)) {
8884 /* reverse -> pushmark -> sort */
8885 o->op_private |= OPpSORT_REVERSE;
8886 op_null(reverse);
8887 pushmark->op_next = oright->op_next;
8888 op_null(oright);
8889 }
8890 }
8891 }
8892
8893 /* make @a = sort @a act in-place */
8894
fe1bc4cf
DM
8895 oright = cUNOPx(oright)->op_sibling;
8896 if (!oright)
8897 break;
8898 if (oright->op_type == OP_NULL) { /* skip sort block/sub */
8899 oright = cUNOPx(oright)->op_sibling;
8900 }
8901
2f9e2db0
VP
8902 oleft = is_inplace_av(o, oright);
8903 if (!oleft)
fe1bc4cf
DM
8904 break;
8905
8906 /* transfer MODishness etc from LHS arg to RHS arg */
8907 oright->op_flags = oleft->op_flags;
8908 o->op_private |= OPpSORT_INPLACE;
8909
8910 /* excise push->gv->rv2av->null->aassign */
8911 o2 = o->op_next->op_next;
8912 op_null(o2); /* PUSHMARK */
8913 o2 = o2->op_next;
8914 if (o2->op_type == OP_GV) {
8915 op_null(o2); /* GV */
8916 o2 = o2->op_next;
8917 }
8918 op_null(o2); /* RV2AV or PADAV */
8919 o2 = o2->op_next->op_next;
8920 op_null(o2); /* AASSIGN */
8921
8922 o->op_next = o2->op_next;
8923
8924 break;
8925 }
ef3e5ea9
NC
8926
8927 case OP_REVERSE: {
e682d7b7 8928 OP *ourmark, *theirmark, *ourlast, *iter, *expushmark, *rv2av;
ce335f37 8929 OP *gvop = NULL;
484c818f 8930 OP *oleft, *oright;
ef3e5ea9 8931 LISTOP *enter, *exlist;
ef3e5ea9 8932
484c818f
VP
8933 /* @a = reverse @a */
8934 if ((oright = cLISTOPo->op_first)
8935 && (oright->op_type == OP_PUSHMARK)
8936 && (oright = oright->op_sibling)
8937 && (oleft = is_inplace_av(o, oright))) {
8938 OP *o2;
8939
8940 /* transfer MODishness etc from LHS arg to RHS arg */
8941 oright->op_flags = oleft->op_flags;
8942 o->op_private |= OPpREVERSE_INPLACE;
8943
8944 /* excise push->gv->rv2av->null->aassign */
8945 o2 = o->op_next->op_next;
8946 op_null(o2); /* PUSHMARK */
8947 o2 = o2->op_next;
8948 if (o2->op_type == OP_GV) {
8949 op_null(o2); /* GV */
8950 o2 = o2->op_next;
8951 }
8952 op_null(o2); /* RV2AV or PADAV */
8953 o2 = o2->op_next->op_next;
8954 op_null(o2); /* AASSIGN */
8955
8956 o->op_next = o2->op_next;
8957 break;
8958 }
8959
ef3e5ea9
NC
8960 enter = (LISTOP *) o->op_next;
8961 if (!enter)
8962 break;
8963 if (enter->op_type == OP_NULL) {
8964 enter = (LISTOP *) enter->op_next;
8965 if (!enter)
8966 break;
8967 }
d46f46af
NC
8968 /* for $a (...) will have OP_GV then OP_RV2GV here.
8969 for (...) just has an OP_GV. */
ce335f37
NC
8970 if (enter->op_type == OP_GV) {
8971 gvop = (OP *) enter;
8972 enter = (LISTOP *) enter->op_next;
8973 if (!enter)
8974 break;
d46f46af
NC
8975 if (enter->op_type == OP_RV2GV) {
8976 enter = (LISTOP *) enter->op_next;
8977 if (!enter)
ce335f37 8978 break;
d46f46af 8979 }
ce335f37
NC
8980 }
8981
ef3e5ea9
NC
8982 if (enter->op_type != OP_ENTERITER)
8983 break;
8984
8985 iter = enter->op_next;
8986 if (!iter || iter->op_type != OP_ITER)
8987 break;
8988
ce335f37
NC
8989 expushmark = enter->op_first;
8990 if (!expushmark || expushmark->op_type != OP_NULL
8991 || expushmark->op_targ != OP_PUSHMARK)
8992 break;
8993
8994 exlist = (LISTOP *) expushmark->op_sibling;
ef3e5ea9
NC
8995 if (!exlist || exlist->op_type != OP_NULL
8996 || exlist->op_targ != OP_LIST)
8997 break;
8998
8999 if (exlist->op_last != o) {
9000 /* Mmm. Was expecting to point back to this op. */
9001 break;
9002 }
9003 theirmark = exlist->op_first;
9004 if (!theirmark || theirmark->op_type != OP_PUSHMARK)
9005 break;
9006
c491ecac 9007 if (theirmark->op_sibling != o) {
ef3e5ea9
NC
9008 /* There's something between the mark and the reverse, eg
9009 for (1, reverse (...))
9010 so no go. */
9011 break;
9012 }
9013
c491ecac
NC
9014 ourmark = ((LISTOP *)o)->op_first;
9015 if (!ourmark || ourmark->op_type != OP_PUSHMARK)
9016 break;
9017
ef3e5ea9
NC
9018 ourlast = ((LISTOP *)o)->op_last;
9019 if (!ourlast || ourlast->op_next != o)
9020 break;
9021
e682d7b7
NC
9022 rv2av = ourmark->op_sibling;
9023 if (rv2av && rv2av->op_type == OP_RV2AV && rv2av->op_sibling == 0
9024 && rv2av->op_flags == (OPf_WANT_LIST | OPf_KIDS)
9025 && enter->op_flags == (OPf_WANT_LIST | OPf_KIDS)) {
9026 /* We're just reversing a single array. */
9027 rv2av->op_flags = OPf_WANT_SCALAR | OPf_KIDS | OPf_REF;
9028 enter->op_flags |= OPf_STACKED;
9029 }
9030
ef3e5ea9
NC
9031 /* We don't have control over who points to theirmark, so sacrifice
9032 ours. */
9033 theirmark->op_next = ourmark->op_next;
9034 theirmark->op_flags = ourmark->op_flags;
ce335f37 9035 ourlast->op_next = gvop ? gvop : (OP *) enter;
ef3e5ea9
NC
9036 op_null(ourmark);
9037 op_null(o);
9038 enter->op_private |= OPpITER_REVERSED;
9039 iter->op_private |= OPpITER_REVERSED;
9040
9041 break;
9042 }
e26df76a
NC
9043
9044 case OP_SASSIGN: {
9045 OP *rv2gv;
9046 UNOP *refgen, *rv2cv;
9047 LISTOP *exlist;
9048
50baa5ea 9049 if ((o->op_flags & OPf_WANT) != OPf_WANT_VOID)
de3370bc
NC
9050 break;
9051
e26df76a
NC
9052 if ((o->op_private & ~OPpASSIGN_BACKWARDS) != 2)
9053 break;
9054
9055 rv2gv = ((BINOP *)o)->op_last;
9056 if (!rv2gv || rv2gv->op_type != OP_RV2GV)
9057 break;
9058
9059 refgen = (UNOP *)((BINOP *)o)->op_first;
9060
9061 if (!refgen || refgen->op_type != OP_REFGEN)
9062 break;
9063
9064 exlist = (LISTOP *)refgen->op_first;
9065 if (!exlist || exlist->op_type != OP_NULL
9066 || exlist->op_targ != OP_LIST)
9067 break;
9068
9069 if (exlist->op_first->op_type != OP_PUSHMARK)
9070 break;
9071
9072 rv2cv = (UNOP*)exlist->op_last;
9073
9074 if (rv2cv->op_type != OP_RV2CV)
9075 break;
9076
9077 assert ((rv2gv->op_private & OPpDONT_INIT_GV) == 0);
9078 assert ((o->op_private & OPpASSIGN_CV_TO_GV) == 0);
9079 assert ((rv2cv->op_private & OPpMAY_RETURN_CONSTANT) == 0);
9080
9081 o->op_private |= OPpASSIGN_CV_TO_GV;
9082 rv2gv->op_private |= OPpDONT_INIT_GV;
9083 rv2cv->op_private |= OPpMAY_RETURN_CONSTANT;
9084
9085 break;
9086 }
9087
fe1bc4cf 9088
0477511c
NC
9089 case OP_QR:
9090 case OP_MATCH:
29f2e912
NC
9091 if (!(cPMOP->op_pmflags & PMf_ONCE)) {
9092 assert (!cPMOP->op_pmstashstartu.op_pmreplstart);
9093 }
79072805
LW
9094 break;
9095 }
a0d0e21e 9096 oldop = o;
79072805 9097 }
a0d0e21e 9098 LEAVE;
79072805 9099}
beab0874 9100
cef6ea9d 9101const char*
1cb0ed9b 9102Perl_custom_op_name(pTHX_ const OP* o)
53e06cf0 9103{
97aff369 9104 dVAR;
e1ec3a88 9105 const IV index = PTR2IV(o->op_ppaddr);
53e06cf0
SC
9106 SV* keysv;
9107 HE* he;
9108
7918f24d
NC
9109 PERL_ARGS_ASSERT_CUSTOM_OP_NAME;
9110
53e06cf0 9111 if (!PL_custom_op_names) /* This probably shouldn't happen */
27da23d5 9112 return (char *)PL_op_name[OP_CUSTOM];
53e06cf0
SC
9113
9114 keysv = sv_2mortal(newSViv(index));
9115
9116 he = hv_fetch_ent(PL_custom_op_names, keysv, 0, 0);
9117 if (!he)
27da23d5 9118 return (char *)PL_op_name[OP_CUSTOM]; /* Don't know who you are */
53e06cf0
SC
9119
9120 return SvPV_nolen(HeVAL(he));
9121}
9122
cef6ea9d 9123const char*
1cb0ed9b 9124Perl_custom_op_desc(pTHX_ const OP* o)
53e06cf0 9125{
97aff369 9126 dVAR;
e1ec3a88 9127 const IV index = PTR2IV(o->op_ppaddr);
53e06cf0
SC
9128 SV* keysv;
9129 HE* he;
9130
7918f24d
NC
9131 PERL_ARGS_ASSERT_CUSTOM_OP_DESC;
9132
53e06cf0 9133 if (!PL_custom_op_descs)
27da23d5 9134 return (char *)PL_op_desc[OP_CUSTOM];
53e06cf0
SC
9135
9136 keysv = sv_2mortal(newSViv(index));
9137
9138 he = hv_fetch_ent(PL_custom_op_descs, keysv, 0, 0);
9139 if (!he)
27da23d5 9140 return (char *)PL_op_desc[OP_CUSTOM];
53e06cf0
SC
9141
9142 return SvPV_nolen(HeVAL(he));
9143}
19e8ce8e 9144
beab0874
JT
9145#include "XSUB.h"
9146
9147/* Efficient sub that returns a constant scalar value. */
9148static void
acfe0abc 9149const_sv_xsub(pTHX_ CV* cv)
beab0874 9150{
97aff369 9151 dVAR;
beab0874 9152 dXSARGS;
99ab892b 9153 SV *const sv = MUTABLE_SV(XSANY.any_ptr);
9cbac4c7 9154 if (items != 0) {
6f207bd3 9155 NOOP;
9cbac4c7 9156#if 0
fe13d51d 9157 /* diag_listed_as: SKIPME */
9cbac4c7 9158 Perl_croak(aTHX_ "usage: %s::%s()",
bfcb3514 9159 HvNAME_get(GvSTASH(CvGV(cv))), GvNAME(CvGV(cv)));
9cbac4c7
DM
9160#endif
9161 }
99ab892b
NC
9162 if (!sv) {
9163 XSRETURN(0);
9164 }
9a049f1c 9165 EXTEND(sp, 1);
99ab892b 9166 ST(0) = sv;
beab0874
JT
9167 XSRETURN(1);
9168}
4946a0fa
NC
9169
9170/*
9171 * Local variables:
9172 * c-indentation-style: bsd
9173 * c-basic-offset: 4
9174 * indent-tabs-mode: t
9175 * End:
9176 *
37442d52
RGS
9177 * ex: set ts=8 sts=4 sw=4 noet:
9178 */