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