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