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