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