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