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