This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
With shared hash key scalars now accessing the hash via the PVX, you
[perl5.git] / op.c
CommitLineData
a0d0e21e 1/* op.c
79072805 2 *
4bb101f2 3 * Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
cbdf9ef8 4 * 2000, 2001, 2002, 2003, 2004, 2005, by Larry Wall and others
79072805
LW
5 *
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
8 *
a0d0e21e
LW
9 */
10
11/*
12 * "You see: Mr. Drogo, he married poor Miss Primula Brandybuck. She was
13 * our Mr. Bilbo's first cousin on the mother's side (her mother being the
14 * youngest of the Old Took's daughters); and Mr. Drogo was his second
15 * cousin. So Mr. Frodo is his first *and* second cousin, once removed
16 * either way, as the saying is, if you follow me." --the Gaffer
79072805
LW
17 */
18
166f8a29
DM
19/* This file contains the functions that create, manipulate and optimize
20 * the OP structures that hold a compiled perl program.
21 *
22 * A Perl program is compiled into a tree of OPs. Each op contains
23 * structural pointers (eg to its siblings and the next op in the
24 * execution sequence), a pointer to the function that would execute the
25 * op, plus any data specific to that op. For example, an OP_CONST op
26 * points to the pp_const() function and to an SV containing the constant
27 * value. When pp_const() is executed, its job is to push that SV onto the
28 * stack.
29 *
30 * OPs are mainly created by the newFOO() functions, which are mainly
31 * called from the parser (in perly.y) as the code is parsed. For example
32 * the Perl code $a + $b * $c would cause the equivalent of the following
33 * to be called (oversimplifying a bit):
34 *
35 * newBINOP(OP_ADD, flags,
36 * newSVREF($a),
37 * newBINOP(OP_MULTIPLY, flags, newSVREF($b), newSVREF($c))
38 * )
39 *
40 * Note that during the build of miniperl, a temporary copy of this file
41 * is made, called opmini.c.
42 */
ccfc67b7 43
61b743bb
DM
44/*
45Perl's compiler is essentially a 3-pass compiler with interleaved phases:
46
47 A bottom-up pass
48 A top-down pass
49 An execution-order pass
50
51The bottom-up pass is represented by all the "newOP" routines and
52the ck_ routines. The bottom-upness is actually driven by yacc.
53So at the point that a ck_ routine fires, we have no idea what the
54context is, either upward in the syntax tree, or either forward or
55backward in the execution order. (The bottom-up parser builds that
56part of the execution order it knows about, but if you follow the "next"
57links around, you'll find it's actually a closed loop through the
58top level node.
59
60Whenever the bottom-up parser gets to a node that supplies context to
61its components, it invokes that portion of the top-down pass that applies
62to that part of the subtree (and marks the top node as processed, so
63if a node further up supplies context, it doesn't have to take the
64plunge again). As a particular subcase of this, as the new node is
65built, it takes all the closed execution loops of its subcomponents
66and links them into a new closed loop for the higher level node. But
67it's still not the real execution order.
68
69The actual execution order is not known till we get a grammar reduction
70to a top-level unit like a subroutine or file that will be called by
71"name" rather than via a "next" pointer. At that point, we can call
72into peep() to do that code's portion of the 3rd pass. It has to be
73recursive, but it's recursive on basic blocks, not on tree nodes.
74*/
75
79072805 76#include "EXTERN.h"
864dbfa3 77#define PERL_IN_OP_C
79072805 78#include "perl.h"
77ca0c92 79#include "keywords.h"
79072805 80
a07e034d 81#define CALL_PEEP(o) CALL_FPTR(PL_peepp)(aTHX_ o)
a2efc822 82
238a4c30
NIS
83#if defined(PL_OP_SLAB_ALLOC)
84
85#ifndef PERL_SLAB_SIZE
86#define PERL_SLAB_SIZE 2048
87#endif
88
c7e45529
AE
89void *
90Perl_Slab_Alloc(pTHX_ int m, size_t sz)
1c846c1f 91{
5a8e194f
NIS
92 /*
93 * To make incrementing use count easy PL_OpSlab is an I32 *
94 * To make inserting the link to slab PL_OpPtr is I32 **
95 * So compute size in units of sizeof(I32 *) as that is how Pl_OpPtr increments
96 * Add an overhead for pointer to slab and round up as a number of pointers
97 */
98 sz = (sz + 2*sizeof(I32 *) -1)/sizeof(I32 *);
238a4c30 99 if ((PL_OpSpace -= sz) < 0) {
083fcd59
JH
100 PL_OpPtr = (I32 **) PerlMemShared_malloc(PERL_SLAB_SIZE*sizeof(I32*));
101 if (!PL_OpPtr) {
238a4c30
NIS
102 return NULL;
103 }
5a8e194f
NIS
104 Zero(PL_OpPtr,PERL_SLAB_SIZE,I32 **);
105 /* We reserve the 0'th I32 sized chunk as a use count */
106 PL_OpSlab = (I32 *) PL_OpPtr;
107 /* Reduce size by the use count word, and by the size we need.
108 * Latter is to mimic the '-=' in the if() above
109 */
110 PL_OpSpace = PERL_SLAB_SIZE - (sizeof(I32)+sizeof(I32 **)-1)/sizeof(I32 **) - sz;
238a4c30
NIS
111 /* Allocation pointer starts at the top.
112 Theory: because we build leaves before trunk allocating at end
113 means that at run time access is cache friendly upward
114 */
5a8e194f 115 PL_OpPtr += PERL_SLAB_SIZE;
238a4c30
NIS
116 }
117 assert( PL_OpSpace >= 0 );
118 /* Move the allocation pointer down */
119 PL_OpPtr -= sz;
5a8e194f 120 assert( PL_OpPtr > (I32 **) PL_OpSlab );
238a4c30
NIS
121 *PL_OpPtr = PL_OpSlab; /* Note which slab it belongs to */
122 (*PL_OpSlab)++; /* Increment use count of slab */
5a8e194f 123 assert( PL_OpPtr+sz <= ((I32 **) PL_OpSlab + PERL_SLAB_SIZE) );
238a4c30
NIS
124 assert( *PL_OpSlab > 0 );
125 return (void *)(PL_OpPtr + 1);
126}
127
c7e45529
AE
128void
129Perl_Slab_Free(pTHX_ void *op)
238a4c30 130{
5a8e194f
NIS
131 I32 **ptr = (I32 **) op;
132 I32 *slab = ptr[-1];
133 assert( ptr-1 > (I32 **) slab );
134 assert( ptr < ( (I32 **) slab + PERL_SLAB_SIZE) );
238a4c30
NIS
135 assert( *slab > 0 );
136 if (--(*slab) == 0) {
7e4e8c89
NC
137# ifdef NETWARE
138# define PerlMemShared PerlMem
139# endif
083fcd59
JH
140
141 PerlMemShared_free(slab);
238a4c30
NIS
142 if (slab == PL_OpSlab) {
143 PL_OpSpace = 0;
144 }
145 }
b7dc083c 146}
b7dc083c 147#endif
e50aee73 148/*
5dc0d613 149 * In the following definition, the ", Nullop" is just to make the compiler
a5f75d66 150 * think the expression is of the right type: croak actually does a Siglongjmp.
e50aee73 151 */
11343788 152#define CHECKOP(type,o) \
3280af22 153 ((PL_op_mask && PL_op_mask[type]) \
5dc0d613 154 ? ( op_free((OP*)o), \
cb77fdf0 155 Perl_croak(aTHX_ "'%s' trapped by operation mask", PL_op_desc[type]), \
28757baa 156 Nullop ) \
fc0dc3b3 157 : CALL_FPTR(PL_check[type])(aTHX_ (OP*)o))
e50aee73 158
e6438c1a 159#define RETURN_UNLIMITED_NUMBER (PERL_INT_MAX / 2)
c53d7c7d 160
8b6b16e7 161STATIC const char*
cea2e8a9 162S_gv_ename(pTHX_ GV *gv)
4633a7c4
LW
163{
164 SV* tmpsv = sv_newmortal();
46fc3d4c 165 gv_efullname3(tmpsv, gv, Nullch);
8b6b16e7 166 return SvPV_nolen_const(tmpsv);
4633a7c4
LW
167}
168
76e3520e 169STATIC OP *
cea2e8a9 170S_no_fh_allowed(pTHX_ OP *o)
79072805 171{
cea2e8a9 172 yyerror(Perl_form(aTHX_ "Missing comma after first argument to %s function",
53e06cf0 173 OP_DESC(o)));
11343788 174 return o;
79072805
LW
175}
176
76e3520e 177STATIC OP *
bfed75c6 178S_too_few_arguments(pTHX_ OP *o, const char *name)
79072805 179{
cea2e8a9 180 yyerror(Perl_form(aTHX_ "Not enough arguments for %s", name));
11343788 181 return o;
79072805
LW
182}
183
76e3520e 184STATIC OP *
bfed75c6 185S_too_many_arguments(pTHX_ OP *o, const char *name)
79072805 186{
cea2e8a9 187 yyerror(Perl_form(aTHX_ "Too many arguments for %s", name));
11343788 188 return o;
79072805
LW
189}
190
76e3520e 191STATIC void
6867be6d 192S_bad_type(pTHX_ I32 n, const char *t, const char *name, const OP *kid)
8990e307 193{
cea2e8a9 194 yyerror(Perl_form(aTHX_ "Type of arg %d to %s must be %s (not %s)",
53e06cf0 195 (int)n, name, t, OP_DESC(kid)));
8990e307
LW
196}
197
7a52d87a 198STATIC void
6867be6d 199S_no_bareword_allowed(pTHX_ const OP *o)
7a52d87a 200{
5a844595 201 qerror(Perl_mess(aTHX_
35c1215d
NC
202 "Bareword \"%"SVf"\" not allowed while \"strict subs\" in use",
203 cSVOPo_sv));
7a52d87a
GS
204}
205
79072805
LW
206/* "register" allocation */
207
208PADOFFSET
dd2155a4 209Perl_allocmy(pTHX_ char *name)
93a17b20 210{
a0d0e21e 211 PADOFFSET off;
a0d0e21e 212
59f00321 213 /* complain about "my $<special_var>" etc etc */
155aba94
GS
214 if (!(PL_in_my == KEY_our ||
215 isALPHA(name[1]) ||
39e02b42 216 (USE_UTF8_IN_NAMES && UTF8_IS_START(name[1])) ||
59f00321 217 (name[1] == '_' && (*name == '$' || (int)strlen(name) > 2))))
834a4ddd 218 {
c4d0567e 219 if (!isPRINT(name[1]) || strchr("\t\n\r\f", name[1])) {
2b92dfce
GS
220 /* 1999-02-27 mjd@plover.com */
221 char *p;
222 p = strchr(name, '\0');
223 /* The next block assumes the buffer is at least 205 chars
224 long. At present, it's always at least 256 chars. */
225 if (p-name > 200) {
226 strcpy(name+200, "...");
227 p = name+199;
228 }
229 else {
230 p[1] = '\0';
231 }
232 /* Move everything else down one character */
233 for (; p-name > 2; p--)
234 *p = *(p-1);
46fc3d4c
PP
235 name[2] = toCTRL(name[1]);
236 name[1] = '^';
237 }
cea2e8a9 238 yyerror(Perl_form(aTHX_ "Can't use global %s in \"my\"",name));
a0d0e21e 239 }
748a9306 240
dd2155a4
DM
241 /* check for duplicate declaration */
242 pad_check_dup(name,
c5661c80 243 (bool)(PL_in_my == KEY_our),
dd2155a4
DM
244 (PL_curstash ? PL_curstash : PL_defstash)
245 );
33b8ce05 246
dd2155a4
DM
247 if (PL_in_my_stash && *name != '$') {
248 yyerror(Perl_form(aTHX_
249 "Can't declare class for non-scalar %s in \"%s\"",
250 name, PL_in_my == KEY_our ? "our" : "my"));
6b35e009
GS
251 }
252
dd2155a4 253 /* allocate a spare slot and store the name in that slot */
93a17b20 254
dd2155a4
DM
255 off = pad_add_name(name,
256 PL_in_my_stash,
257 (PL_in_my == KEY_our
133706a6
RGS
258 /* $_ is always in main::, even with our */
259 ? (PL_curstash && !strEQ(name,"$_") ? PL_curstash : PL_defstash)
dd2155a4
DM
260 : Nullhv
261 ),
262 0 /* not fake */
263 );
264 return off;
79072805
LW
265}
266
79072805
LW
267/* Destructor */
268
269void
864dbfa3 270Perl_op_free(pTHX_ OP *o)
79072805 271{
27da23d5 272 dVAR;
acb36ea4 273 OPCODE type;
4026c95a 274 PADOFFSET refcnt;
79072805 275
2814eb74 276 if (!o || o->op_static)
79072805
LW
277 return;
278
7934575e
GS
279 if (o->op_private & OPpREFCOUNTED) {
280 switch (o->op_type) {
281 case OP_LEAVESUB:
282 case OP_LEAVESUBLV:
283 case OP_LEAVEEVAL:
284 case OP_LEAVE:
285 case OP_SCOPE:
286 case OP_LEAVEWRITE:
287 OP_REFCNT_LOCK;
4026c95a 288 refcnt = OpREFCNT_dec(o);
7934575e 289 OP_REFCNT_UNLOCK;
4026c95a
SH
290 if (refcnt)
291 return;
7934575e
GS
292 break;
293 default:
294 break;
295 }
296 }
297
11343788 298 if (o->op_flags & OPf_KIDS) {
6867be6d 299 register OP *kid, *nextkid;
11343788 300 for (kid = cUNOPo->op_first; kid; kid = nextkid) {
85e6fe83 301 nextkid = kid->op_sibling; /* Get before next freeing kid */
79072805 302 op_free(kid);
85e6fe83 303 }
79072805 304 }
acb36ea4
GS
305 type = o->op_type;
306 if (type == OP_NULL)
eb160463 307 type = (OPCODE)o->op_targ;
acb36ea4
GS
308
309 /* COP* is not cleared by op_clear() so that we may track line
310 * numbers etc even after null() */
311 if (type == OP_NEXTSTATE || type == OP_SETSTATE || type == OP_DBSTATE)
312 cop_free((COP*)o);
313
314 op_clear(o);
238a4c30 315 FreeOp(o);
4d494880
DM
316#ifdef DEBUG_LEAKING_SCALARS
317 if (PL_op == o)
318 PL_op = Nullop;
319#endif
acb36ea4 320}
79072805 321
93c66552
DM
322void
323Perl_op_clear(pTHX_ OP *o)
acb36ea4 324{
13137afc 325
27da23d5 326 dVAR;
11343788 327 switch (o->op_type) {
acb36ea4
GS
328 case OP_NULL: /* Was holding old type, if any. */
329 case OP_ENTEREVAL: /* Was holding hints. */
acb36ea4 330 o->op_targ = 0;
a0d0e21e 331 break;
a6006777 332 default:
ac4c12e7 333 if (!(o->op_flags & OPf_REF)
0b94c7bb 334 || (PL_check[o->op_type] != MEMBER_TO_FPTR(Perl_ck_ftst)))
a6006777
PP
335 break;
336 /* FALL THROUGH */
463ee0b2 337 case OP_GVSV:
79072805 338 case OP_GV:
a6006777 339 case OP_AELEMFAST:
6a077020
DM
340 if (! (o->op_type == OP_AELEMFAST && o->op_flags & OPf_SPECIAL)) {
341 /* not an OP_PADAV replacement */
350de78d 342#ifdef USE_ITHREADS
6a077020
DM
343 if (cPADOPo->op_padix > 0) {
344 /* No GvIN_PAD_off(cGVOPo_gv) here, because other references
345 * may still exist on the pad */
346 pad_swipe(cPADOPo->op_padix, TRUE);
347 cPADOPo->op_padix = 0;
348 }
350de78d 349#else
6a077020
DM
350 SvREFCNT_dec(cSVOPo->op_sv);
351 cSVOPo->op_sv = Nullsv;
350de78d 352#endif
6a077020 353 }
79072805 354 break;
a1ae71d2 355 case OP_METHOD_NAMED:
79072805 356 case OP_CONST:
11343788 357 SvREFCNT_dec(cSVOPo->op_sv);
acb36ea4 358 cSVOPo->op_sv = Nullsv;
3b1c21fa
AB
359#ifdef USE_ITHREADS
360 /** Bug #15654
361 Even if op_clear does a pad_free for the target of the op,
6a077020 362 pad_free doesn't actually remove the sv that exists in the pad;
3b1c21fa
AB
363 instead it lives on. This results in that it could be reused as
364 a target later on when the pad was reallocated.
365 **/
366 if(o->op_targ) {
367 pad_swipe(o->op_targ,1);
368 o->op_targ = 0;
369 }
370#endif
79072805 371 break;
748a9306
LW
372 case OP_GOTO:
373 case OP_NEXT:
374 case OP_LAST:
375 case OP_REDO:
11343788 376 if (o->op_flags & (OPf_SPECIAL|OPf_STACKED|OPf_KIDS))
748a9306
LW
377 break;
378 /* FALL THROUGH */
a0d0e21e 379 case OP_TRANS:
acb36ea4 380 if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
a0ed51b3 381 SvREFCNT_dec(cSVOPo->op_sv);
acb36ea4
GS
382 cSVOPo->op_sv = Nullsv;
383 }
384 else {
a0ed51b3 385 Safefree(cPVOPo->op_pv);
acb36ea4
GS
386 cPVOPo->op_pv = Nullch;
387 }
a0d0e21e
LW
388 break;
389 case OP_SUBST:
11343788 390 op_free(cPMOPo->op_pmreplroot);
971a9dd3 391 goto clear_pmop;
748a9306 392 case OP_PUSHRE:
971a9dd3 393#ifdef USE_ITHREADS
ba89bb6e 394 if (INT2PTR(PADOFFSET, cPMOPo->op_pmreplroot)) {
dd2155a4
DM
395 /* No GvIN_PAD_off here, because other references may still
396 * exist on the pad */
397 pad_swipe(INT2PTR(PADOFFSET, cPMOPo->op_pmreplroot), TRUE);
971a9dd3
GS
398 }
399#else
400 SvREFCNT_dec((SV*)cPMOPo->op_pmreplroot);
401#endif
402 /* FALL THROUGH */
a0d0e21e 403 case OP_MATCH:
8782bef2 404 case OP_QR:
971a9dd3 405clear_pmop:
cb55de95
JH
406 {
407 HV *pmstash = PmopSTASH(cPMOPo);
408 if (pmstash && SvREFCNT(pmstash)) {
8d2f4536
NC
409 MAGIC *mg = mg_find((SV*)pmstash, PERL_MAGIC_symtab);
410 if (mg) {
411 PMOP *pmop = (PMOP*) mg->mg_obj;
412 PMOP *lastpmop = NULL;
413 while (pmop) {
414 if (cPMOPo == pmop) {
415 if (lastpmop)
416 lastpmop->op_pmnext = pmop->op_pmnext;
417 else
418 mg->mg_obj = (SV*) pmop->op_pmnext;
419 break;
420 }
421 lastpmop = pmop;
422 pmop = pmop->op_pmnext;
cb55de95 423 }
cb55de95 424 }
83da49e6 425 }
05ec9bb3 426 PmopSTASH_free(cPMOPo);
cb55de95 427 }
971a9dd3 428 cPMOPo->op_pmreplroot = Nullop;
5f8cb046
DM
429 /* we use the "SAFE" version of the PM_ macros here
430 * since sv_clean_all might release some PMOPs
431 * after PL_regex_padav has been cleared
432 * and the clearing of PL_regex_padav needs to
433 * happen before sv_clean_all
434 */
435 ReREFCNT_dec(PM_GETRE_SAFE(cPMOPo));
436 PM_SETRE_SAFE(cPMOPo, (REGEXP*)NULL);
13137afc
AB
437#ifdef USE_ITHREADS
438 if(PL_regex_pad) { /* We could be in destruction */
439 av_push((AV*) PL_regex_pad[0],(SV*) PL_regex_pad[(cPMOPo)->op_pmoffset]);
1cc8b4c5 440 SvREPADTMP_on(PL_regex_pad[(cPMOPo)->op_pmoffset]);
13137afc
AB
441 PM_SETRE(cPMOPo, (cPMOPo)->op_pmoffset);
442 }
1eb1540c 443#endif
13137afc 444
a0d0e21e 445 break;
79072805
LW
446 }
447
743e66e6 448 if (o->op_targ > 0) {
11343788 449 pad_free(o->op_targ);
743e66e6
GS
450 o->op_targ = 0;
451 }
79072805
LW
452}
453
76e3520e 454STATIC void
3eb57f73
HS
455S_cop_free(pTHX_ COP* cop)
456{
05ec9bb3
NIS
457 Safefree(cop->cop_label); /* FIXME: treaddead ??? */
458 CopFILE_free(cop);
459 CopSTASH_free(cop);
0453d815 460 if (! specialWARN(cop->cop_warnings))
3eb57f73 461 SvREFCNT_dec(cop->cop_warnings);
05ec9bb3
NIS
462 if (! specialCopIO(cop->cop_io)) {
463#ifdef USE_ITHREADS
042f6df8 464#if 0
05ec9bb3
NIS
465 STRLEN len;
466 char *s = SvPV(cop->cop_io,len);
b178108d
JH
467 Perl_warn(aTHX_ "io='%.*s'",(int) len,s); /* ??? --jhi */
468#endif
05ec9bb3 469#else
ac27b0f5 470 SvREFCNT_dec(cop->cop_io);
05ec9bb3
NIS
471#endif
472 }
3eb57f73
HS
473}
474
93c66552
DM
475void
476Perl_op_null(pTHX_ OP *o)
8990e307 477{
27da23d5 478 dVAR;
acb36ea4
GS
479 if (o->op_type == OP_NULL)
480 return;
481 op_clear(o);
11343788
MB
482 o->op_targ = o->op_type;
483 o->op_type = OP_NULL;
22c35a8c 484 o->op_ppaddr = PL_ppaddr[OP_NULL];
8990e307
LW
485}
486
4026c95a
SH
487void
488Perl_op_refcnt_lock(pTHX)
489{
27da23d5 490 dVAR;
4026c95a
SH
491 OP_REFCNT_LOCK;
492}
493
494void
495Perl_op_refcnt_unlock(pTHX)
496{
27da23d5 497 dVAR;
4026c95a
SH
498 OP_REFCNT_UNLOCK;
499}
500
79072805
LW
501/* Contextualizers */
502
463ee0b2 503#define LINKLIST(o) ((o)->op_next ? (o)->op_next : linklist((OP*)o))
79072805
LW
504
505OP *
864dbfa3 506Perl_linklist(pTHX_ OP *o)
79072805 507{
79072805 508
11343788
MB
509 if (o->op_next)
510 return o->op_next;
79072805
LW
511
512 /* establish postfix order */
11343788 513 if (cUNOPo->op_first) {
6867be6d 514 register OP *kid;
11343788
MB
515 o->op_next = LINKLIST(cUNOPo->op_first);
516 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling) {
79072805
LW
517 if (kid->op_sibling)
518 kid->op_next = LINKLIST(kid->op_sibling);
519 else
11343788 520 kid->op_next = o;
79072805
LW
521 }
522 }
523 else
11343788 524 o->op_next = o;
79072805 525
11343788 526 return o->op_next;
79072805
LW
527}
528
529OP *
864dbfa3 530Perl_scalarkids(pTHX_ OP *o)
79072805 531{
11343788 532 if (o && o->op_flags & OPf_KIDS) {
bfed75c6 533 OP *kid;
11343788 534 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
535 scalar(kid);
536 }
11343788 537 return o;
79072805
LW
538}
539
76e3520e 540STATIC OP *
cea2e8a9 541S_scalarboolean(pTHX_ OP *o)
8990e307 542{
d008e5eb 543 if (o->op_type == OP_SASSIGN && cBINOPo->op_first->op_type == OP_CONST) {
d008e5eb 544 if (ckWARN(WARN_SYNTAX)) {
6867be6d 545 const line_t oldline = CopLINE(PL_curcop);
a0d0e21e 546
d008e5eb 547 if (PL_copline != NOLINE)
57843af0 548 CopLINE_set(PL_curcop, PL_copline);
9014280d 549 Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Found = in conditional, should be ==");
57843af0 550 CopLINE_set(PL_curcop, oldline);
d008e5eb 551 }
a0d0e21e 552 }
11343788 553 return scalar(o);
8990e307
LW
554}
555
556OP *
864dbfa3 557Perl_scalar(pTHX_ OP *o)
79072805 558{
27da23d5 559 dVAR;
79072805
LW
560 OP *kid;
561
a0d0e21e 562 /* assumes no premature commitment */
3280af22 563 if (!o || (o->op_flags & OPf_WANT) || PL_error_count
5dc0d613 564 || o->op_type == OP_RETURN)
7e363e51 565 {
11343788 566 return o;
7e363e51 567 }
79072805 568
5dc0d613 569 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_SCALAR;
79072805 570
11343788 571 switch (o->op_type) {
79072805 572 case OP_REPEAT:
11343788 573 scalar(cBINOPo->op_first);
8990e307 574 break;
79072805
LW
575 case OP_OR:
576 case OP_AND:
577 case OP_COND_EXPR:
11343788 578 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
8990e307 579 scalar(kid);
79072805 580 break;
a0d0e21e 581 case OP_SPLIT:
11343788 582 if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
a0d0e21e 583 if (!kPMOP->op_pmreplroot)
12bcd1a6 584 deprecate_old("implicit split to @_");
a0d0e21e
LW
585 }
586 /* FALL THROUGH */
79072805 587 case OP_MATCH:
8782bef2 588 case OP_QR:
79072805
LW
589 case OP_SUBST:
590 case OP_NULL:
8990e307 591 default:
11343788
MB
592 if (o->op_flags & OPf_KIDS) {
593 for (kid = cUNOPo->op_first; kid; kid = kid->op_sibling)
8990e307
LW
594 scalar(kid);
595 }
79072805
LW
596 break;
597 case OP_LEAVE:
598 case OP_LEAVETRY:
5dc0d613 599 kid = cLISTOPo->op_first;
54310121 600 scalar(kid);
155aba94 601 while ((kid = kid->op_sibling)) {
54310121
PP
602 if (kid->op_sibling)
603 scalarvoid(kid);
604 else
605 scalar(kid);
606 }
3280af22 607 WITH_THR(PL_curcop = &PL_compiling);
54310121 608 break;
748a9306 609 case OP_SCOPE:
79072805 610 case OP_LINESEQ:
8990e307 611 case OP_LIST:
11343788 612 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
79072805
LW
613 if (kid->op_sibling)
614 scalarvoid(kid);
615 else
616 scalar(kid);
617 }
3280af22 618 WITH_THR(PL_curcop = &PL_compiling);
79072805 619 break;
a801c63c
RGS
620 case OP_SORT:
621 if (ckWARN(WARN_VOID))
9014280d 622 Perl_warner(aTHX_ packWARN(WARN_VOID), "Useless use of sort in scalar context");
79072805 623 }
11343788 624 return o;
79072805
LW
625}
626
627OP *
864dbfa3 628Perl_scalarvoid(pTHX_ OP *o)
79072805 629{
27da23d5 630 dVAR;
79072805 631 OP *kid;
e1ec3a88 632 const char* useless = 0;
8990e307 633 SV* sv;
2ebea0a1
GS
634 U8 want;
635
acb36ea4
GS
636 if (o->op_type == OP_NEXTSTATE
637 || o->op_type == OP_SETSTATE
638 || o->op_type == OP_DBSTATE
639 || (o->op_type == OP_NULL && (o->op_targ == OP_NEXTSTATE
640 || o->op_targ == OP_SETSTATE
641 || o->op_targ == OP_DBSTATE)))
2ebea0a1 642 PL_curcop = (COP*)o; /* for warning below */
79072805 643
54310121 644 /* assumes no premature commitment */
2ebea0a1
GS
645 want = o->op_flags & OPf_WANT;
646 if ((want && want != OPf_WANT_SCALAR) || PL_error_count
5dc0d613 647 || o->op_type == OP_RETURN)
7e363e51 648 {
11343788 649 return o;
7e363e51 650 }
79072805 651
b162f9ea 652 if ((o->op_private & OPpTARGET_MY)
7e363e51
GS
653 && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
654 {
b162f9ea 655 return scalar(o); /* As if inside SASSIGN */
7e363e51 656 }
1c846c1f 657
5dc0d613 658 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_VOID;
79072805 659
11343788 660 switch (o->op_type) {
79072805 661 default:
22c35a8c 662 if (!(PL_opargs[o->op_type] & OA_FOLDCONST))
8990e307 663 break;
36477c24
PP
664 /* FALL THROUGH */
665 case OP_REPEAT:
11343788 666 if (o->op_flags & OPf_STACKED)
8990e307 667 break;
5d82c453
GA
668 goto func_ops;
669 case OP_SUBSTR:
670 if (o->op_private == 4)
671 break;
8990e307
LW
672 /* FALL THROUGH */
673 case OP_GVSV:
674 case OP_WANTARRAY:
675 case OP_GV:
676 case OP_PADSV:
677 case OP_PADAV:
678 case OP_PADHV:
679 case OP_PADANY:
680 case OP_AV2ARYLEN:
8990e307 681 case OP_REF:
a0d0e21e
LW
682 case OP_REFGEN:
683 case OP_SREFGEN:
8990e307
LW
684 case OP_DEFINED:
685 case OP_HEX:
686 case OP_OCT:
687 case OP_LENGTH:
8990e307
LW
688 case OP_VEC:
689 case OP_INDEX:
690 case OP_RINDEX:
691 case OP_SPRINTF:
692 case OP_AELEM:
693 case OP_AELEMFAST:
694 case OP_ASLICE:
8990e307
LW
695 case OP_HELEM:
696 case OP_HSLICE:
697 case OP_UNPACK:
698 case OP_PACK:
8990e307
LW
699 case OP_JOIN:
700 case OP_LSLICE:
701 case OP_ANONLIST:
702 case OP_ANONHASH:
703 case OP_SORT:
704 case OP_REVERSE:
705 case OP_RANGE:
706 case OP_FLIP:
707 case OP_FLOP:
708 case OP_CALLER:
709 case OP_FILENO:
710 case OP_EOF:
711 case OP_TELL:
712 case OP_GETSOCKNAME:
713 case OP_GETPEERNAME:
714 case OP_READLINK:
715 case OP_TELLDIR:
716 case OP_GETPPID:
717 case OP_GETPGRP:
718 case OP_GETPRIORITY:
719 case OP_TIME:
720 case OP_TMS:
721 case OP_LOCALTIME:
722 case OP_GMTIME:
723 case OP_GHBYNAME:
724 case OP_GHBYADDR:
725 case OP_GHOSTENT:
726 case OP_GNBYNAME:
727 case OP_GNBYADDR:
728 case OP_GNETENT:
729 case OP_GPBYNAME:
730 case OP_GPBYNUMBER:
731 case OP_GPROTOENT:
732 case OP_GSBYNAME:
733 case OP_GSBYPORT:
734 case OP_GSERVENT:
735 case OP_GPWNAM:
736 case OP_GPWUID:
737 case OP_GGRNAM:
738 case OP_GGRGID:
739 case OP_GETLOGIN:
78e1b766 740 case OP_PROTOTYPE:
5d82c453 741 func_ops:
64aac5a9 742 if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)))
53e06cf0 743 useless = OP_DESC(o);
8990e307
LW
744 break;
745
9f82cd5f
YST
746 case OP_NOT:
747 kid = cUNOPo->op_first;
748 if (kid->op_type != OP_MATCH && kid->op_type != OP_SUBST &&
749 kid->op_type != OP_TRANS) {
750 goto func_ops;
751 }
752 useless = "negative pattern binding (!~)";
753 break;
754
8990e307
LW
755 case OP_RV2GV:
756 case OP_RV2SV:
757 case OP_RV2AV:
758 case OP_RV2HV:
192587c2 759 if (!(o->op_private & (OPpLVAL_INTRO|OPpOUR_INTRO)) &&
11343788 760 (!o->op_sibling || o->op_sibling->op_type != OP_READLINE))
8990e307
LW
761 useless = "a variable";
762 break;
79072805
LW
763
764 case OP_CONST:
7766f137 765 sv = cSVOPo_sv;
7a52d87a
GS
766 if (cSVOPo->op_private & OPpCONST_STRICT)
767 no_bareword_allowed(o);
768 else {
d008e5eb
GS
769 if (ckWARN(WARN_VOID)) {
770 useless = "a constant";
e7fec78e 771 /* don't warn on optimised away booleans, eg
b5a930ec 772 * use constant Foo, 5; Foo || print; */
e7fec78e
DM
773 if (cSVOPo->op_private & OPpCONST_SHORTCIRCUIT)
774 useless = 0;
960b4253
MG
775 /* the constants 0 and 1 are permitted as they are
776 conventionally used as dummies in constructs like
777 1 while some_condition_with_side_effects; */
e7fec78e 778 else if (SvNIOK(sv) && (SvNV(sv) == 0.0 || SvNV(sv) == 1.0))
d008e5eb
GS
779 useless = 0;
780 else if (SvPOK(sv)) {
a52fe3ac
A
781 /* perl4's way of mixing documentation and code
782 (before the invention of POD) was based on a
783 trick to mix nroff and perl code. The trick was
784 built upon these three nroff macros being used in
785 void context. The pink camel has the details in
786 the script wrapman near page 319. */
b15aece3
SP
787 if (strnEQ(SvPVX_const(sv), "di", 2) ||
788 strnEQ(SvPVX_const(sv), "ds", 2) ||
789 strnEQ(SvPVX_const(sv), "ig", 2))
d008e5eb
GS
790 useless = 0;
791 }
8990e307
LW
792 }
793 }
93c66552 794 op_null(o); /* don't execute or even remember it */
79072805
LW
795 break;
796
797 case OP_POSTINC:
11343788 798 o->op_type = OP_PREINC; /* pre-increment is faster */
22c35a8c 799 o->op_ppaddr = PL_ppaddr[OP_PREINC];
79072805
LW
800 break;
801
802 case OP_POSTDEC:
11343788 803 o->op_type = OP_PREDEC; /* pre-decrement is faster */
22c35a8c 804 o->op_ppaddr = PL_ppaddr[OP_PREDEC];
79072805
LW
805 break;
806
79072805
LW
807 case OP_OR:
808 case OP_AND:
c963b151 809 case OP_DOR:
79072805 810 case OP_COND_EXPR:
11343788 811 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
79072805
LW
812 scalarvoid(kid);
813 break;
5aabfad6 814
a0d0e21e 815 case OP_NULL:
11343788 816 if (o->op_flags & OPf_STACKED)
a0d0e21e 817 break;
5aabfad6 818 /* FALL THROUGH */
2ebea0a1
GS
819 case OP_NEXTSTATE:
820 case OP_DBSTATE:
79072805
LW
821 case OP_ENTERTRY:
822 case OP_ENTER:
11343788 823 if (!(o->op_flags & OPf_KIDS))
79072805 824 break;
54310121 825 /* FALL THROUGH */
463ee0b2 826 case OP_SCOPE:
79072805
LW
827 case OP_LEAVE:
828 case OP_LEAVETRY:
a0d0e21e 829 case OP_LEAVELOOP:
79072805 830 case OP_LINESEQ:
79072805 831 case OP_LIST:
11343788 832 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
833 scalarvoid(kid);
834 break;
c90c0ff4 835 case OP_ENTEREVAL:
5196be3e 836 scalarkids(o);
c90c0ff4 837 break;
5aabfad6 838 case OP_REQUIRE:
c90c0ff4 839 /* all requires must return a boolean value */
5196be3e 840 o->op_flags &= ~OPf_WANT;
d6483035
GS
841 /* FALL THROUGH */
842 case OP_SCALAR:
5196be3e 843 return scalar(o);
a0d0e21e 844 case OP_SPLIT:
11343788 845 if ((kid = cLISTOPo->op_first) && kid->op_type == OP_PUSHRE) {
a0d0e21e 846 if (!kPMOP->op_pmreplroot)
12bcd1a6 847 deprecate_old("implicit split to @_");
a0d0e21e
LW
848 }
849 break;
79072805 850 }
411caa50 851 if (useless && ckWARN(WARN_VOID))
9014280d 852 Perl_warner(aTHX_ packWARN(WARN_VOID), "Useless use of %s in void context", useless);
11343788 853 return o;
79072805
LW
854}
855
856OP *
864dbfa3 857Perl_listkids(pTHX_ OP *o)
79072805 858{
11343788 859 if (o && o->op_flags & OPf_KIDS) {
6867be6d 860 OP *kid;
11343788 861 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
79072805
LW
862 list(kid);
863 }
11343788 864 return o;
79072805
LW
865}
866
867OP *
864dbfa3 868Perl_list(pTHX_ OP *o)
79072805 869{
27da23d5 870 dVAR;
79072805
LW
871 OP *kid;
872
a0d0e21e 873 /* assumes no premature commitment */
3280af22 874 if (!o || (o->op_flags & OPf_WANT) || PL_error_count
5dc0d613 875 || o->op_type == OP_RETURN)
7e363e51 876 {
11343788 877 return o;
7e363e51 878 }
79072805 879
b162f9ea 880 if ((o->op_private & OPpTARGET_MY)
7e363e51
GS
881 && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
882 {
b162f9ea 883 return o; /* As if inside SASSIGN */
7e363e51 884 }
1c846c1f 885
5dc0d613 886 o->op_flags = (o->op_flags & ~OPf_WANT) | OPf_WANT_LIST;
79072805 887
11343788 888 switch (o->op_type) {
79072805
LW
889 case OP_FLOP:
890 case OP_REPEAT:
11343788 891 list(cBINOPo->op_first);
79072805
LW
892 break;
893 case OP_OR:
894 case OP_AND:
895 case OP_COND_EXPR:
11343788 896 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
79072805
LW
897 list(kid);
898 break;
899 default:
900 case OP_MATCH:
8782bef2 901 case OP_QR:
79072805
LW
902 case OP_SUBST:
903 case OP_NULL:
11343788 904 if (!(o->op_flags & OPf_KIDS))
79072805 905 break;
11343788
MB
906 if (!o->op_next && cUNOPo->op_first->op_type == OP_FLOP) {
907 list(cBINOPo->op_first);
908 return gen_constant_list(o);
79072805
LW
909 }
910 case OP_LIST:
11343788 911 listkids(o);
79072805
LW
912 break;
913 case OP_LEAVE:
914 case OP_LEAVETRY:
5dc0d613 915 kid = cLISTOPo->op_first;
54310121 916 list(kid);
155aba94 917 while ((kid = kid->op_sibling)) {
54310121
PP
918 if (kid->op_sibling)
919 scalarvoid(kid);
920 else
921 list(kid);
922 }
3280af22 923 WITH_THR(PL_curcop = &PL_compiling);
54310121 924 break;
748a9306 925 case OP_SCOPE:
79072805 926 case OP_LINESEQ:
11343788 927 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
79072805
LW
928 if (kid->op_sibling)
929 scalarvoid(kid);
930 else
931 list(kid);
932 }
3280af22 933 WITH_THR(PL_curcop = &PL_compiling);
79072805 934 break;
c90c0ff4
PP
935 case OP_REQUIRE:
936 /* all requires must return a boolean value */
5196be3e
MB
937 o->op_flags &= ~OPf_WANT;
938 return scalar(o);
79072805 939 }
11343788 940 return o;
79072805
LW
941}
942
943OP *
864dbfa3 944Perl_scalarseq(pTHX_ OP *o)
79072805 945{
11343788
MB
946 if (o) {
947 if (o->op_type == OP_LINESEQ ||
948 o->op_type == OP_SCOPE ||
949 o->op_type == OP_LEAVE ||
950 o->op_type == OP_LEAVETRY)
463ee0b2 951 {
6867be6d 952 OP *kid;
11343788 953 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling) {
ed6116ce 954 if (kid->op_sibling) {
463ee0b2 955 scalarvoid(kid);
ed6116ce 956 }
463ee0b2 957 }
3280af22 958 PL_curcop = &PL_compiling;
79072805 959 }
11343788 960 o->op_flags &= ~OPf_PARENS;
3280af22 961 if (PL_hints & HINT_BLOCK_SCOPE)
11343788 962 o->op_flags |= OPf_PARENS;
79072805 963 }
8990e307 964 else
11343788
MB
965 o = newOP(OP_STUB, 0);
966 return o;
79072805
LW
967}
968
76e3520e 969STATIC OP *
cea2e8a9 970S_modkids(pTHX_ OP *o, I32 type)
79072805 971{
11343788 972 if (o && o->op_flags & OPf_KIDS) {
6867be6d 973 OP *kid;
11343788 974 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2 975 mod(kid, type);
79072805 976 }
11343788 977 return o;
79072805
LW
978}
979
ddeae0f1
DM
980/* Propagate lvalue ("modifiable") context to an op and it's children.
981 * 'type' represents the context type, roughly based on the type of op that
982 * would do the modifying, although local() is represented by OP_NULL.
983 * It's responsible for detecting things that can't be modified, flag
984 * things that need to behave specially in an lvalue context (e.g., "$$x = 5"
985 * might have to vivify a reference in $x), and so on.
986 *
987 * For example, "$a+1 = 2" would cause mod() to be called with o being
988 * OP_ADD and type being OP_SASSIGN, and would output an error.
989 */
990
79072805 991OP *
864dbfa3 992Perl_mod(pTHX_ OP *o, I32 type)
79072805 993{
27da23d5 994 dVAR;
79072805 995 OP *kid;
ddeae0f1
DM
996 /* -1 = error on localize, 0 = ignore localize, 1 = ok to localize */
997 int localize = -1;
79072805 998
3280af22 999 if (!o || PL_error_count)
11343788 1000 return o;
79072805 1001
b162f9ea 1002 if ((o->op_private & OPpTARGET_MY)
7e363e51
GS
1003 && (PL_opargs[o->op_type] & OA_TARGLEX))/* OPp share the meaning */
1004 {
b162f9ea 1005 return o;
7e363e51 1006 }
1c846c1f 1007
11343788 1008 switch (o->op_type) {
68dc0745 1009 case OP_UNDEF:
ddeae0f1 1010 localize = 0;
3280af22 1011 PL_modcount++;
5dc0d613 1012 return o;
a0d0e21e 1013 case OP_CONST:
11343788 1014 if (!(o->op_private & (OPpCONST_ARYBASE)))
a0d0e21e 1015 goto nomod;
3280af22 1016 if (PL_eval_start && PL_eval_start->op_type == OP_CONST) {
7766f137 1017 PL_compiling.cop_arybase = (I32)SvIV(cSVOPx(PL_eval_start)->op_sv);
3280af22 1018 PL_eval_start = 0;
a0d0e21e
LW
1019 }
1020 else if (!type) {
3280af22
NIS
1021 SAVEI32(PL_compiling.cop_arybase);
1022 PL_compiling.cop_arybase = 0;
a0d0e21e
LW
1023 }
1024 else if (type == OP_REFGEN)
1025 goto nomod;
1026 else
cea2e8a9 1027 Perl_croak(aTHX_ "That use of $[ is unsupported");
a0d0e21e 1028 break;
5f05dabc 1029 case OP_STUB:
5196be3e 1030 if (o->op_flags & OPf_PARENS)
5f05dabc
PP
1031 break;
1032 goto nomod;
a0d0e21e
LW
1033 case OP_ENTERSUB:
1034 if ((type == OP_UNDEF || type == OP_REFGEN) &&
11343788
MB
1035 !(o->op_flags & OPf_STACKED)) {
1036 o->op_type = OP_RV2CV; /* entersub => rv2cv */
22c35a8c 1037 o->op_ppaddr = PL_ppaddr[OP_RV2CV];
11343788 1038 assert(cUNOPo->op_first->op_type == OP_NULL);
93c66552 1039 op_null(((LISTOP*)cUNOPo->op_first)->op_first);/* disable pushmark */
79072805
LW
1040 break;
1041 }
95f0a2f1
SB
1042 else if (o->op_private & OPpENTERSUB_NOMOD)
1043 return o;
cd06dffe
GS
1044 else { /* lvalue subroutine call */
1045 o->op_private |= OPpLVAL_INTRO;
e6438c1a 1046 PL_modcount = RETURN_UNLIMITED_NUMBER;
4978d6d9 1047 if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN) {
cd06dffe
GS
1048 /* Backward compatibility mode: */
1049 o->op_private |= OPpENTERSUB_INARGS;
1050 break;
1051 }
1052 else { /* Compile-time error message: */
1053 OP *kid = cUNOPo->op_first;
1054 CV *cv;
1055 OP *okid;
1056
1057 if (kid->op_type == OP_PUSHMARK)
1058 goto skip_kids;
1059 if (kid->op_type != OP_NULL || kid->op_targ != OP_LIST)
1060 Perl_croak(aTHX_
1061 "panic: unexpected lvalue entersub "
55140b79 1062 "args: type/targ %ld:%"UVuf,
3d811634 1063 (long)kid->op_type, (UV)kid->op_targ);
cd06dffe
GS
1064 kid = kLISTOP->op_first;
1065 skip_kids:
1066 while (kid->op_sibling)
1067 kid = kid->op_sibling;
1068 if (!(kid->op_type == OP_NULL && kid->op_targ == OP_RV2CV)) {
1069 /* Indirect call */
1070 if (kid->op_type == OP_METHOD_NAMED
1071 || kid->op_type == OP_METHOD)
1072 {
87d7fd28 1073 UNOP *newop;
b2ffa427 1074
87d7fd28 1075 NewOp(1101, newop, 1, UNOP);
349fd7b7
GS
1076 newop->op_type = OP_RV2CV;
1077 newop->op_ppaddr = PL_ppaddr[OP_RV2CV];
87d7fd28
GS
1078 newop->op_first = Nullop;
1079 newop->op_next = (OP*)newop;
1080 kid->op_sibling = (OP*)newop;
349fd7b7 1081 newop->op_private |= OPpLVAL_INTRO;
cd06dffe
GS
1082 break;
1083 }
b2ffa427 1084
cd06dffe
GS
1085 if (kid->op_type != OP_RV2CV)
1086 Perl_croak(aTHX_
1087 "panic: unexpected lvalue entersub "
55140b79 1088 "entry via type/targ %ld:%"UVuf,
3d811634 1089 (long)kid->op_type, (UV)kid->op_targ);
cd06dffe
GS
1090 kid->op_private |= OPpLVAL_INTRO;
1091 break; /* Postpone until runtime */
1092 }
b2ffa427
NIS
1093
1094 okid = kid;
cd06dffe
GS
1095 kid = kUNOP->op_first;
1096 if (kid->op_type == OP_NULL && kid->op_targ == OP_RV2SV)
1097 kid = kUNOP->op_first;
b2ffa427 1098 if (kid->op_type == OP_NULL)
cd06dffe
GS
1099 Perl_croak(aTHX_
1100 "Unexpected constant lvalue entersub "
55140b79 1101 "entry via type/targ %ld:%"UVuf,
3d811634 1102 (long)kid->op_type, (UV)kid->op_targ);
cd06dffe
GS
1103 if (kid->op_type != OP_GV) {
1104 /* Restore RV2CV to check lvalueness */
1105 restore_2cv:
1106 if (kid->op_next && kid->op_next != kid) { /* Happens? */
1107 okid->op_next = kid->op_next;
1108 kid->op_next = okid;
1109 }
1110 else
1111 okid->op_next = Nullop;
1112 okid->op_type = OP_RV2CV;
1113 okid->op_targ = 0;
1114 okid->op_ppaddr = PL_ppaddr[OP_RV2CV];
1115 okid->op_private |= OPpLVAL_INTRO;
1116 break;
1117 }
b2ffa427 1118
638eceb6 1119 cv = GvCV(kGVOP_gv);
1c846c1f 1120 if (!cv)
cd06dffe
GS
1121 goto restore_2cv;
1122 if (CvLVALUE(cv))
1123 break;
1124 }
1125 }
79072805
LW
1126 /* FALL THROUGH */
1127 default:
a0d0e21e
LW
1128 nomod:
1129 /* grep, foreach, subcalls, refgen */
1130 if (type == OP_GREPSTART || type == OP_ENTERSUB || type == OP_REFGEN)
1131 break;
cea2e8a9 1132 yyerror(Perl_form(aTHX_ "Can't modify %s in %s",
638bc118 1133 (o->op_type == OP_NULL && (o->op_flags & OPf_SPECIAL)
cd06dffe
GS
1134 ? "do block"
1135 : (o->op_type == OP_ENTERSUB
1136 ? "non-lvalue subroutine call"
53e06cf0 1137 : OP_DESC(o))),
22c35a8c 1138 type ? PL_op_desc[type] : "local"));
11343788 1139 return o;
79072805 1140
a0d0e21e
LW
1141 case OP_PREINC:
1142 case OP_PREDEC:
1143 case OP_POW:
1144 case OP_MULTIPLY:
1145 case OP_DIVIDE:
1146 case OP_MODULO:
1147 case OP_REPEAT:
1148 case OP_ADD:
1149 case OP_SUBTRACT:
1150 case OP_CONCAT:
1151 case OP_LEFT_SHIFT:
1152 case OP_RIGHT_SHIFT:
1153 case OP_BIT_AND:
1154 case OP_BIT_XOR:
1155 case OP_BIT_OR:
1156 case OP_I_MULTIPLY:
1157 case OP_I_DIVIDE:
1158 case OP_I_MODULO:
1159 case OP_I_ADD:
1160 case OP_I_SUBTRACT:
11343788 1161 if (!(o->op_flags & OPf_STACKED))
a0d0e21e 1162 goto nomod;
3280af22 1163 PL_modcount++;
a0d0e21e 1164 break;
b2ffa427 1165
79072805 1166 case OP_COND_EXPR:
ddeae0f1 1167 localize = 1;
11343788 1168 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
463ee0b2 1169 mod(kid, type);
79072805
LW
1170 break;
1171
1172 case OP_RV2AV:
1173 case OP_RV2HV:
11343788 1174 if (type == OP_REFGEN && o->op_flags & OPf_PARENS) {
e6438c1a 1175 PL_modcount = RETURN_UNLIMITED_NUMBER;
11343788 1176 return o; /* Treat \(@foo) like ordinary list. */
748a9306
LW
1177 }
1178 /* FALL THROUGH */
79072805 1179 case OP_RV2GV:
5dc0d613 1180 if (scalar_mod_type(o, type))
3fe9a6f1 1181 goto nomod;
11343788 1182 ref(cUNOPo->op_first, o->op_type);
79072805 1183 /* FALL THROUGH */
79072805
LW
1184 case OP_ASLICE:
1185 case OP_HSLICE:
78f9721b
SM
1186 if (type == OP_LEAVESUBLV)
1187 o->op_private |= OPpMAYBE_LVSUB;
ddeae0f1 1188 localize = 1;
78f9721b
SM
1189 /* FALL THROUGH */
1190 case OP_AASSIGN:
93a17b20
LW
1191 case OP_NEXTSTATE:
1192 case OP_DBSTATE:
e6438c1a 1193 PL_modcount = RETURN_UNLIMITED_NUMBER;
79072805 1194 break;
463ee0b2 1195 case OP_RV2SV:
aeea060c 1196 ref(cUNOPo->op_first, o->op_type);
ddeae0f1 1197 localize = 1;
463ee0b2 1198 /* FALL THROUGH */
79072805 1199 case OP_GV:
463ee0b2 1200 case OP_AV2ARYLEN:
3280af22 1201 PL_hints |= HINT_BLOCK_SCOPE;
463ee0b2 1202 case OP_SASSIGN:
bf4b1e52
GS
1203 case OP_ANDASSIGN:
1204 case OP_ORASSIGN:
c963b151 1205 case OP_DORASSIGN:
ddeae0f1
DM
1206 PL_modcount++;
1207 break;
1208
8990e307 1209 case OP_AELEMFAST:
6a077020 1210 localize = -1;
3280af22 1211 PL_modcount++;
8990e307
LW
1212 break;
1213
748a9306
LW
1214 case OP_PADAV:
1215 case OP_PADHV:
e6438c1a 1216 PL_modcount = RETURN_UNLIMITED_NUMBER;
5196be3e
MB
1217 if (type == OP_REFGEN && o->op_flags & OPf_PARENS)
1218 return o; /* Treat \(@foo) like ordinary list. */
1219 if (scalar_mod_type(o, type))
3fe9a6f1 1220 goto nomod;
78f9721b
SM
1221 if (type == OP_LEAVESUBLV)
1222 o->op_private |= OPpMAYBE_LVSUB;
748a9306
LW
1223 /* FALL THROUGH */
1224 case OP_PADSV:
3280af22 1225 PL_modcount++;
ddeae0f1 1226 if (!type) /* local() */
cea2e8a9 1227 Perl_croak(aTHX_ "Can't localize lexical variable %s",
dd2155a4 1228 PAD_COMPNAME_PV(o->op_targ));
463ee0b2
LW
1229 break;
1230
748a9306 1231 case OP_PUSHMARK:
ddeae0f1 1232 localize = 0;
748a9306 1233 break;
b2ffa427 1234
69969c6f
SB
1235 case OP_KEYS:
1236 if (type != OP_SASSIGN)
1237 goto nomod;
5d82c453
GA
1238 goto lvalue_func;
1239 case OP_SUBSTR:
1240 if (o->op_private == 4) /* don't allow 4 arg substr as lvalue */
1241 goto nomod;
5f05dabc 1242 /* FALL THROUGH */
a0d0e21e 1243 case OP_POS:
463ee0b2 1244 case OP_VEC:
78f9721b
SM
1245 if (type == OP_LEAVESUBLV)
1246 o->op_private |= OPpMAYBE_LVSUB;
5d82c453 1247 lvalue_func:
11343788
MB
1248 pad_free(o->op_targ);
1249 o->op_targ = pad_alloc(o->op_type, SVs_PADMY);
5dc0d613 1250 assert(SvTYPE(PAD_SV(o->op_targ)) == SVt_NULL);
11343788
MB
1251 if (o->op_flags & OPf_KIDS)
1252 mod(cBINOPo->op_first->op_sibling, type);
463ee0b2 1253 break;
a0d0e21e 1254
463ee0b2
LW
1255 case OP_AELEM:
1256 case OP_HELEM:
11343788 1257 ref(cBINOPo->op_first, o->op_type);
68dc0745 1258 if (type == OP_ENTERSUB &&
5dc0d613
MB
1259 !(o->op_private & (OPpLVAL_INTRO | OPpDEREF)))
1260 o->op_private |= OPpLVAL_DEFER;
78f9721b
SM
1261 if (type == OP_LEAVESUBLV)
1262 o->op_private |= OPpMAYBE_LVSUB;
ddeae0f1 1263 localize = 1;
3280af22 1264 PL_modcount++;
463ee0b2
LW
1265 break;
1266
1267 case OP_SCOPE:
1268 case OP_LEAVE:
1269 case OP_ENTER:
78f9721b 1270 case OP_LINESEQ:
ddeae0f1 1271 localize = 0;
11343788
MB
1272 if (o->op_flags & OPf_KIDS)
1273 mod(cLISTOPo->op_last, type);
a0d0e21e
LW
1274 break;
1275
1276 case OP_NULL:
ddeae0f1 1277 localize = 0;
638bc118
GS
1278 if (o->op_flags & OPf_SPECIAL) /* do BLOCK */
1279 goto nomod;
1280 else if (!(o->op_flags & OPf_KIDS))
463ee0b2 1281 break;
11343788
MB
1282 if (o->op_targ != OP_LIST) {
1283 mod(cBINOPo->op_first, type);
a0d0e21e
LW
1284 break;
1285 }
1286 /* FALL THROUGH */
463ee0b2 1287 case OP_LIST:
ddeae0f1 1288 localize = 0;
11343788 1289 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2
LW
1290 mod(kid, type);
1291 break;
78f9721b
SM
1292
1293 case OP_RETURN:
1294 if (type != OP_LEAVESUBLV)
1295 goto nomod;
1296 break; /* mod()ing was handled by ck_return() */
463ee0b2 1297 }
58d95175 1298
8be1be90
AMS
1299 /* [20011101.069] File test operators interpret OPf_REF to mean that
1300 their argument is a filehandle; thus \stat(".") should not set
1301 it. AMS 20011102 */
1302 if (type == OP_REFGEN &&
1303 PL_check[o->op_type] == MEMBER_TO_FPTR(Perl_ck_ftst))
1304 return o;
1305
1306 if (type != OP_LEAVESUBLV)
1307 o->op_flags |= OPf_MOD;
1308
1309 if (type == OP_AASSIGN || type == OP_SASSIGN)
1310 o->op_flags |= OPf_SPECIAL|OPf_REF;
ddeae0f1
DM
1311 else if (!type) { /* local() */
1312 switch (localize) {
1313 case 1:
1314 o->op_private |= OPpLVAL_INTRO;
1315 o->op_flags &= ~OPf_SPECIAL;
1316 PL_hints |= HINT_BLOCK_SCOPE;
1317 break;
1318 case 0:
1319 break;
1320 case -1:
1321 if (ckWARN(WARN_SYNTAX)) {
1322 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
1323 "Useless localization of %s", OP_DESC(o));
1324 }
1325 }
463ee0b2 1326 }
8be1be90
AMS
1327 else if (type != OP_GREPSTART && type != OP_ENTERSUB
1328 && type != OP_LEAVESUBLV)
1329 o->op_flags |= OPf_REF;
11343788 1330 return o;
463ee0b2
LW
1331}
1332
864dbfa3 1333STATIC bool
6867be6d 1334S_scalar_mod_type(pTHX_ const OP *o, I32 type)
3fe9a6f1
PP
1335{
1336 switch (type) {
1337 case OP_SASSIGN:
5196be3e 1338 if (o->op_type == OP_RV2GV)
3fe9a6f1
PP
1339 return FALSE;
1340 /* FALL THROUGH */
1341 case OP_PREINC:
1342 case OP_PREDEC:
1343 case OP_POSTINC:
1344 case OP_POSTDEC:
1345 case OP_I_PREINC:
1346 case OP_I_PREDEC:
1347 case OP_I_POSTINC:
1348 case OP_I_POSTDEC:
1349 case OP_POW:
1350 case OP_MULTIPLY:
1351 case OP_DIVIDE:
1352 case OP_MODULO:
1353 case OP_REPEAT:
1354 case OP_ADD:
1355 case OP_SUBTRACT:
1356 case OP_I_MULTIPLY:
1357 case OP_I_DIVIDE:
1358 case OP_I_MODULO:
1359 case OP_I_ADD:
1360 case OP_I_SUBTRACT:
1361 case OP_LEFT_SHIFT:
1362 case OP_RIGHT_SHIFT:
1363 case OP_BIT_AND:
1364 case OP_BIT_XOR:
1365 case OP_BIT_OR:
1366 case OP_CONCAT:
1367 case OP_SUBST:
1368 case OP_TRANS:
49e9fbe6
GS
1369 case OP_READ:
1370 case OP_SYSREAD:
1371 case OP_RECV:
bf4b1e52
GS
1372 case OP_ANDASSIGN:
1373 case OP_ORASSIGN:
3fe9a6f1
PP
1374 return TRUE;
1375 default:
1376 return FALSE;
1377 }
1378}
1379
35cd451c 1380STATIC bool
504618e9 1381S_is_handle_constructor(pTHX_ const OP *o, I32 numargs)
35cd451c
GS
1382{
1383 switch (o->op_type) {
1384 case OP_PIPE_OP:
1385 case OP_SOCKPAIR:
504618e9 1386 if (numargs == 2)
35cd451c
GS
1387 return TRUE;
1388 /* FALL THROUGH */
1389 case OP_SYSOPEN:
1390 case OP_OPEN:
ded8aa31 1391 case OP_SELECT: /* XXX c.f. SelectSaver.pm */
35cd451c
GS
1392 case OP_SOCKET:
1393 case OP_OPEN_DIR:
1394 case OP_ACCEPT:
504618e9 1395 if (numargs == 1)
35cd451c
GS
1396 return TRUE;
1397 /* FALL THROUGH */
1398 default:
1399 return FALSE;
1400 }
1401}
1402
463ee0b2 1403OP *
864dbfa3 1404Perl_refkids(pTHX_ OP *o, I32 type)
463ee0b2 1405{
11343788 1406 if (o && o->op_flags & OPf_KIDS) {
6867be6d 1407 OP *kid;
11343788 1408 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
463ee0b2
LW
1409 ref(kid, type);
1410 }
11343788 1411 return o;
463ee0b2
LW
1412}
1413
1414OP *
864dbfa3 1415Perl_ref(pTHX_ OP *o, I32 type)
463ee0b2 1416{
27da23d5 1417 dVAR;
463ee0b2 1418 OP *kid;
463ee0b2 1419
3280af22 1420 if (!o || PL_error_count)
11343788 1421 return o;
463ee0b2 1422
11343788 1423 switch (o->op_type) {
a0d0e21e 1424 case OP_ENTERSUB:
afebc493 1425 if ((type == OP_EXISTS || type == OP_DEFINED || type == OP_LOCK) &&
11343788
MB
1426 !(o->op_flags & OPf_STACKED)) {
1427 o->op_type = OP_RV2CV; /* entersub => rv2cv */
22c35a8c 1428 o->op_ppaddr = PL_ppaddr[OP_RV2CV];
11343788 1429 assert(cUNOPo->op_first->op_type == OP_NULL);
93c66552 1430 op_null(((LISTOP*)cUNOPo->op_first)->op_first); /* disable pushmark */
11343788 1431 o->op_flags |= OPf_SPECIAL;
8990e307
LW
1432 }
1433 break;
aeea060c 1434
463ee0b2 1435 case OP_COND_EXPR:
11343788 1436 for (kid = cUNOPo->op_first->op_sibling; kid; kid = kid->op_sibling)
463ee0b2
LW
1437 ref(kid, type);
1438 break;
8990e307 1439 case OP_RV2SV:
35cd451c
GS
1440 if (type == OP_DEFINED)
1441 o->op_flags |= OPf_SPECIAL; /* don't create GV */
11343788 1442 ref(cUNOPo->op_first, o->op_type);
4633a7c4
LW
1443 /* FALL THROUGH */
1444 case OP_PADSV:
5f05dabc 1445 if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
5dc0d613
MB
1446 o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1447 : type == OP_RV2HV ? OPpDEREF_HV
1448 : OPpDEREF_SV);
11343788 1449 o->op_flags |= OPf_MOD;
a0d0e21e 1450 }
8990e307 1451 break;
1c846c1f 1452
2faa37cc 1453 case OP_THREADSV:
a863c7d1
MB
1454 o->op_flags |= OPf_MOD; /* XXX ??? */
1455 break;
1456
463ee0b2
LW
1457 case OP_RV2AV:
1458 case OP_RV2HV:
aeea060c 1459 o->op_flags |= OPf_REF;
8990e307 1460 /* FALL THROUGH */
463ee0b2 1461 case OP_RV2GV:
35cd451c
GS
1462 if (type == OP_DEFINED)
1463 o->op_flags |= OPf_SPECIAL; /* don't create GV */
11343788 1464 ref(cUNOPo->op_first, o->op_type);
463ee0b2 1465 break;
8990e307 1466
463ee0b2
LW
1467 case OP_PADAV:
1468 case OP_PADHV:
aeea060c 1469 o->op_flags |= OPf_REF;
79072805 1470 break;
aeea060c 1471
8990e307 1472 case OP_SCALAR:
79072805 1473 case OP_NULL:
11343788 1474 if (!(o->op_flags & OPf_KIDS))
463ee0b2 1475 break;
11343788 1476 ref(cBINOPo->op_first, type);
79072805
LW
1477 break;
1478 case OP_AELEM:
1479 case OP_HELEM:
11343788 1480 ref(cBINOPo->op_first, o->op_type);
5f05dabc 1481 if (type == OP_RV2SV || type == OP_RV2AV || type == OP_RV2HV) {
5dc0d613
MB
1482 o->op_private |= (type == OP_RV2AV ? OPpDEREF_AV
1483 : type == OP_RV2HV ? OPpDEREF_HV
1484 : OPpDEREF_SV);
11343788 1485 o->op_flags |= OPf_MOD;
8990e307 1486 }
79072805
LW
1487 break;
1488
463ee0b2 1489 case OP_SCOPE:
79072805
LW
1490 case OP_LEAVE:
1491 case OP_ENTER:
8990e307 1492 case OP_LIST:
11343788 1493 if (!(o->op_flags & OPf_KIDS))
79072805 1494 break;
11343788 1495 ref(cLISTOPo->op_last, type);
79072805 1496 break;
a0d0e21e
LW
1497 default:
1498 break;
79072805 1499 }
11343788 1500 return scalar(o);
8990e307 1501
79072805
LW
1502}
1503
09bef843
SB
1504STATIC OP *
1505S_dup_attrlist(pTHX_ OP *o)
1506{
1507 OP *rop = Nullop;
1508
1509 /* An attrlist is either a simple OP_CONST or an OP_LIST with kids,
1510 * where the first kid is OP_PUSHMARK and the remaining ones
1511 * are OP_CONST. We need to push the OP_CONST values.
1512 */
1513 if (o->op_type == OP_CONST)
1514 rop = newSVOP(OP_CONST, o->op_flags, SvREFCNT_inc(cSVOPo->op_sv));
1515 else {
1516 assert((o->op_type == OP_LIST) && (o->op_flags & OPf_KIDS));
1517 for (o = cLISTOPo->op_first; o; o=o->op_sibling) {
1518 if (o->op_type == OP_CONST)
1519 rop = append_elem(OP_LIST, rop,
1520 newSVOP(OP_CONST, o->op_flags,
1521 SvREFCNT_inc(cSVOPo->op_sv)));
1522 }
1523 }
1524 return rop;
1525}
1526
1527STATIC void
95f0a2f1 1528S_apply_attrs(pTHX_ HV *stash, SV *target, OP *attrs, bool for_my)
09bef843 1529{
27da23d5 1530 dVAR;
09bef843
SB
1531 SV *stashsv;
1532
1533 /* fake up C<use attributes $pkg,$rv,@attrs> */
1534 ENTER; /* need to protect against side-effects of 'use' */
1535 SAVEINT(PL_expect);
5aaec2b4 1536 stashsv = stash ? newSVhek(HvNAME_HEK(stash)) : &PL_sv_no;
e4783991 1537
09bef843 1538#define ATTRSMODULE "attributes"
95f0a2f1
SB
1539#define ATTRSMODULE_PM "attributes.pm"
1540
1541 if (for_my) {
95f0a2f1 1542 /* Don't force the C<use> if we don't need it. */
504618e9 1543 SV **svp = hv_fetch(GvHVn(PL_incgv), ATTRSMODULE_PM,
95f0a2f1
SB
1544 sizeof(ATTRSMODULE_PM)-1, 0);
1545 if (svp && *svp != &PL_sv_undef)
1546 ; /* already in %INC */
1547 else
1548 Perl_load_module(aTHX_ PERL_LOADMOD_NOIMPORT,
1549 newSVpvn(ATTRSMODULE, sizeof(ATTRSMODULE)-1),
1550 Nullsv);
1551 }
1552 else {
1553 Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
1554 newSVpvn(ATTRSMODULE, sizeof(ATTRSMODULE)-1),
1555 Nullsv,
1556 prepend_elem(OP_LIST,
1557 newSVOP(OP_CONST, 0, stashsv),
1558 prepend_elem(OP_LIST,
1559 newSVOP(OP_CONST, 0,
1560 newRV(target)),
1561 dup_attrlist(attrs))));
1562 }
09bef843
SB
1563 LEAVE;
1564}
1565
95f0a2f1
SB
1566STATIC void
1567S_apply_attrs_my(pTHX_ HV *stash, OP *target, OP *attrs, OP **imopsp)
1568{
1569 OP *pack, *imop, *arg;
1570 SV *meth, *stashsv;
1571
1572 if (!attrs)
1573 return;
1574
1575 assert(target->op_type == OP_PADSV ||
1576 target->op_type == OP_PADHV ||
1577 target->op_type == OP_PADAV);
1578
1579 /* Ensure that attributes.pm is loaded. */
dd2155a4 1580 apply_attrs(stash, PAD_SV(target->op_targ), attrs, TRUE);
95f0a2f1
SB
1581
1582 /* Need package name for method call. */
1583 pack = newSVOP(OP_CONST, 0, newSVpvn(ATTRSMODULE, sizeof(ATTRSMODULE)-1));
1584
1585 /* Build up the real arg-list. */
5aaec2b4
NC
1586 stashsv = stash ? newSVhek(HvNAME_HEK(stash)) : &PL_sv_no;
1587
95f0a2f1
SB
1588 arg = newOP(OP_PADSV, 0);
1589 arg->op_targ = target->op_targ;
1590 arg = prepend_elem(OP_LIST,
1591 newSVOP(OP_CONST, 0, stashsv),
1592 prepend_elem(OP_LIST,
1593 newUNOP(OP_REFGEN, 0,
1594 mod(arg, OP_REFGEN)),
1595 dup_attrlist(attrs)));
1596
1597 /* Fake up a method call to import */
427d62a4 1598 meth = newSVpvn_share("import", 6, 0);
95f0a2f1
SB
1599 imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL|OPf_WANT_VOID,
1600 append_elem(OP_LIST,
1601 prepend_elem(OP_LIST, pack, list(arg)),
1602 newSVOP(OP_METHOD_NAMED, 0, meth)));
1603 imop->op_private |= OPpENTERSUB_NOMOD;
1604
1605 /* Combine the ops. */
1606 *imopsp = append_elem(OP_LIST, *imopsp, imop);
1607}
1608
1609/*
1610=notfor apidoc apply_attrs_string
1611
1612Attempts to apply a list of attributes specified by the C<attrstr> and
1613C<len> arguments to the subroutine identified by the C<cv> argument which
1614is expected to be associated with the package identified by the C<stashpv>
1615argument (see L<attributes>). It gets this wrong, though, in that it
1616does not correctly identify the boundaries of the individual attribute
1617specifications within C<attrstr>. This is not really intended for the
1618public API, but has to be listed here for systems such as AIX which
1619need an explicit export list for symbols. (It's called from XS code
1620in support of the C<ATTRS:> keyword from F<xsubpp>.) Patches to fix it
1621to respect attribute syntax properly would be welcome.
1622
1623=cut
1624*/
1625
be3174d2 1626void
6867be6d
AL
1627Perl_apply_attrs_string(pTHX_ const char *stashpv, CV *cv,
1628 const char *attrstr, STRLEN len)
be3174d2
GS
1629{
1630 OP *attrs = Nullop;
1631
1632 if (!len) {
1633 len = strlen(attrstr);
1634 }
1635
1636 while (len) {
1637 for (; isSPACE(*attrstr) && len; --len, ++attrstr) ;
1638 if (len) {
6867be6d 1639 const char *sstr = attrstr;
be3174d2
GS
1640 for (; !isSPACE(*attrstr) && len; --len, ++attrstr) ;
1641 attrs = append_elem(OP_LIST, attrs,
1642 newSVOP(OP_CONST, 0,
1643 newSVpvn(sstr, attrstr-sstr)));
1644 }
1645 }
1646
1647 Perl_load_module(aTHX_ PERL_LOADMOD_IMPORT_OPS,
1648 newSVpvn(ATTRSMODULE, sizeof(ATTRSMODULE)-1),
1649 Nullsv, prepend_elem(OP_LIST,
1650 newSVOP(OP_CONST, 0, newSVpv(stashpv,0)),
1651 prepend_elem(OP_LIST,
1652 newSVOP(OP_CONST, 0,
1653 newRV((SV*)cv)),
1654 attrs)));
1655}
1656
09bef843 1657STATIC OP *
95f0a2f1 1658S_my_kid(pTHX_ OP *o, OP *attrs, OP **imopsp)
93a17b20 1659{
93a17b20
LW
1660 I32 type;
1661
3280af22 1662 if (!o || PL_error_count)
11343788 1663 return o;
93a17b20 1664
11343788 1665 type = o->op_type;
93a17b20 1666 if (type == OP_LIST) {
6867be6d 1667 OP *kid;
11343788 1668 for (kid = cLISTOPo->op_first; kid; kid = kid->op_sibling)
95f0a2f1 1669 my_kid(kid, attrs, imopsp);
dab48698 1670 } else if (type == OP_UNDEF) {
7766148a 1671 return o;
77ca0c92
LW
1672 } else if (type == OP_RV2SV || /* "our" declaration */
1673 type == OP_RV2AV ||
1674 type == OP_RV2HV) { /* XXX does this let anything illegal in? */
1ce0b88c
RGS
1675 if (cUNOPo->op_first->op_type != OP_GV) { /* MJD 20011224 */
1676 yyerror(Perl_form(aTHX_ "Can't declare %s in %s",
1677 OP_DESC(o), PL_in_my == KEY_our ? "our" : "my"));
1678 } else if (attrs) {
1679 GV *gv = cGVOPx_gv(cUNOPo->op_first);
1680 PL_in_my = FALSE;
1681 PL_in_my_stash = Nullhv;
1682 apply_attrs(GvSTASH(gv),
1683 (type == OP_RV2SV ? GvSV(gv) :
1684 type == OP_RV2AV ? (SV*)GvAV(gv) :
1685 type == OP_RV2HV ? (SV*)GvHV(gv) : (SV*)gv),
1686 attrs, FALSE);
1687 }
192587c2 1688 o->op_private |= OPpOUR_INTRO;
77ca0c92 1689 return o;
95f0a2f1
SB
1690 }
1691 else if (type != OP_PADSV &&
93a17b20
LW
1692 type != OP_PADAV &&
1693 type != OP_PADHV &&
1694 type != OP_PUSHMARK)
1695 {
eb64745e 1696 yyerror(Perl_form(aTHX_ "Can't declare %s in \"%s\"",
53e06cf0 1697 OP_DESC(o),
eb64745e 1698 PL_in_my == KEY_our ? "our" : "my"));
11343788 1699 return o;
93a17b20 1700 }
09bef843
SB
1701 else if (attrs && type != OP_PUSHMARK) {
1702 HV *stash;
09bef843 1703
eb64745e
GS
1704 PL_in_my = FALSE;
1705 PL_in_my_stash = Nullhv;
1706
09bef843 1707 /* check for C<my Dog $spot> when deciding package */
dd2155a4
DM
1708 stash = PAD_COMPNAME_TYPE(o->op_targ);
1709 if (!stash)
09bef843 1710 stash = PL_curstash;
95f0a2f1 1711 apply_attrs_my(stash, o, attrs, imopsp);
09bef843 1712 }
11343788
MB
1713 o->op_flags |= OPf_MOD;
1714 o->op_private |= OPpLVAL_INTRO;
1715 return o;
93a17b20
LW
1716}
1717
1718OP *
09bef843
SB
1719Perl_my_attrs(pTHX_ OP *o, OP *attrs)
1720{
95f0a2f1
SB
1721 OP *rops = Nullop;
1722 int maybe_scalar = 0;
1723
d2be0de5 1724/* [perl #17376]: this appears to be premature, and results in code such as
c754c3d7 1725 C< our(%x); > executing in list mode rather than void mode */
d2be0de5 1726#if 0
09bef843
SB
1727 if (o->op_flags & OPf_PARENS)
1728 list(o);
95f0a2f1
SB
1729 else
1730 maybe_scalar = 1;
d2be0de5
YST
1731#else
1732 maybe_scalar = 1;
1733#endif
09bef843
SB
1734 if (attrs)
1735 SAVEFREEOP(attrs);
95f0a2f1
SB
1736 o = my_kid(o, attrs, &rops);
1737 if (rops) {
1738 if (maybe_scalar && o->op_type == OP_PADSV) {
1739 o = scalar(append_list(OP_LIST, (LISTOP*)rops, (LISTOP*)o));
1740 o->op_private |= OPpLVAL_INTRO;
1741 }
1742 else
1743 o = append_list(OP_LIST, (LISTOP*)o, (LISTOP*)rops);
1744 }
eb64745e
GS
1745 PL_in_my = FALSE;
1746 PL_in_my_stash = Nullhv;
1747 return o;
09bef843
SB
1748}
1749
1750OP *
1751Perl_my(pTHX_ OP *o)
1752{
95f0a2f1 1753 return my_attrs(o, Nullop);
09bef843
SB
1754}
1755
1756OP *
864dbfa3 1757Perl_sawparens(pTHX_ OP *o)
79072805
LW
1758{
1759 if (o)
1760 o->op_flags |= OPf_PARENS;
1761 return o;
1762}
1763
1764OP *
864dbfa3 1765Perl_bind_match(pTHX_ I32 type, OP *left, OP *right)
79072805 1766{
11343788 1767 OP *o;
59f00321 1768 bool ismatchop = 0;
79072805 1769
e476b1b5 1770 if (ckWARN(WARN_MISC) &&
599cee73
PM
1771 (left->op_type == OP_RV2AV ||
1772 left->op_type == OP_RV2HV ||
1773 left->op_type == OP_PADAV ||
1774 left->op_type == OP_PADHV)) {
e1ec3a88 1775 const char *desc = PL_op_desc[(right->op_type == OP_SUBST ||
599cee73
PM
1776 right->op_type == OP_TRANS)
1777 ? right->op_type : OP_MATCH];
dff6d3cd
GS
1778 const char *sample = ((left->op_type == OP_RV2AV ||
1779 left->op_type == OP_PADAV)
1780 ? "@array" : "%hash");
9014280d 1781 Perl_warner(aTHX_ packWARN(WARN_MISC),
1c846c1f 1782 "Applying %s to %s will act on scalar(%s)",
599cee73 1783 desc, sample, sample);
2ae324a7
PP
1784 }
1785
5cc9e5c9
RH
1786 if (right->op_type == OP_CONST &&
1787 cSVOPx(right)->op_private & OPpCONST_BARE &&
1788 cSVOPx(right)->op_private & OPpCONST_STRICT)
1789 {
1790 no_bareword_allowed(right);
1791 }
1792
59f00321
RGS
1793 ismatchop = right->op_type == OP_MATCH ||
1794 right->op_type == OP_SUBST ||
1795 right->op_type == OP_TRANS;
1796 if (ismatchop && right->op_private & OPpTARGET_MY) {
1797 right->op_targ = 0;
1798 right->op_private &= ~OPpTARGET_MY;
1799 }
1800 if (!(right->op_flags & OPf_STACKED) && ismatchop) {
79072805 1801 right->op_flags |= OPf_STACKED;
18808301
JH
1802 if (right->op_type != OP_MATCH &&
1803 ! (right->op_type == OP_TRANS &&
1804 right->op_private & OPpTRANS_IDENTICAL))
463ee0b2 1805 left = mod(left, right->op_type);
79072805 1806 if (right->op_type == OP_TRANS)
11343788 1807 o = newBINOP(OP_NULL, OPf_STACKED, scalar(left), right);
79072805 1808 else
11343788 1809 o = prepend_elem(right->op_type, scalar(left), right);
79072805 1810 if (type == OP_NOT)
11343788
MB
1811 return newUNOP(OP_NOT, 0, scalar(o));
1812 return o;
79072805
LW
1813 }
1814 else
1815 return bind_match(type, left,
131b3ad0 1816 pmruntime(newPMOP(OP_MATCH, 0), right, 0));
79072805
LW
1817}
1818
1819OP *
864dbfa3 1820Perl_invert(pTHX_ OP *o)
79072805 1821{
11343788
MB
1822 if (!o)
1823 return o;
79072805 1824 /* XXX need to optimize away NOT NOT here? Or do we let optimizer do it? */
11343788 1825 return newUNOP(OP_NOT, OPf_SPECIAL, scalar(o));
79072805
LW
1826}
1827
1828OP *
864dbfa3 1829Perl_scope(pTHX_ OP *o)
79072805 1830{
27da23d5 1831 dVAR;
79072805 1832 if (o) {
3280af22 1833 if (o->op_flags & OPf_PARENS || PERLDB_NOOPT || PL_tainting) {
463ee0b2
LW
1834 o = prepend_elem(OP_LINESEQ, newOP(OP_ENTER, 0), o);
1835 o->op_type = OP_LEAVE;
22c35a8c 1836 o->op_ppaddr = PL_ppaddr[OP_LEAVE];
463ee0b2 1837 }
fdb22418
HS
1838 else if (o->op_type == OP_LINESEQ) {
1839 OP *kid;
1840 o->op_type = OP_SCOPE;
1841 o->op_ppaddr = PL_ppaddr[OP_SCOPE];
1842 kid = ((LISTOP*)o)->op_first;
1843 if (kid->op_type == OP_NEXTSTATE || kid->op_type == OP_DBSTATE)
1844 op_null(kid);
463ee0b2 1845 }
fdb22418
HS
1846 else
1847 o = newLISTOP(OP_SCOPE, 0, o, Nullop);
79072805
LW
1848 }
1849 return o;
1850}
1851
dfa41748 1852/* XXX kept for BINCOMPAT only */
b3ac6de7 1853void
864dbfa3 1854Perl_save_hints(pTHX)
b3ac6de7 1855{
dfa41748 1856 Perl_croak(aTHX_ "internal error: obsolete function save_hints() called");
b3ac6de7
IZ
1857}
1858
a0d0e21e 1859int
864dbfa3 1860Perl_block_start(pTHX_ int full)
79072805 1861{
73d840c0 1862 const int retval = PL_savestack_ix;
dd2155a4 1863 pad_block_start(full);
b3ac6de7 1864 SAVEHINTS();
3280af22 1865 PL_hints &= ~HINT_BLOCK_SCOPE;
1c846c1f 1866 SAVESPTR(PL_compiling.cop_warnings);
0453d815 1867 if (! specialWARN(PL_compiling.cop_warnings)) {
599cee73
PM
1868 PL_compiling.cop_warnings = newSVsv(PL_compiling.cop_warnings) ;
1869 SAVEFREESV(PL_compiling.cop_warnings) ;
1870 }
ac27b0f5
NIS
1871 SAVESPTR(PL_compiling.cop_io);
1872 if (! specialCopIO(PL_compiling.cop_io)) {
1873 PL_compiling.cop_io = newSVsv(PL_compiling.cop_io) ;
1874 SAVEFREESV(PL_compiling.cop_io) ;
1875 }
a0d0e21e
LW
1876 return retval;
1877}
1878
1879OP*
864dbfa3 1880Perl_block_end(pTHX_ I32 floor, OP *seq)
a0d0e21e 1881{
6867be6d 1882 const int needblockscope = PL_hints & HINT_BLOCK_SCOPE;
e9f19e3c 1883 OP* retval = scalarseq(seq);
e9818f4e 1884 LEAVE_SCOPE(floor);
eb160463 1885 PL_compiling.op_private = (U8)(PL_hints & HINT_PRIVATE_MASK);
a0d0e21e 1886 if (needblockscope)
3280af22 1887 PL_hints |= HINT_BLOCK_SCOPE; /* propagate out */
dd2155a4 1888 pad_leavemy();
a0d0e21e
LW
1889 return retval;
1890}
1891
76e3520e 1892STATIC OP *
cea2e8a9 1893S_newDEFSVOP(pTHX)
54b9620d 1894{
6867be6d 1895 const I32 offset = pad_findmy("$_");
59f00321
RGS
1896 if (offset == NOT_IN_PAD || PAD_COMPNAME_FLAGS(offset) & SVpad_OUR) {
1897 return newSVREF(newGVOP(OP_GV, 0, PL_defgv));
1898 }
1899 else {
1900 OP *o = newOP(OP_PADSV, 0);
1901 o->op_targ = offset;
1902 return o;
1903 }
54b9620d
MB
1904}
1905
a0d0e21e 1906void
864dbfa3 1907Perl_newPROG(pTHX_ OP *o)
a0d0e21e 1908{
3280af22 1909 if (PL_in_eval) {
b295d113
TH
1910 if (PL_eval_root)
1911 return;
faef0170
HS
1912 PL_eval_root = newUNOP(OP_LEAVEEVAL,
1913 ((PL_in_eval & EVAL_KEEPERR)
1914 ? OPf_SPECIAL : 0), o);
3280af22 1915 PL_eval_start = linklist(PL_eval_root);
7934575e
GS
1916 PL_eval_root->op_private |= OPpREFCOUNTED;
1917 OpREFCNT_set(PL_eval_root, 1);
3280af22 1918 PL_eval_root->op_next = 0;
a2efc822 1919 CALL_PEEP(PL_eval_start);
a0d0e21e
LW
1920 }
1921 else {
6be89cf9
AE
1922 if (o->op_type == OP_STUB) {
1923 PL_comppad_name = 0;
1924 PL_compcv = 0;
2a4f803a 1925 FreeOp(o);
a0d0e21e 1926 return;
6be89cf9 1927 }
3280af22
NIS
1928 PL_main_root = scope(sawparens(scalarvoid(o)));
1929 PL_curcop = &PL_compiling;
1930 PL_main_start = LINKLIST(PL_main_root);
7934575e
GS
1931 PL_main_root->op_private |= OPpREFCOUNTED;
1932 OpREFCNT_set(PL_main_root, 1);
3280af22 1933 PL_main_root->op_next = 0;
a2efc822 1934 CALL_PEEP(PL_main_start);
3280af22 1935 PL_compcv = 0;
3841441e 1936
4fdae800 1937 /* Register with debugger */
84902520 1938 if (PERLDB_INTER) {
864dbfa3 1939 CV *cv = get_cv("DB::postponed", FALSE);
3841441e
CS
1940 if (cv) {
1941 dSP;
924508f0 1942 PUSHMARK(SP);
cc49e20b 1943 XPUSHs((SV*)CopFILEGV(&PL_compiling));
3841441e 1944 PUTBACK;
864dbfa3 1945 call_sv((SV*)cv, G_DISCARD);
3841441e
CS
1946 }
1947 }
79072805 1948 }
79072805
LW
1949}
1950
1951OP *
864dbfa3 1952Perl_localize(pTHX_ OP *o, I32 lex)
79072805
LW
1953{
1954 if (o->op_flags & OPf_PARENS)
d2be0de5
YST
1955/* [perl #17376]: this appears to be premature, and results in code such as
1956 C< our(%x); > executing in list mode rather than void mode */
1957#if 0
79072805 1958 list(o);
d2be0de5
YST
1959#else
1960 ;
1961#endif
8990e307 1962 else {
64420d0d
JH
1963 if (ckWARN(WARN_PARENTHESIS)
1964 && PL_bufptr > PL_oldbufptr && PL_bufptr[-1] == ',')
1965 {
1966 char *s = PL_bufptr;
bac662ee 1967 bool sigil = FALSE;
64420d0d 1968
8473848f 1969 /* some heuristics to detect a potential error */
bac662ee 1970 while (*s && (strchr(", \t\n", *s)))
64420d0d 1971 s++;
8473848f 1972
bac662ee
ST
1973 while (1) {
1974 if (*s && strchr("@$%*", *s) && *++s
1975 && (isALNUM(*s) || UTF8_IS_CONTINUED(*s))) {
1976 s++;
1977 sigil = TRUE;
1978 while (*s && (isALNUM(*s) || UTF8_IS_CONTINUED(*s)))
1979 s++;
1980 while (*s && (strchr(", \t\n", *s)))
1981 s++;
1982 }
1983 else
1984 break;
1985 }
1986 if (sigil && (*s == ';' || *s == '=')) {
1987 Perl_warner(aTHX_ packWARN(WARN_PARENTHESIS),
8473848f
RGS
1988 "Parentheses missing around \"%s\" list",
1989 lex ? (PL_in_my == KEY_our ? "our" : "my")
1990 : "local");
1991 }
8990e307
LW
1992 }
1993 }
93a17b20 1994 if (lex)
eb64745e 1995 o = my(o);
93a17b20 1996 else
eb64745e
GS
1997 o = mod(o, OP_NULL); /* a bit kludgey */
1998 PL_in_my = FALSE;
1999 PL_in_my_stash = Nullhv;
2000 return o;
79072805
LW
2001}
2002
2003OP *
864dbfa3 2004Perl_jmaybe(pTHX_ OP *o)
79072805
LW
2005{
2006 if (o->op_type == OP_LIST) {
554b3eca 2007 OP *o2;
554b3eca 2008 o2 = newSVREF(newGVOP(OP_GV, 0, gv_fetchpv(";", TRUE, SVt_PV))),
554b3eca 2009 o = convert(OP_JOIN, 0, prepend_elem(OP_LIST, o2, o));
79072805
LW
2010 }
2011 return o;
2012}
2013
2014OP *
864dbfa3 2015Perl_fold_constants(pTHX_ register OP *o)
79072805 2016{
27da23d5 2017 dVAR;
79072805
LW
2018 register OP *curop;
2019 I32 type = o->op_type;
748a9306 2020 SV *sv;
79072805 2021
22c35a8c 2022 if (PL_opargs[type] & OA_RETSCALAR)
79072805 2023 scalar(o);
b162f9ea 2024 if (PL_opargs[type] & OA_TARGET && !o->op_targ)
ed6116ce 2025 o->op_targ = pad_alloc(type, SVs_PADTMP);
79072805 2026
eac055e9
GS
2027 /* integerize op, unless it happens to be C<-foo>.
2028 * XXX should pp_i_negate() do magic string negation instead? */
2029 if ((PL_opargs[type] & OA_OTHERINT) && (PL_hints & HINT_INTEGER)
2030 && !(type == OP_NEGATE && cUNOPo->op_first->op_type == OP_CONST
2031 && (cUNOPo->op_first->op_private & OPpCONST_BARE)))
2032 {
22c35a8c 2033 o->op_ppaddr = PL_ppaddr[type = ++(o->op_type)];
eac055e9 2034 }
85e6fe83 2035
22c35a8c 2036 if (!(PL_opargs[type] & OA_FOLDCONST))
79072805
LW
2037 goto nope;
2038
de939608 2039 switch (type) {
7a52d87a
GS
2040 case OP_NEGATE:
2041 /* XXX might want a ck_negate() for this */
2042 cUNOPo->op_first->op_private &= ~OPpCONST_STRICT;
2043 break;
de939608
CS
2044 case OP_SPRINTF:
2045 case OP_UCFIRST:
2046 case OP_LCFIRST:
2047 case OP_UC:
2048 case OP_LC:
69dcf70c
MB
2049 case OP_SLT:
2050 case OP_SGT:
2051 case OP_SLE:
2052 case OP_SGE:
2053 case OP_SCMP:
2de3dbcc
JH
2054 /* XXX what about the numeric ops? */
2055 if (PL_hints & HINT_LOCALE)
de939608
CS
2056 goto nope;
2057 }
2058
3280af22 2059 if (PL_error_count)
a0d0e21e
LW
2060 goto nope; /* Don't try to run w/ errors */
2061
79072805 2062 for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
11fa937b
GS
2063 if ((curop->op_type != OP_CONST ||
2064 (curop->op_private & OPpCONST_BARE)) &&
7a52d87a
GS
2065 curop->op_type != OP_LIST &&
2066 curop->op_type != OP_SCALAR &&
2067 curop->op_type != OP_NULL &&
2068 curop->op_type != OP_PUSHMARK)
2069 {
79072805
LW
2070 goto nope;
2071 }
2072 }
2073
2074 curop = LINKLIST(o);
2075 o->op_next = 0;
533c011a 2076 PL_op = curop;
cea2e8a9 2077 CALLRUNOPS(aTHX);
3280af22 2078 sv = *(PL_stack_sp--);
748a9306 2079 if (o->op_targ && sv == PAD_SV(o->op_targ)) /* grab pad temp? */
dd2155a4 2080 pad_swipe(o->op_targ, FALSE);
748a9306
LW
2081 else if (SvTEMP(sv)) { /* grab mortal temp? */
2082 (void)SvREFCNT_inc(sv);
2083 SvTEMP_off(sv);
85e6fe83 2084 }
79072805
LW
2085 op_free(o);
2086 if (type == OP_RV2GV)
b1cb66bf 2087 return newGVOP(OP_GV, 0, (GV*)sv);
52a96ae6 2088 return newSVOP(OP_CONST, 0, sv);
aeea060c 2089
79072805 2090 nope:
79072805
LW
2091 return o;
2092}
2093
2094OP *
864dbfa3 2095Perl_gen_constant_list(pTHX_ register OP *o)
79072805 2096{
27da23d5 2097 dVAR;
79072805 2098 register OP *curop;
6867be6d 2099 const I32 oldtmps_floor = PL_tmps_floor;
79072805 2100
a0d0e21e 2101 list(o);
3280af22 2102 if (PL_error_count)
a0d0e21e
LW
2103 return o; /* Don't attempt to run with errors */
2104
533c011a 2105 PL_op = curop = LINKLIST(o);
a0d0e21e 2106 o->op_next = 0;
a2efc822 2107 CALL_PEEP(curop);
cea2e8a9
GS
2108 pp_pushmark();
2109 CALLRUNOPS(aTHX);
533c011a 2110 PL_op = curop;
cea2e8a9 2111 pp_anonlist();
3280af22 2112 PL_tmps_floor = oldtmps_floor;
79072805
LW
2113
2114 o->op_type = OP_RV2AV;
22c35a8c 2115 o->op_ppaddr = PL_ppaddr[OP_RV2AV];
fb53bbb2
SG
2116 o->op_flags &= ~OPf_REF; /* treat \(1..2) like an ordinary list */
2117 o->op_flags |= OPf_PARENS; /* and flatten \(1..2,3) */
2814eb74 2118 o->op_opt = 0; /* needs to be revisited in peep() */
79072805 2119 curop = ((UNOP*)o)->op_first;
3280af22 2120 ((UNOP*)o)->op_first = newSVOP(OP_CONST, 0, SvREFCNT_inc(*PL_stack_sp--));
79072805 2121 op_free(curop);
79072805
LW
2122 linklist(o);
2123 return list(o);
2124}
2125
2126OP *
864dbfa3 2127Perl_convert(pTHX_ I32 type, I32 flags, OP *o)
79072805 2128{
27da23d5 2129 dVAR;
11343788
MB
2130 if (!o || o->op_type != OP_LIST)
2131 o = newLISTOP(OP_LIST, 0, o, Nullop);
748a9306 2132 else
5dc0d613 2133 o->op_flags &= ~OPf_WANT;
79072805 2134
22c35a8c 2135 if (!(PL_opargs[type] & OA_MARK))
93c66552 2136 op_null(cLISTOPo->op_first);
8990e307 2137
eb160463 2138 o->op_type = (OPCODE)type;
22c35a8c 2139 o->op_ppaddr = PL_ppaddr[type];
11343788 2140 o->op_flags |= flags;
79072805 2141
11343788 2142 o = CHECKOP(type, o);
fe2774ed 2143 if (o->op_type != (unsigned)type)
11343788 2144 return o;
79072805 2145
11343788 2146 return fold_constants(o);
79072805
LW
2147}
2148
2149/* List constructors */
2150
2151OP *
864dbfa3 2152Perl_append_elem(pTHX_ I32 type, OP *first, OP *last)
79072805
LW
2153{
2154 if (!first)
2155 return last;
8990e307
LW
2156
2157 if (!last)
79072805 2158 return first;
8990e307 2159
fe2774ed 2160 if (first->op_type != (unsigned)type
155aba94
GS
2161 || (type == OP_LIST && (first->op_flags & OPf_PARENS)))
2162 {
2163 return newLISTOP(type, 0, first, last);
2164 }
79072805 2165
a0d0e21e
LW
2166 if (first->op_flags & OPf_KIDS)
2167 ((LISTOP*)first)->op_last->op_sibling = last;
2168 else {
2169 first->op_flags |= OPf_KIDS;
2170 ((LISTOP*)first)->op_first = last;
2171 }
2172 ((LISTOP*)first)->op_last = last;
a0d0e21e 2173 return first;
79072805
LW
2174}
2175
2176OP *
864dbfa3 2177Perl_append_list(pTHX_ I32 type, LISTOP *first, LISTOP *last)
79072805
LW
2178{
2179 if (!first)
2180 return (OP*)last;
8990e307
LW
2181
2182 if (!last)
79072805 2183 return (OP*)first;
8990e307 2184
fe2774ed 2185 if (first->op_type != (unsigned)type)
79072805 2186 return prepend_elem(type, (OP*)first, (OP*)last);
8990e307 2187
fe2774ed 2188 if (last->op_type != (unsigned)type)
79072805
LW
2189 return append_elem(type, (OP*)first, (OP*)last);
2190
2191 first->op_last->op_sibling = last->op_first;
2192 first->op_last = last->op_last;
117dada2 2193 first->op_flags |= (last->op_flags & OPf_KIDS);
1c846c1f 2194
238a4c30
NIS
2195 FreeOp(last);
2196
79072805
LW
2197 return (OP*)first;
2198}
2199
2200OP *
864dbfa3 2201Perl_prepend_elem(pTHX_ I32 type, OP *first, OP *last)
79072805
LW
2202{
2203 if (!first)
2204 return last;
8990e307
LW
2205
2206 if (!last)
79072805 2207 return first;
8990e307 2208
fe2774ed 2209 if (last->op_type == (unsigned)type) {
8990e307
LW
2210 if (type == OP_LIST) { /* already a PUSHMARK there */
2211 first->op_sibling = ((LISTOP*)last)->op_first->op_sibling;
2212 ((LISTOP*)last)->op_first->op_sibling = first;
36a5d4ba
DC
2213 if (!(first->op_flags & OPf_PARENS))
2214 last->op_flags &= ~OPf_PARENS;
8990e307
LW
2215 }
2216 else {
2217 if (!(last->op_flags & OPf_KIDS)) {
2218 ((LISTOP*)last)->op_last = first;
2219 last->op_flags |= OPf_KIDS;
2220 }
2221 first->op_sibling = ((LISTOP*)last)->op_first;
2222 ((LISTOP*)last)->op_first = first;
79072805 2223 }
117dada2 2224 last->op_flags |= OPf_KIDS;
79072805
LW
2225 return last;
2226 }
2227
2228 return newLISTOP(type, 0, first, last);
2229}
2230
2231/* Constructors */
2232
2233OP *
864dbfa3 2234Perl_newNULLLIST(pTHX)
79072805 2235{
8990e307
LW
2236 return newOP(OP_STUB, 0);
2237}
2238
2239OP *
864dbfa3 2240Perl_force_list(pTHX_ OP *o)
8990e307 2241{
11343788
MB
2242 if (!o || o->op_type != OP_LIST)
2243 o = newLISTOP(OP_LIST, 0, o, Nullop);
93c66552 2244 op_null(o);
11343788 2245 return o;
79072805
LW
2246}
2247
2248OP *
864dbfa3 2249Perl_newLISTOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
79072805 2250{
27da23d5 2251 dVAR;
79072805
LW
2252 LISTOP *listop;
2253
b7dc083c 2254 NewOp(1101, listop, 1, LISTOP);
79072805 2255
eb160463 2256 listop->op_type = (OPCODE)type;
22c35a8c 2257 listop->op_ppaddr = PL_ppaddr[type];
117dada2
SM
2258 if (first || last)
2259 flags |= OPf_KIDS;
eb160463 2260 listop->op_flags = (U8)flags;
79072805
LW
2261
2262 if (!last && first)
2263 last = first;
2264 else if (!first && last)
2265 first = last;
8990e307
LW
2266 else if (first)
2267 first->op_sibling = last;
79072805
LW
2268 listop->op_first = first;
2269 listop->op_last = last;
8990e307
LW
2270 if (type == OP_LIST) {
2271 OP* pushop;
2272 pushop = newOP(OP_PUSHMARK, 0);
2273 pushop->op_sibling = first;
2274 listop->op_first = pushop;
2275 listop->op_flags |= OPf_KIDS;
2276 if (!last)
2277 listop->op_last = pushop;
2278 }
79072805 2279
463d09e6 2280 return CHECKOP(type, listop);
79072805
LW
2281}
2282
2283OP *
864dbfa3 2284Perl_newOP(pTHX_ I32 type, I32 flags)
79072805 2285{
27da23d5 2286 dVAR;
11343788 2287 OP *o;
b7dc083c 2288 NewOp(1101, o, 1, OP);
eb160463 2289 o->op_type = (OPCODE)type;
22c35a8c 2290 o->op_ppaddr = PL_ppaddr[type];
eb160463 2291 o->op_flags = (U8)flags;
79072805 2292
11343788 2293 o->op_next = o;
eb160463 2294 o->op_private = (U8)(0 | (flags >> 8));
22c35a8c 2295 if (PL_opargs[type] & OA_RETSCALAR)
11343788 2296 scalar(o);
22c35a8c 2297 if (PL_opargs[type] & OA_TARGET)
11343788
MB
2298 o->op_targ = pad_alloc(type, SVs_PADTMP);
2299 return CHECKOP(type, o);
79072805
LW
2300}
2301
2302OP *
864dbfa3 2303Perl_newUNOP(pTHX_ I32 type, I32 flags, OP *first)
79072805 2304{
27da23d5 2305 dVAR;
79072805
LW
2306 UNOP *unop;
2307
93a17b20 2308 if (!first)
aeea060c 2309 first = newOP(OP_STUB, 0);
22c35a8c 2310 if (PL_opargs[type] & OA_MARK)
8990e307 2311 first = force_list(first);
93a17b20 2312
b7dc083c 2313 NewOp(1101, unop, 1, UNOP);
eb160463 2314 unop->op_type = (OPCODE)type;
22c35a8c 2315 unop->op_ppaddr = PL_ppaddr[type];
79072805
LW
2316 unop->op_first = first;
2317 unop->op_flags = flags | OPf_KIDS;
eb160463 2318 unop->op_private = (U8)(1 | (flags >> 8));
e50aee73 2319 unop = (UNOP*) CHECKOP(type, unop);
79072805
LW
2320 if (unop->op_next)
2321 return (OP*)unop;
2322
a0d0e21e 2323 return fold_constants((OP *) unop);
79072805
LW
2324}
2325
2326OP *
864dbfa3 2327Perl_newBINOP(pTHX_ I32 type, I32 flags, OP *first, OP *last)
79072805 2328{
27da23d5 2329 dVAR;
79072805 2330 BINOP *binop;
b7dc083c 2331 NewOp(1101, binop, 1, BINOP);
79072805
LW
2332
2333 if (!first)
2334 first = newOP(OP_NULL, 0);
2335
eb160463 2336 binop->op_type = (OPCODE)type;
22c35a8c 2337 binop->op_ppaddr = PL_ppaddr[type];
79072805
LW
2338 binop->op_first = first;
2339 binop->op_flags = flags | OPf_KIDS;
2340 if (!last) {
2341 last = first;
eb160463 2342 binop->op_private = (U8)(1 | (flags >> 8));
79072805
LW
2343 }
2344 else {
eb160463 2345 binop->op_private = (U8)(2 | (flags >> 8));
79072805
LW
2346 first->op_sibling = last;
2347 }
2348
e50aee73 2349 binop = (BINOP*)CHECKOP(type, binop);
eb160463 2350 if (binop->op_next || binop->op_type != (OPCODE)type)
79072805
LW
2351 return (OP*)binop;
2352
7284ab6f 2353 binop->op_last = binop->op_first->op_sibling;
79072805 2354
a0d0e21e 2355 return fold_constants((OP *)binop);
79072805
LW
2356}
2357
abb2c242
JH
2358static int uvcompare(const void *a, const void *b) __attribute__nonnull__(1) __attribute__nonnull__(2) __attribute__pure__;
2359static int uvcompare(const void *a, const void *b)
2b9d42f0 2360{
e1ec3a88 2361 if (*((const UV *)a) < (*(const UV *)b))
2b9d42f0 2362 return -1;
e1ec3a88 2363 if (*((const UV *)a) > (*(const UV *)b))
2b9d42f0 2364 return 1;
e1ec3a88 2365 if (*((const UV *)a+1) < (*(const UV *)b+1))
2b9d42f0 2366 return -1;
e1ec3a88 2367 if (*((const UV *)a+1) > (*(const UV *)b+1))
2b9d42f0 2368 return 1;
a0ed51b3
LW
2369 return 0;
2370}
2371
79072805 2372OP *
864dbfa3 2373Perl_pmtrans(pTHX_ OP *o, OP *expr, OP *repl)
79072805 2374{
79072805
LW
2375 SV *tstr = ((SVOP*)expr)->op_sv;
2376 SV *rstr = ((SVOP*)repl)->op_sv;
463ee0b2
LW
2377 STRLEN tlen;
2378 STRLEN rlen;
5c144d81
NC
2379 const U8 *t = (U8*)SvPV_const(tstr, tlen);
2380 const U8 *r = (U8*)SvPV_const(rstr, rlen);
79072805
LW
2381 register I32 i;
2382 register I32 j;
a0ed51b3 2383 I32 del;
79072805 2384 I32 complement;
5d06d08e 2385 I32 squash;
9b877dbb 2386 I32 grows = 0;
79072805
LW
2387 register short *tbl;
2388
800b4dc4 2389 PL_hints |= HINT_BLOCK_SCOPE;
11343788 2390 complement = o->op_private & OPpTRANS_COMPLEMENT;
a0ed51b3 2391 del = o->op_private & OPpTRANS_DELETE;
5d06d08e 2392 squash = o->op_private & OPpTRANS_SQUASH;
1c846c1f 2393
036b4402
GS
2394 if (SvUTF8(tstr))
2395 o->op_private |= OPpTRANS_FROM_UTF;
1c846c1f
NIS
2396
2397 if (SvUTF8(rstr))
036b4402 2398 o->op_private |= OPpTRANS_TO_UTF;
79072805 2399
a0ed51b3 2400 if (o->op_private & (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF)) {
79cb57f6 2401 SV* listsv = newSVpvn("# comment\n",10);
a0ed51b3 2402 SV* transv = 0;
5c144d81
NC
2403 const U8* tend = t + tlen;
2404 const U8* rend = r + rlen;
ba210ebe 2405 STRLEN ulen;
84c133a0
RB
2406 UV tfirst = 1;
2407 UV tlast = 0;
2408 IV tdiff;
2409 UV rfirst = 1;
2410 UV rlast = 0;
2411 IV rdiff;
2412 IV diff;
a0ed51b3
LW
2413 I32 none = 0;
2414 U32 max = 0;
2415 I32 bits;
a0ed51b3 2416 I32 havefinal = 0;
9c5ffd7c 2417 U32 final = 0;
a0ed51b3
LW
2418 I32 from_utf = o->op_private & OPpTRANS_FROM_UTF;
2419 I32 to_utf = o->op_private & OPpTRANS_TO_UTF;
bf4a1e57
JH
2420 U8* tsave = NULL;
2421 U8* rsave = NULL;
2422
2423 if (!from_utf) {
2424 STRLEN len = tlen;
5c144d81 2425 t = tsave = bytes_to_utf8(t, &len);
bf4a1e57
JH
2426 tend = t + len;
2427 }
2428 if (!to_utf && rlen) {
2429 STRLEN len = rlen;
5c144d81 2430 r = rsave = bytes_to_utf8(r, &len);
bf4a1e57
JH
2431 rend = r + len;
2432 }
a0ed51b3 2433
2b9d42f0
NIS
2434/* There are several snags with this code on EBCDIC:
2435 1. 0xFF is a legal UTF-EBCDIC byte (there are no illegal bytes).
2436 2. scan_const() in toke.c has encoded chars in native encoding which makes
2437 ranges at least in EBCDIC 0..255 range the bottom odd.
2438*/
2439
a0ed51b3 2440 if (complement) {
89ebb4a3 2441 U8 tmpbuf[UTF8_MAXBYTES+1];
2b9d42f0 2442 UV *cp;
a0ed51b3 2443 UV nextmin = 0;
2b9d42f0 2444 New(1109, cp, 2*tlen, UV);
a0ed51b3 2445 i = 0;
79cb57f6 2446 transv = newSVpvn("",0);
a0ed51b3 2447 while (t < tend) {
2b9d42f0
NIS
2448 cp[2*i] = utf8n_to_uvuni(t, tend-t, &ulen, 0);
2449 t += ulen;
2450 if (t < tend && NATIVE_TO_UTF(*t) == 0xff) {
a0ed51b3 2451 t++;
2b9d42f0
NIS
2452 cp[2*i+1] = utf8n_to_uvuni(t, tend-t, &ulen, 0);
2453 t += ulen;
a0ed51b3 2454 }
2b9d42f0
NIS
2455 else {
2456 cp[2*i+1] = cp[2*i];
2457 }
2458 i++;
a0ed51b3 2459 }
2b9d42f0 2460 qsort(cp, i, 2*sizeof(UV), uvcompare);
a0ed51b3 2461 for (j = 0; j < i; j++) {
2b9d42f0 2462 UV val = cp[2*j];
a0ed51b3
LW
2463 diff = val - nextmin;
2464 if (diff > 0) {
9041c2e3 2465 t = uvuni_to_utf8(tmpbuf,nextmin);
dfe13c55 2466 sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
a0ed51b3 2467 if (diff > 1) {
2b9d42f0 2468 U8 range_mark = UTF_TO_NATIVE(0xff);
9041c2e3 2469 t = uvuni_to_utf8(tmpbuf, val - 1);
2b9d42f0 2470 sv_catpvn(transv, (char *)&range_mark, 1);
dfe13c55 2471 sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
a0ed51b3
LW
2472 }
2473 }
2b9d42f0 2474 val = cp[2*j+1];
a0ed51b3
LW
2475 if (val >= nextmin)
2476 nextmin = val + 1;
2477 }
9041c2e3 2478 t = uvuni_to_utf8(tmpbuf,nextmin);
dfe13c55 2479 sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
2b9d42f0
NIS
2480 {
2481 U8 range_mark = UTF_TO_NATIVE(0xff);
2482 sv_catpvn(transv, (char *)&range_mark, 1);
2483 }
b851fbc1
JH
2484 t = uvuni_to_utf8_flags(tmpbuf, 0x7fffffff,
2485 UNICODE_ALLOW_SUPER);
dfe13c55 2486 sv_catpvn(transv, (char*)tmpbuf, t - tmpbuf);
93524f2b 2487 t = (const U8*)SvPVX_const(transv);
a0ed51b3
LW
2488 tlen = SvCUR(transv);
2489 tend = t + tlen;
455d824a 2490 Safefree(cp);
a0ed51b3
LW
2491 }
2492 else if (!rlen && !del) {
2493 r = t; rlen = tlen; rend = tend;
4757a243
LW
2494 }
2495 if (!squash) {
05d340b8 2496 if ((!rlen && !del) || t == r ||
12ae5dfc 2497 (tlen == rlen && memEQ((char *)t, (char *)r, tlen)))
01ec43d0 2498 {
4757a243 2499 o->op_private |= OPpTRANS_IDENTICAL;
01ec43d0 2500 }
a0ed51b3
LW
2501 }
2502
2503 while (t < tend || tfirst <= tlast) {
2504 /* see if we need more "t" chars */
2505 if (tfirst > tlast) {
9041c2e3 2506 tfirst = (I32)utf8n_to_uvuni(t, tend - t, &ulen, 0);
a0ed51b3 2507 t += ulen;
2b9d42f0 2508 if (t < tend && NATIVE_TO_UTF(*t) == 0xff) { /* illegal utf8 val indicates range */
ba210ebe 2509 t++;
9041c2e3 2510 tlast = (I32)utf8n_to_uvuni(t, tend - t, &ulen, 0);
a0ed51b3
LW
2511 t += ulen;
2512 }
2513 else
2514 tlast = tfirst;
2515 }
2516
2517 /* now see if we need more "r" chars */
2518 if (rfirst > rlast) {
2519 if (r < rend) {
9041c2e3 2520 rfirst = (I32)utf8n_to_uvuni(r, rend - r, &ulen, 0);
a0ed51b3 2521 r += ulen;
2b9d42f0 2522 if (r < rend && NATIVE_TO_UTF(*r) == 0xff) { /* illegal utf8 val indicates range */
ba210ebe 2523 r++;
9041c2e3 2524 rlast = (I32)utf8n_to_uvuni(r, rend - r, &ulen, 0);
a0ed51b3
LW
2525 r += ulen;
2526 }
2527 else
2528 rlast = rfirst;
2529 }
2530 else {
2531 if (!havefinal++)
2532 final = rlast;
2533 rfirst = rlast = 0xffffffff;
2534 }
2535 }
2536
2537 /* now see which range will peter our first, if either. */
2538 tdiff = tlast - tfirst;
2539 rdiff = rlast - rfirst;
2540
2541 if (tdiff <= rdiff)
2542 diff = tdiff;
2543 else
2544 diff = rdiff;
2545
2546 if (rfirst == 0xffffffff) {
2547 diff = tdiff; /* oops, pretend rdiff is infinite */
2548 if (diff > 0)
894356b3
GS
2549 Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\tXXXX\n",
2550 (long)tfirst, (long)tlast);
a0ed51b3 2551 else
894356b3 2552 Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\tXXXX\n", (long)tfirst);
a0ed51b3
LW
2553 }
2554 else {
2555 if (diff > 0)
894356b3
GS
2556 Perl_sv_catpvf(aTHX_ listsv, "%04lx\t%04lx\t%04lx\n",
2557 (long)tfirst, (long)(tfirst + diff),
2558 (long)rfirst);
a0ed51b3 2559 else
894356b3
GS
2560 Perl_sv_catpvf(aTHX_ listsv, "%04lx\t\t%04lx\n",
2561 (long)tfirst, (long)rfirst);
a0ed51b3
LW
2562
2563 if (rfirst + diff > max)
2564 max = rfirst + diff;
9b877dbb 2565 if (!grows)
45005bfb
JH
2566 grows = (tfirst < rfirst &&
2567 UNISKIP(tfirst) < UNISKIP(rfirst + diff));
2568 rfirst += diff + 1;
a0ed51b3
LW
2569 }
2570 tfirst += diff + 1;
2571 }
2572
2573 none = ++max;
2574 if (del)
2575 del = ++max;
2576
2577 if (max > 0xffff)
2578 bits = 32;
2579 else if (max > 0xff)
2580 bits = 16;
2581 else
2582 bits = 8;
2583
455d824a 2584 Safefree(cPVOPo->op_pv);
a0ed51b3
LW
2585 cSVOPo->op_sv = (SV*)swash_init("utf8", "", listsv, bits, none);
2586 SvREFCNT_dec(listsv);
2587 if (transv)
2588 SvREFCNT_dec(transv);
2589
45005bfb 2590 if (!del && havefinal && rlen)
b448e4fe
JH
2591 (void)hv_store((HV*)SvRV((cSVOPo->op_sv)), "FINAL", 5,
2592 newSVuv((UV)final), 0);
a0ed51b3 2593
9b877dbb 2594 if (grows)
a0ed51b3
LW
2595 o->op_private |= OPpTRANS_GROWS;
2596
9b877dbb
IH
2597 if (tsave)
2598 Safefree(tsave);
2599 if (rsave)
2600 Safefree(rsave);
2601
a0ed51b3
LW
2602 op_free(expr);
2603 op_free(repl);
2604 return o;
2605 }
2606
2607 tbl = (short*)cPVOPo->op_pv;
79072805
LW
2608 if (complement) {
2609 Zero(tbl, 256, short);
eb160463 2610 for (i = 0; i < (I32)tlen; i++)
ec49126f 2611 tbl[t[i]] = -1;
79072805
LW
2612 for (i = 0, j = 0; i < 256; i++) {
2613 if (!tbl[i]) {
eb160463 2614 if (j >= (I32)rlen) {
a0ed51b3 2615 if (del)
79072805
LW
2616 tbl[i] = -2;
2617 else if (rlen)
ec49126f 2618 tbl[i] = r[j-1];
79072805 2619 else
eb160463 2620 tbl[i] = (short)i;
79072805 2621 }
9b877dbb
IH
2622 else {
2623 if (i < 128 && r[j] >= 128)
2624 grows = 1;
ec49126f 2625 tbl[i] = r[j++];
9b877dbb 2626 }
79072805
LW
2627 }
2628 }
05d340b8
JH
2629 if (!del) {
2630 if (!rlen) {
2631 j = rlen;
2632 if (!squash)
2633 o->op_private |= OPpTRANS_IDENTICAL;
2634 }
eb160463 2635 else if (j >= (I32)rlen)
05d340b8
JH
2636 j = rlen - 1;
2637 else
2638 cPVOPo->op_pv = (char*)Renew(tbl, 0x101+rlen-j, short);
8973db79 2639 tbl[0x100] = rlen - j;
eb160463 2640 for (i=0; i < (I32)rlen - j; i++)
8973db79
JH
2641 tbl[0x101+i] = r[j+i];
2642 }
79072805
LW
2643 }
2644 else {
a0ed51b3 2645 if (!rlen && !del) {
79072805 2646 r = t; rlen = tlen;
5d06d08e 2647 if (!squash)
4757a243 2648 o->op_private |= OPpTRANS_IDENTICAL;
79072805 2649 }
94bfe852
RGS
2650 else if (!squash && rlen == tlen && memEQ((char*)t, (char*)r, tlen)) {
2651 o->op_private |= OPpTRANS_IDENTICAL;
2652 }
79072805
LW
2653 for (i = 0; i < 256; i++)
2654 tbl[i] = -1;
eb160463
GS
2655 for (i = 0, j = 0; i < (I32)tlen; i++,j++) {
2656 if (j >= (I32)rlen) {
a0ed51b3 2657 if (del) {
ec49126f
PP
2658 if (tbl[t[i]] == -1)
2659 tbl[t[i]] = -2;
79072805
LW
2660 continue;
2661 }
2662 --j;
2663 }
9b877dbb
IH
2664 if (tbl[t[i]] == -1) {
2665 if (t[i] < 128 && r[j] >= 128)
2666 grows = 1;
ec49126f 2667 tbl[t[i]] = r[j];
9b877dbb 2668 }
79072805
LW
2669 }
2670 }
9b877dbb
IH
2671 if (grows)
2672 o->op_private |= OPpTRANS_GROWS;
79072805
LW
2673 op_free(expr);
2674 op_free(repl);
2675
11343788 2676 return o;
79072805
LW
2677}
2678
2679OP *
864dbfa3 2680Perl_newPMOP(pTHX_ I32 type, I32 flags)
79072805 2681{
27da23d5 2682 dVAR;
79072805
LW
2683 PMOP *pmop;
2684
b7dc083c 2685 NewOp(1101, pmop, 1, PMOP);
eb160463 2686 pmop->op_type = (OPCODE)type;
22c35a8c 2687 pmop->op_ppaddr = PL_ppaddr[type];
eb160463
GS
2688 pmop->op_flags = (U8)flags;
2689 pmop->op_private = (U8)(0 | (flags >> 8));
79072805 2690
3280af22 2691 if (PL_hints & HINT_RE_TAINT)
b3eb6a9b 2692 pmop->op_pmpermflags |= PMf_RETAINT;
3280af22 2693 if (PL_hints & HINT_LOCALE)
b3eb6a9b
GS
2694 pmop->op_pmpermflags |= PMf_LOCALE;
2695 pmop->op_pmflags = pmop->op_pmpermflags;
36477c24 2696
debc9467 2697#ifdef USE_ITHREADS
13137afc
AB
2698 {
2699 SV* repointer;
2700 if(av_len((AV*) PL_regex_pad[0]) > -1) {
2701 repointer = av_pop((AV*)PL_regex_pad[0]);
2702 pmop->op_pmoffset = SvIV(repointer);
1cc8b4c5 2703 SvREPADTMP_off(repointer);
13137afc 2704 sv_setiv(repointer,0);
1eb1540c 2705 } else {
13137afc
AB
2706 repointer = newSViv(0);
2707 av_push(PL_regex_padav,SvREFCNT_inc(repointer));
2708 pmop->op_pmoffset = av_len(PL_regex_padav);
2709 PL_regex_pad = AvARRAY(PL_regex_padav);
1fcf4c12 2710 }
13137afc 2711 }
debc9467 2712#endif
1eb1540c 2713
1fcf4c12 2714 /* link into pm list */
3280af22 2715 if (type != OP_TRANS && PL_curstash) {
8d2f4536
NC
2716 MAGIC *mg = mg_find((SV*)PL_curstash, PERL_MAGIC_symtab);
2717
2718 if (!mg) {
2719 mg = sv_magicext((SV*)PL_curstash, 0, PERL_MAGIC_symtab, 0, 0, 0);
2720 }
2721 pmop->op_pmnext = (PMOP*)mg->mg_obj;
2722 mg->mg_obj = (SV*)pmop;
cb55de95 2723 PmopSTASH_set(pmop,PL_curstash);
79072805
LW
2724 }
2725
463d09e6 2726 return CHECKOP(type, pmop);
79072805
LW
2727}
2728
131b3ad0
DM
2729/* Given some sort of match op o, and an expression expr containing a
2730 * pattern, either compile expr into a regex and attach it to o (if it's
2731 * constant), or convert expr into a runtime regcomp op sequence (if it's
2732 * not)
2733 *
2734 * isreg indicates that the pattern is part of a regex construct, eg
2735 * $x =~ /pattern/ or split /pattern/, as opposed to $x =~ $pattern or
2736 * split "pattern", which aren't. In the former case, expr will be a list
2737 * if the pattern contains more than one term (eg /a$b/) or if it contains
2738 * a replacement, ie s/// or tr///.
2739 */
2740
79072805 2741OP *
131b3ad0 2742Perl_pmruntime(pTHX_ OP *o, OP *expr, bool isreg)
79072805 2743{
27da23d5 2744 dVAR;
79072805
LW
2745 PMOP *pm;
2746 LOGOP *rcop;
ce862d02 2747 I32 repl_has_vars = 0;
131b3ad0
DM
2748 OP* repl = Nullop;
2749 bool reglist;
2750
2751 if (o->op_type == OP_SUBST || o->op_type == OP_TRANS) {
2752 /* last element in list is the replacement; pop it */
2753 OP* kid;
2754 repl = cLISTOPx(expr)->op_last;
2755 kid = cLISTOPx(expr)->op_first;
2756 while (kid->op_sibling != repl)
2757 kid = kid->op_sibling;
2758 kid->op_sibling = Nullop;
2759 cLISTOPx(expr)->op_last = kid;
2760 }
79072805 2761
131b3ad0
DM
2762 if (isreg && expr->op_type == OP_LIST &&
2763 cLISTOPx(expr)->op_first->op_sibling == cLISTOPx(expr)->op_last)
2764 {
2765 /* convert single element list to element */
2766 OP* oe = expr;
2767 expr = cLISTOPx(oe)->op_first->op_sibling;
2768 cLISTOPx(oe)->op_first->op_sibling = Nullop;
2769 cLISTOPx(oe)->op_last = Nullop;
2770 op_free(oe);
2771 }
2772
2773 if (o->op_type == OP_TRANS) {
11343788 2774 return pmtrans(o, expr, repl);
131b3ad0
DM
2775 }
2776
2777 reglist = isreg && expr->op_type == OP_LIST;
2778 if (reglist)
2779 op_null(expr);
79072805 2780
3280af22 2781 PL_hints |= HINT_BLOCK_SCOPE;
11343788 2782 pm = (PMOP*)o;
79072805
LW
2783
2784 if (expr->op_type == OP_CONST) {
463ee0b2 2785 STRLEN plen;
79072805 2786 SV *pat = ((SVOP*)expr)->op_sv;
5c144d81 2787 const char *p = SvPV_const(pat, plen);
770526c1 2788 if ((o->op_flags & OPf_SPECIAL) && (*p == ' ' && p[1] == '\0')) {
5c144d81
NC
2789 U32 was_readonly = SvREADONLY(pat);
2790
2791 if (was_readonly) {
2792 if (SvFAKE(pat)) {
2793 sv_force_normal_flags(pat, 0);
2794 assert(!SvREADONLY(pat));
2795 was_readonly = 0;
2796 } else {
2797 SvREADONLY_off(pat);
2798 }
2799 }
2800
93a17b20 2801 sv_setpvn(pat, "\\s+", 3);
5c144d81
NC
2802
2803 SvFLAGS(pat) |= was_readonly;
2804
2805 p = SvPV_const(pat, plen);
79072805
LW
2806 pm->op_pmflags |= PMf_SKIPWHITE;
2807 }
5b71a6a7 2808 if (DO_UTF8(pat))
a5961de5 2809 pm->op_pmdynflags |= PMdf_UTF8;
5c144d81
NC
2810 /* FIXME - can we make this function take const char * args? */
2811 PM_SETRE(pm, CALLREGCOMP(aTHX_ (char*)p, (char*)p + plen, pm));
aaa362c4 2812 if (strEQ("\\s+", PM_GETRE(pm)->precomp))
85e6fe83 2813 pm->op_pmflags |= PMf_WHITE;
79072805
LW
2814 op_free(expr);
2815 }
2816 else {
3280af22 2817 if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL))
1c846c1f 2818 expr = newUNOP((!(PL_hints & HINT_RE_EVAL)
2cd61cdb
IZ
2819 ? OP_REGCRESET
2820 : OP_REGCMAYBE),0,expr);
463ee0b2 2821
b7dc083c 2822 NewOp(1101, rcop, 1, LOGOP);
79072805 2823 rcop->op_type = OP_REGCOMP;
22c35a8c 2824 rcop->op_ppaddr = PL_ppaddr[OP_REGCOMP];
79072805 2825 rcop->op_first = scalar(expr);
131b3ad0
DM
2826 rcop->op_flags |= OPf_KIDS
2827 | ((PL_hints & HINT_RE_EVAL) ? OPf_SPECIAL : 0)
2828 | (reglist ? OPf_STACKED : 0);
79072805 2829 rcop->op_private = 1;
11343788 2830 rcop->op_other = o;
131b3ad0
DM
2831 if (reglist)
2832 rcop->op_targ = pad_alloc(rcop->op_type, SVs_PADTMP);
2833
b5c19bd7
DM
2834 /* /$x/ may cause an eval, since $x might be qr/(?{..})/ */
2835 PL_cv_has_eval = 1;
79072805
LW
2836
2837 /* establish postfix order */
3280af22 2838 if (pm->op_pmflags & PMf_KEEP || !(PL_hints & HINT_RE_EVAL)) {
463ee0b2
LW
2839 LINKLIST(expr);
2840 rcop->op_next = expr;
2841 ((UNOP*)expr)->op_first->op_next = (OP*)rcop;
2842 }
2843 else {
2844 rcop->op_next = LINKLIST(expr);
2845 expr->op_next = (OP*)rcop;
2846 }
79072805 2847
11343788 2848 prepend_elem(o->op_type, scalar((OP*)rcop), o);
79072805
LW
2849 }
2850
2851 if (repl) {
748a9306 2852 OP *curop;
0244c3a4 2853 if (pm->op_pmflags & PMf_EVAL) {
748a9306 2854 curop = 0;
8bafa735 2855 if (CopLINE(PL_curcop) < (line_t)PL_multi_end)
eb160463 2856 CopLINE_set(PL_curcop, (line_t)PL_multi_end);
0244c3a4 2857 }
748a9306
LW
2858 else if (repl->op_type == OP_CONST)
2859 curop = repl;
79072805 2860 else {
79072805
LW
2861 OP *lastop = 0;
2862 for (curop = LINKLIST(repl); curop!=repl; curop = LINKLIST(curop)) {
22c35a8c 2863 if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
79072805 2864 if (curop->op_type == OP_GV) {
638eceb6 2865 GV *gv = cGVOPx_gv(curop);
ce862d02 2866 repl_has_vars = 1;
f702bf4a 2867 if (strchr("&`'123456789+-\016\022", *GvENAME(gv)))
79072805
LW
2868 break;
2869 }
2870 else if (curop->op_type == OP_RV2CV)
2871 break;
2872 else if (curop->op_type == OP_RV2SV ||
2873 curop->op_type == OP_RV2AV ||
2874 curop->op_type == OP_RV2HV ||
2875 curop->op_type == OP_RV2GV) {
2876 if (lastop && lastop->op_type != OP_GV) /*funny deref?*/
2877 break;
2878 }
748a9306
LW
2879 else if (curop->op_type == OP_PADSV ||
2880 curop->op_type == OP_PADAV ||
2881 curop->op_type == OP_PADHV ||
554b3eca 2882 curop->op_type == OP_PADANY) {
ce862d02 2883 repl_has_vars = 1;
748a9306 2884 }
1167e5da
SM
2885 else if (curop->op_type == OP_PUSHRE)
2886 ; /* Okay here, dangerous in newASSIGNOP */
79072805
LW
2887 else
2888 break;
2889 }
2890 lastop = curop;
2891 }
748a9306 2892 }
ce862d02 2893 if (curop == repl
1c846c1f 2894 && !(repl_has_vars
aaa362c4
RS
2895 && (!PM_GETRE(pm)
2896 || PM_GETRE(pm)->reganch & ROPT_EVAL_SEEN))) {
748a9306 2897 pm->op_pmflags |= PMf_CONST; /* const for long enough */
4633a7c4 2898 pm->op_pmpermflags |= PMf_CONST; /* const for long enough */
11343788 2899 prepend_elem(o->op_type, scalar(repl), o);
748a9306
LW
2900 }
2901 else {
aaa362c4 2902 if (curop == repl && !PM_GETRE(pm)) { /* Has variables. */
ce862d02
IZ
2903 pm->op_pmflags |= PMf_MAYBE_CONST;
2904 pm->op_pmpermflags |= PMf_MAYBE_CONST;
2905 }
b7dc083c 2906 NewOp(1101, rcop, 1, LOGOP);
748a9306 2907 rcop->op_type = OP_SUBSTCONT;
22c35a8c 2908 rcop->op_ppaddr = PL_ppaddr[OP_SUBSTCONT];
748a9306
LW
2909 rcop->op_first = scalar(repl);
2910 rcop->op_flags |= OPf_KIDS;
2911 rcop->op_private = 1;
11343788 2912 rcop->op_other = o;
748a9306
LW
2913
2914 /* establish postfix order */
2915 rcop->op_next = LINKLIST(repl);
2916 repl->op_next = (OP*)rcop;
2917
2918 pm->op_pmreplroot = scalar((OP*)rcop);
2919 pm->op_pmreplstart = LINKLIST(rcop);
2920 rcop->op_next = 0;
79072805
LW
2921 }
2922 }
2923
2924 return (OP*)pm;
2925}
2926
2927OP *
864dbfa3 2928Perl_newSVOP(pTHX_ I32 type, I32 flags, SV *sv)
79072805 2929{
27da23d5 2930 dVAR;
79072805 2931 SVOP *svop;
b7dc083c 2932 NewOp(1101, svop, 1, SVOP);
eb160463 2933 svop->op_type = (OPCODE)type;
22c35a8c 2934 svop->op_ppaddr = PL_ppaddr[type];
79072805
LW
2935 svop->op_sv = sv;
2936 svop->op_next = (OP*)svop;
eb160463 2937 svop->op_flags = (U8)flags;
22c35a8c 2938 if (PL_opargs[type] & OA_RETSCALAR)
463ee0b2 2939 scalar((OP*)svop);
22c35a8c 2940 if (PL_opargs[type] & OA_TARGET)
ed6116ce 2941 svop->op_targ = pad_alloc(type, SVs_PADTMP);
e50aee73 2942 return CHECKOP(type, svop);
79072805
LW
2943}
2944
2945OP *
350de78d
GS
2946Perl_newPADOP(pTHX_ I32 type, I32 flags, SV *sv)
2947{
27da23d5 2948 dVAR;
350de78d
GS
2949 PADOP *padop;
2950 NewOp(1101, padop, 1, PADOP);
eb160463 2951 padop->op_type = (OPCODE)type;
350de78d
GS
2952 padop->op_ppaddr = PL_ppaddr[type];
2953 padop->op_padix = pad_alloc(type, SVs_PADTMP);
dd2155a4
DM
2954 SvREFCNT_dec(PAD_SVl(padop->op_padix));
2955 PAD_SETSV(padop->op_padix, sv);
ce50c033
AMS
2956 if (sv)
2957 SvPADTMP_on(sv);
350de78d 2958 padop->op_next = (OP*)padop;
eb160463 2959 padop->op_flags = (U8)flags;
350de78d
GS
2960 if (PL_opargs[type] & OA_RETSCALAR)
2961 scalar((OP*)padop);
2962 if (PL_opargs[type] & OA_TARGET)
2963 padop->op_targ = pad_alloc(type, SVs_PADTMP);
2964 return CHECKOP(type, padop);
2965}
2966
2967OP *
864dbfa3 2968Perl_newGVOP(pTHX_ I32 type, I32 flags, GV *gv)
79072805 2969{
27da23d5 2970 dVAR;
350de78d 2971#ifdef USE_ITHREADS
ce50c033
AMS
2972 if (gv)
2973 GvIN_PAD_on(gv);
350de78d
GS
2974 return newPADOP(type, flags, SvREFCNT_inc(gv));
2975#else
7934575e 2976 return newSVOP(type, flags, SvREFCNT_inc(gv));
350de78d 2977#endif
79072805
LW
2978}
2979
2980OP *
864dbfa3 2981Perl_newPVOP(pTHX_ I32 type, I32 flags, char *pv)
79072805 2982{
27da23d5 2983 dVAR;
79072805 2984 PVOP *pvop;
b7dc083c 2985 NewOp(1101, pvop, 1, PVOP);
eb160463 2986 pvop->op_type = (OPCODE)type;
22c35a8c 2987 pvop->op_ppaddr = PL_ppaddr[type];
79072805
LW
2988 pvop->op_pv = pv;
2989 pvop->op_next = (OP*)pvop;
eb160463 2990 pvop->op_flags = (U8)flags;
22c35a8c 2991 if (PL_opargs[type] & OA_RETSCALAR)
463ee0b2 2992 scalar((OP*)pvop);
22c35a8c 2993 if (PL_opargs[type] & OA_TARGET)
ed6116ce 2994 pvop->op_targ = pad_alloc(type, SVs_PADTMP);
e50aee73 2995 return CHECKOP(type, pvop);
79072805
LW
2996}
2997
79072805 2998void
864dbfa3 2999Perl_package(pTHX_ OP *o)
79072805 3000{
6867be6d 3001 const char *name;
de11ba31 3002 STRLEN len;
79072805 3003
3280af22
NIS
3004 save_hptr(&PL_curstash);
3005 save_item(PL_curstname);
de11ba31 3006
5c144d81 3007 name = SvPV_const(cSVOPo->op_sv, len);
de11ba31
AMS
3008 PL_curstash = gv_stashpvn(name, len, TRUE);
3009 sv_setpvn(PL_curstname, name, len);
3010 op_free(o);
3011
7ad382f4 3012 PL_hints |= HINT_BLOCK_SCOPE;
3280af22
NIS
3013 PL_copline = NOLINE;
3014 PL_expect = XSTATE;
79072805
LW
3015}
3016
85e6fe83 3017void
88d95a4d 3018Perl_utilize(pTHX_ int aver, I32 floor, OP *version, OP *idop, OP *arg)
85e6fe83 3019{
a0d0e21e 3020 OP *pack;
a0d0e21e 3021 OP *imop;
b1cb66bf 3022 OP *veop;
85e6fe83 3023
88d95a4d 3024 if (idop->op_type != OP_CONST)
cea2e8a9 3025 Perl_croak(aTHX_ "Module name must be constant");
85e6fe83 3026
b1cb66bf
PP
3027 veop = Nullop;
3028
0f79a09d 3029 if (version != Nullop) {
b1cb66bf
PP
3030 SV *vesv = ((SVOP*)version)->op_sv;
3031
44dcb63b 3032 if (arg == Nullop && !SvNIOKp(vesv)) {
b1cb66bf
PP
3033 arg = version;
3034 }
3035 else {
3036 OP *pack;
0f79a09d 3037 SV *meth;
b1cb66bf 3038
44dcb63b 3039 if (version->op_type != OP_CONST || !SvNIOKp(vesv))
cea2e8a9 3040 Perl_croak(aTHX_ "Version number must be constant number");
b1cb66bf 3041
88d95a4d
JH
3042 /* Make copy of idop so we don't free it twice */
3043 pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
b1cb66bf
PP
3044
3045 /* Fake up a method call to VERSION */
427d62a4 3046 meth = newSVpvn_share("VERSION", 7, 0);
b1cb66bf
PP
3047 veop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
3048 append_elem(OP_LIST,
0f79a09d
GS
3049 prepend_elem(OP_LIST, pack, list(version)),
3050 newSVOP(OP_METHOD_NAMED, 0, meth)));
b1cb66bf
PP
3051 }
3052 }
aeea060c 3053
a0d0e21e 3054 /* Fake up an import/unimport */
4633a7c4
LW
3055 if (arg && arg->op_type == OP_STUB)
3056 imop = arg; /* no import on explicit () */
88d95a4d 3057 else if (SvNIOKp(((SVOP*)idop)->op_sv)) {
b1cb66bf
PP
3058 imop = Nullop; /* use 5.0; */
3059 }
4633a7c4 3060 else {
0f79a09d
GS
3061 SV *meth;
3062
88d95a4d
JH
3063 /* Make copy of idop so we don't free it twice */
3064 pack = newSVOP(OP_CONST, 0, newSVsv(((SVOP*)idop)->op_sv));
0f79a09d
GS
3065
3066 /* Fake up a method call to import/unimport */
427d62a4
NC
3067 meth = aver
3068 ? newSVpvn_share("import",6, 0) : newSVpvn_share("unimport", 8, 0);
4633a7c4 3069 imop = convert(OP_ENTERSUB, OPf_STACKED|OPf_SPECIAL,
0f79a09d
GS
3070 append_elem(OP_LIST,
3071 prepend_elem(OP_LIST, pack, list(arg)),
3072 newSVOP(OP_METHOD_NAMED, 0, meth)));
4633a7c4
LW
3073 }
3074
a0d0e21e 3075 /* Fake up the BEGIN {}, which does its thing immediately. */
09bef843 3076 newATTRSUB(floor,
427d62a4 3077 newSVOP(OP_CONST, 0, newSVpvn_share("BEGIN", 5, 0)),
4633a7c4 3078 Nullop,
09bef843 3079 Nullop,
a0d0e21e 3080 append_elem(OP_LINESEQ,
b1cb66bf 3081 append_elem(OP_LINESEQ,
88d95a4d 3082 newSTATEOP(0, Nullch, newUNOP(OP_REQUIRE, 0, idop)),
b1cb66bf 3083 newSTATEOP(0, Nullch, veop)),
a0d0e21e 3084 newSTATEOP(0, Nullch, imop) ));
85e6fe83 3085
70f5e4ed
JH
3086 /* The "did you use incorrect case?" warning used to be here.
3087 * The problem is that on case-insensitive filesystems one
3088 * might get false positives for "use" (and "require"):
3089 * "use Strict" or "require CARP" will work. This causes
3090 * portability problems for the script: in case-strict
3091 * filesystems the script will stop working.
3092 *
3093 * The "incorrect case" warning checked whether "use Foo"
3094 * imported "Foo" to your namespace, but that is wrong, too:
3095 * there is no requirement nor promise in the language that
3096 * a Foo.pm should or would contain anything in package "Foo".
3097 *
3098 * There is very little Configure-wise that can be done, either:
3099 * the case-sensitivity of the build filesystem of Perl does not
3100 * help in guessing the case-sensitivity of the runtime environment.
3101 */
18fc9488 3102
c305c6a0 3103 PL_hints |= HINT_BLOCK_SCOPE;
3280af22
NIS
3104 PL_copline = NOLINE;
3105 PL_expect = XSTATE;
8ec8fbef 3106 PL_cop_seqmax++; /* Purely for B::*'s benefit */
85e6fe83
LW
3107}
3108
7d3fb230 3109/*
ccfc67b7
JH
3110=head1 Embedding Functions
3111
7d3fb230
BS
3112=for apidoc load_module
3113
3114Loads the module whose name is pointed to by the string part of name.
3115Note that the actual module name, not its filename, should be given.
3116Eg, "Foo::Bar" instead of "Foo/Bar.pm". flags can be any of
3117PERL_LOADMOD_DENY, PERL_LOADMOD_NOIMPORT, or PERL_LOADMOD_IMPORT_OPS
3118(or 0 for no flags). ver, if specified, provides version semantics
3119similar to C<use Foo::Bar VERSION>. The optional trailing SV*
3120arguments can be used to specify arguments to the module's import()
3121method, similar to C<use Foo::Bar VERSION LIST>.
3122
3123=cut */
3124
e4783991
GS
3125void
3126Perl_load_module(pTHX_ U32 flags, SV *name, SV *ver, ...)
3127{
3128 va_list args;
3129 va_start(args, ver);
3130 vload_module(flags, name, ver, &args);
3131 va_end(args);
3132}
3133
3134#ifdef PERL_IMPLICIT_CONTEXT
3135void
3136Perl_load_module_nocontext(U32 flags, SV *name, SV *ver, ...)
3137{
3138 dTHX;
3139 va_list args;
3140 va_start(args, ver);
3141 vload_module(flags, name, ver, &args);
3142 va_end(args);
3143}
3144#endif
3145
3146void
3147Perl_vload_module(pTHX_ U32 flags, SV *name, SV *ver, va_list *args)
3148{
3149 OP *modname, *veop, *imop;
3150
3151 modname = newSVOP(OP_CONST, 0, name);
3152 modname->op_private |= OPpCONST_BARE;
3153 if (ver) {
3154 veop = newSVOP(OP_CONST, 0, ver);
3155 }
3156 else
3157 veop = Nullop;
3158 if (flags & PERL_LOADMOD_NOIMPORT) {
3159 imop = sawparens(newNULLLIST());
3160 }
3161 else if (flags & PERL_LOADMOD_IMPORT_OPS) {
3162 imop = va_arg(*args, OP*);
3163 }
3164 else {
3165 SV *sv;
3166 imop = Nullop;
3167 sv = va_arg(*args, SV*);
3168 while (sv) {
3169 imop = append_elem(OP_LIST, imop, newSVOP(OP_CONST, 0, sv));
3170 sv = va_arg(*args, SV*);
3171 }
3172 }
81885997 3173 {
6867be6d
AL
3174 const line_t ocopline = PL_copline;
3175 COP * const ocurcop = PL_curcop;
3176 const int oexpect = PL_expect;
81885997
GS
3177
3178 utilize(!(flags & PERL_LOADMOD_DENY), start_subparse(FALSE, 0),
3179 veop, modname, imop);
3180 PL_expect = oexpect;
3181 PL_copline = ocopline;
834a3ffa 3182 PL_curcop = ocurcop;
81885997 3183 }
e4783991
GS
3184}
3185
79072805 3186OP *
864dbfa3 3187Perl_dofile(pTHX_ OP *term)
78ca652e
GS
3188{
3189 OP *doop;
3190 GV *gv;
3191
3192 gv = gv_fetchpv("do", FALSE, SVt_PVCV);
b9f751c0 3193 if (!(gv && GvCVu(gv) && GvIMPORTED_CV(gv)))
78ca652e
GS
3194 gv = gv_fetchpv("CORE::GLOBAL::do", FALSE, SVt_PVCV);
3195
b9f751c0 3196 if (gv && GvCVu(gv) && GvIMPORTED_CV(gv)) {
78ca652e
GS
3197 doop = ck_subr(newUNOP(OP_ENTERSUB, OPf_STACKED,
3198 append_elem(OP_LIST, term,
3199 scalar(newUNOP(OP_RV2CV, 0,
3200 newGVOP(OP_GV, 0,
3201 gv))))));
3202 }
3203 else {
3204 doop = newUNOP(OP_DOFILE, 0, scalar(term));
3205 }
3206 return doop;
3207}
3208
3209OP *
864dbfa3 3210Perl_newSLICEOP(pTHX_ I32 flags, OP *subscript, OP *listval)
79072805
LW
3211{
3212 return newBINOP(OP_LSLICE, flags,
8990e307
LW
3213 list(force_list(subscript)),
3214 list(force_list(listval)) );
79072805
LW
3215}
3216
76e3520e 3217STATIC I32
504618e9 3218S_is_list_assignment(pTHX_ register const OP *o)
79072805 3219{
11343788 3220 if (!o)
79072805
LW
3221 return TRUE;
3222
11343788
MB
3223 if (o->op_type == OP_NULL && o->op_flags & OPf_KIDS)
3224 o = cUNOPo->op_first;
79072805 3225
11343788 3226 if (o->op_type == OP_COND_EXPR) {
504618e9
AL
3227 const I32 t = is_list_assignment(cLOGOPo->op_first->op_sibling);
3228 const I32 f = is_list_assignment(cLOGOPo->op_first->op_sibling->op_sibling);
79072805
LW
3229
3230 if (t && f)
3231 return TRUE;
3232 if (t || f)
3233 yyerror("Assignment to both a list and a scalar");
3234 return FALSE;
3235 }
3236
95f0a2f1
SB
3237 if (o->op_type == OP_LIST &&
3238 (o->op_flags & OPf_WANT) == OPf_WANT_SCALAR &&
3239 o->op_private & OPpLVAL_INTRO)
3240 return FALSE;
3241
11343788
MB
3242 if (o->op_type == OP_LIST || o->op_flags & OPf_PARENS ||
3243 o->op_type == OP_RV2AV || o->op_type == OP_RV2HV ||
3244 o->op_type == OP_ASLICE || o->op_type == OP_HSLICE)
79072805
LW
3245 return TRUE;
3246
11343788 3247 if (o->op_type == OP_PADAV || o->op_type == OP_PADHV)
93a17b20
LW
3248 return TRUE;
3249
11343788 3250 if (o->op_type == OP_RV2SV)
79072805
LW
3251 return FALSE;
3252
3253 return FALSE;
3254}
3255
3256OP *
864dbfa3 3257Perl_newASSIGNOP(pTHX_ I32 flags, OP *left, I32 optype, OP *right)
79072805 3258{
11343788 3259 OP *o;
79072805 3260
a0d0e21e 3261 if (optype) {
c963b151 3262 if (optype == OP_ANDASSIGN || optype == OP_ORASSIGN || optype == OP_DORASSIGN) {
a0d0e21e
LW
3263 return newLOGOP(optype, 0,
3264 mod(scalar(left), optype),
3265 newUNOP(OP_SASSIGN, 0, scalar(right)));
3266 }
3267 else {
3268 return newBINOP(optype, OPf_STACKED,
3269 mod(scalar(left), optype), scalar(right));
3270 }
3271 }
3272
504618e9 3273 if (is_list_assignment(left)) {
10c8fecd
GS
3274 OP *curop;
3275
3280af22
NIS
3276 PL_modcount = 0;
3277 PL_eval_start = right; /* Grandfathering $[ assignment here. Bletch.*/
463ee0b2 3278 left = mod(left, OP_AASSIGN);
3280af22
NIS
3279 if (PL_eval_start)
3280 PL_eval_start = 0;
748a9306 3281 else {
a0d0e21e
LW
3282 op_free(left);
3283 op_free(right);
3284 return Nullop;
3285 }
b9d46b39
RGS
3286 /* optimise C<my @x = ()> to C<my @x>, and likewise for hashes */
3287 if ((left->op_type == OP_PADAV || left->op_type == OP_PADHV)
3288 && right->op_type == OP_STUB
3289 && (left->op_private & OPpLVAL_INTRO))
3290 {
3291 op_free(right);
9ff53bc9 3292 left->op_flags &= ~(OPf_REF|OPf_SPECIAL);
b9d46b39
RGS
3293 return left;
3294 }
10c8fecd
GS
3295 curop = list(force_list(left));
3296 o = newBINOP(OP_AASSIGN, flags, list(force_list(right)), curop);
eb160463 3297 o->op_private = (U8)(0 | (flags >> 8));
dd2155a4
DM
3298
3299 /* PL_generation sorcery:
3300 * an assignment like ($a,$b) = ($c,$d) is easier than
3301 * ($a,$b) = ($c,$a), since there is no need for temporary vars.
3302 * To detect whether there are common vars, the global var
3303 * PL_generation is incremented for each assign op we compile.
3304 * Then, while compiling the assign op, we run through all the
3305 * variables on both sides of the assignment, setting a spare slot
3306 * in each of them to PL_generation. If any of them already have
3307 * that value, we know we've got commonality. We could use a
3308 * single bit marker, but then we'd have to make 2 passes, first
3309 * to clear the flag, then to test and set it. To find somewhere
3310 * to store these values, evil chicanery is done with SvCUR().
3311 */
3312
a0d0e21e 3313 if (!(left->op_private & OPpLVAL_INTRO)) {
11343788 3314 OP *lastop = o;
3280af22 3315 PL_generation++;
11343788 3316 for (curop = LINKLIST(o); curop != o; curop = LINKLIST(curop)) {
22c35a8c 3317 if (PL_opargs[curop->op_type] & OA_DANGEROUS) {
79072805 3318 if (curop->op_type == OP_GV) {
638eceb6 3319 GV *gv = cGVOPx_gv(curop);
eb160463 3320 if (gv == PL_defgv || (int)SvCUR(gv) == PL_generation)
79072805 3321 break;
b162af07 3322 SvCUR_set(gv, PL_generation);
79072805 3323 }
748a9306
LW
3324 else if (curop->op_type == OP_PADSV ||
3325 curop->op_type == OP_PADAV ||
3326 curop->op_type == OP_PADHV ||
dd2155a4
DM
3327 curop->op_type == OP_PADANY)
3328 {
3329 if (PAD_COMPNAME_GEN(curop->op_targ)
92251a1e 3330 == (STRLEN)PL_generation)
748a9306 3331 break;
b162af07 3332 PAD_COMPNAME_GEN_set(curop->op_targ, PL_generation);
dd2155a4 3333
748a9306 3334 }
79072805
LW
3335 else if (curop->op_type == OP_RV2CV)
3336 break;
3337 else if (curop->op_type == OP_RV2SV ||
3338 curop->op_type == OP_RV2AV ||
3339 curop->op_type == OP_RV2HV ||
3340 curop->op_type == OP_RV2GV) {
3341 if (lastop->op_type != OP_GV) /* funny deref? */
3342 break;
3343 }
1167e5da
SM
3344 else if (curop->op_type == OP_PUSHRE) {
3345 if (((PMOP*)curop)->op_pmreplroot) {
b3f5893f 3346#ifdef USE_ITHREADS
dd2155a4
DM
3347 GV *gv = (GV*)PAD_SVl(INT2PTR(PADOFFSET,
3348 ((PMOP*)curop)->op_pmreplroot));
b3f5893f 3349#else
1167e5da 3350 GV *gv = (GV*)((PMOP*)curop)->op_pmreplroot;
b3f5893f 3351#endif
eb160463 3352 if (gv == PL_defgv || (int)SvCUR(gv) == PL_generation)
1167e5da 3353 break;
b162af07 3354 SvCUR_set(gv, PL_generation);
b2ffa427 3355 }
1167e5da 3356 }
79072805
LW
3357 else
3358 break;
3359 }
3360 lastop = curop;
3361 }
11343788 3362 if (curop != o)
10c8fecd 3363 o->op_private |= OPpASSIGN_COMMON;
79072805 3364 }
c07a80fd
PP
3365 if (right && right->op_type == OP_SPLIT) {
3366 OP* tmpop;
3367 if ((tmpop = ((LISTOP*)right)->op_first) &&
3368 tmpop->op_type == OP_PUSHRE)
3369 {
3370 PMOP *pm = (PMOP*)tmpop;
3371 if (left->op_type == OP_RV2AV &&
3372 !(left->op_private & OPpLVAL_INTRO) &&
11343788 3373 !(o->op_private & OPpASSIGN_COMMON) )
c07a80fd
PP
3374 {
3375 tmpop = ((UNOP*)left)->op_first;
3376 if (tmpop->op_type == OP_GV && !pm->op_pmreplroot) {
971a9dd3 3377#ifdef USE_ITHREADS
ba89bb6e 3378 pm->op_pmreplroot = INT2PTR(OP*, cPADOPx(tmpop)->op_padix);
971a9dd3
GS
3379 cPADOPx(tmpop)->op_padix = 0; /* steal it */
3380#else
3381 pm->op_pmreplroot = (OP*)cSVOPx(tmpop)->op_sv;
3382 cSVOPx(tmpop)->op_sv = Nullsv; /* steal it */
3383#endif
c07a80fd 3384 pm->op_pmflags |= PMf_ONCE;
11343788 3385 tmpop = cUNOPo->op_first; /* to list (nulled) */
c07a80fd
PP
3386 tmpop = ((UNOP*)tmpop)->op_first; /* to pushmark */
3387 tmpop->op_sibling = Nullop; /* don't free split */
3388 right->op_next = tmpop->op_next; /* fix starting loc */
11343788 3389 op_free(o); /* blow off assign */
54310121 3390 right->op_flags &= ~OPf_WANT;
a5f75d66 3391 /* "I don't know and I don't care." */
c07a80fd
PP
3392 return right;
3393 }
3394 }
3395 else {
e6438c1a 3396 if (PL_modcount < RETURN_UNLIMITED_NUMBER &&
c07a80fd
PP
3397 ((LISTOP*)right)->op_last->op_type == OP_CONST)
3398 {
3399 SV *sv = ((SVOP*)((LISTOP*)right)->op_last)->op_sv;
3400 if (SvIVX(sv) == 0)
3280af22 3401 sv_setiv(sv, PL_modcount+1);
c07a80fd
PP
3402 }
3403 }
3404 }
3405 }
11343788 3406 return o;
79072805
LW
3407 }
3408 if (!right)
3409 right = newOP(OP_UNDEF, 0);
3410 if (right->op_type == OP_READLINE) {
3411 right->op_flags |= OPf_STACKED;
463ee0b2 3412 return newBINOP(OP_NULL, flags, mod(scalar(left), OP_SASSIGN), scalar(right));
79072805 3413 }
a0d0e21e 3414 else {
3280af22 3415 PL_eval_start = right; /* Grandfathering $[ assignment here. Bletch.*/
11343788 3416 o = newBINOP(OP_SASSIGN, flags,
463ee0b2 3417 scalar(right), mod(scalar(left), OP_SASSIGN) );
3280af22
NIS
3418 if (PL_eval_start)
3419 PL_eval_start = 0;
748a9306 3420 else {
11343788 3421 op_free(o);
a0d0e21e
LW
3422 return Nullop;
3423 }
3424 }
11343788 3425 return o;
79072805
LW
3426}
3427
3428OP *
864dbfa3 3429Perl_newSTATEOP(pTHX_ I32 flags, char *label, OP *o)
79072805 3430{
27da23d5 3431 dVAR;
e1ec3a88 3432 const U32 seq = intro_my();
79072805
LW
3433 register COP *cop;
3434
b7dc083c 3435 NewOp(1101, cop, 1, COP);
57843af0 3436 if (PERLDB_LINE && CopLINE(PL_curcop) && PL_curstash != PL_debstash) {
8990e307 3437 cop->op_type = OP_DBSTATE;
22c35a8c 3438 cop->op_ppaddr = PL_ppaddr[ OP_DBSTATE ];
8990e307
LW
3439 }
3440 else {
3441 cop->op_type = OP_NEXTSTATE;
22c35a8c 3442 cop->op_ppaddr = PL_ppaddr[ OP_NEXTSTATE ];
8990e307 3443 }
eb160463
GS
3444 cop->op_flags = (U8)flags;
3445 cop->op_private = (U8)(PL_hints & HINT_PRIVATE_MASK);
ff0cee69
PP
3446#ifdef NATIVE_HINTS
3447 cop->op_private |= NATIVE_HINTS;
3448#endif
e24b16f9 3449 PL_compiling.op_private = cop->op_private;
79072805
LW
3450 cop->op_next = (OP*)cop;
3451
463ee0b2
LW
3452 if (label) {
3453 cop->cop_label = label;
3280af22 3454 PL_hints |= HINT_BLOCK_SCOPE;
463ee0b2 3455 }
bbce6d69 3456 cop->cop_seq = seq;
3280af22 3457 cop->cop_arybase = PL_curcop->cop_arybase;
0453d815 3458 if (specialWARN(PL_curcop->cop_warnings))
599cee73 3459 cop->cop_warnings = PL_curcop->cop_warnings ;
1c846c1f 3460 else
599cee73 3461 cop->cop_warnings = newSVsv(PL_curcop->cop_warnings) ;
ac27b0f5
NIS
3462 if (specialCopIO(PL_curcop->cop_io))
3463 cop->cop_io = PL_curcop->cop_io;
3464 else
3465 cop->cop_io = newSVsv(PL_curcop->cop_io) ;
599cee73 3466
79072805 3467
3280af22 3468 if (PL_copline == NOLINE)
57843af0 3469 CopLINE_set(cop, CopLINE(PL_curcop));
79072805 3470 else {
57843af0 3471 CopLINE_set(cop, PL_copline);
3280af22 3472 PL_copline = NOLINE;
79072805 3473 }
57843af0 3474#ifdef USE_ITHREADS
f4dd75d9 3475 CopFILE_set(cop, CopFILE(PL_curcop)); /* XXX share in a pvtable? */
57843af0 3476#else
f4dd75d9 3477 CopFILEGV_set(cop, CopFILEGV(PL_curcop));
57843af0 3478#endif
11faa288 3479 CopSTASH_set(cop, PL_curstash);
79072805 3480
3280af22 3481 if (PERLDB_LINE && PL_curstash != PL_debstash) {
cc49e20b 3482 SV **svp = av_fetch(CopFILEAV(PL_curcop), (I32)CopLINE(cop), FALSE);
1eb1540c 3483 if (svp && *svp != &PL_sv_undef ) {
0ac0412a 3484 (void)SvIOK_on(*svp);
45977657 3485 SvIV_set(*svp, PTR2IV(cop));
1eb1540c 3486 }
93a17b20
LW
3487 }
3488
722969e2 3489 return prepend_elem(OP_LINESEQ, (OP*)cop, o);
79072805
LW
3490}
3491
bbce6d69 3492
79072805 3493OP *
864dbfa3 3494Perl_newLOGOP(pTHX_ I32 type, I32 flags, OP *first, OP *other)
79072805 3495{
27da23d5 3496 dVAR;
883ffac3
CS
3497 return new_logop(type, flags, &first, &other);
3498}
3499
3bd495df 3500STATIC OP *
cea2e8a9 3501S_new_logop(pTHX_ I32 type, I32 flags, OP** firstp, OP** otherp)
883ffac3 3502{
27da23d5 3503 dVAR;
79072805 3504 LOGOP *logop;
11343788 3505 OP *o;
883ffac3
CS
3506 OP *first = *firstp;
3507 OP *other = *otherp;
79072805 3508
a0d0e21e
LW
3509 if (type == OP_XOR) /* Not short circuit, but here by precedence. */
3510 return newBINOP(type, flags, scalar(first), scalar(other));
3511