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