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