1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40#define OPCODE U16
41
42#ifdef PERL_MAD
43# define MADPROP_IN_BASEOP MADPROP* op_madprop;
44#else
45# define MADPROP_IN_BASEOP
46#endif
47
48typedef PERL_BITFIELD16 Optype;
49
50#ifdef BASEOP_DEFINITION
51#define BASEOP BASEOP_DEFINITION
52#else
53#define BASEOP \
54 OP* op_next; \
55 OP* op_sibling; \
56 OP* (CPERLscope(*op_ppaddr))(pTHX); \
57 MADPROP_IN_BASEOP \
58 PADOFFSET op_targ; \
59 PERL_BITFIELD16 op_type:9; \
60 PERL_BITFIELD16 op_opt:1; \
61 PERL_BITFIELD16 op_latefree:1; \
62 PERL_BITFIELD16 op_latefreed:1; \
63 PERL_BITFIELD16 op_attached:1; \
64 PERL_BITFIELD16 op_spare:3; \
65 U8 op_flags; \
66 U8 op_private;
67#endif
68
69
70
71
72
73
74#define OP_GIMME(op,dfl) \
75 (((op)->op_flags & OPf_WANT) == OPf_WANT_VOID ? G_VOID : \
76 ((op)->op_flags & OPf_WANT) == OPf_WANT_SCALAR ? G_SCALAR : \
77 ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST ? G_ARRAY : \
78 dfl)
79
80#define OP_GIMME_REVERSE(flags) \
81 ((flags & G_VOID) ? OPf_WANT_VOID : \
82 (flags & G_ARRAY) ? OPf_WANT_LIST : \
83 OPf_WANT_SCALAR)
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101#define GIMME_V OP_GIMME(PL_op, block_gimme())
102
103
104
105#define OPf_WANT 3
106#define OPf_WANT_VOID 1
107#define OPf_WANT_SCALAR 2
108#define OPf_WANT_LIST 3
109#define OPf_KIDS 4
110#define OPf_PARENS 8
111
112#define OPf_REF 16
113
114#define OPf_MOD 32
115#define OPf_STACKED 64
116#define OPf_SPECIAL 128
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147#define OPf_LIST OPf_WANT_LIST
148#define OPf_KNOW OPf_WANT
149
150#define GIMME \
151 (PL_op->op_flags & OPf_WANT \
152 ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST \
153 ? G_ARRAY \
154 : G_SCALAR) \
155 : dowantarray())
156
157
158
159
160
161#define OPpLVAL_INTRO 128
162
163
164#define OPpREFCOUNTED 64
165
166
167#define OPpASSIGN_COMMON 64
168
169
170#define OPpASSIGN_BACKWARDS 64
171#define OPpASSIGN_CV_TO_GV 128
172
173
174#define OPpRUNTIME 64
175
176
177#define OPpTRANS_FROM_UTF 1
178#define OPpTRANS_TO_UTF 2
179#define OPpTRANS_IDENTICAL 4
180#define OPpTRANS_SQUASH 8
181
182#define OPpTRANS_COMPLEMENT 32
183#define OPpTRANS_GROWS 64
184#define OPpTRANS_DELETE 128
185#define OPpTRANS_ALL (OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|OPpTRANS_SQUASH|OPpTRANS_COMPLEMENT|OPpTRANS_GROWS|OPpTRANS_DELETE)
186
187
188#define OPpREPEAT_DOLIST 64
189
190
191#define OPpDEREF (32|64)
192#define OPpDEREF_AV 32
193#define OPpDEREF_HV 64
194#define OPpDEREF_SV (32|64)
195
196#define OPpENTERSUB_DB 16
197#define OPpENTERSUB_HASTARG 32
198#define OPpENTERSUB_NOMOD 64
199
200#define OPpENTERSUB_AMPER 8
201#define OPpENTERSUB_NOPAREN 128
202#define OPpENTERSUB_INARGS 4
203
204#define OPpEARLY_CV 32
205
206#define OPpLVAL_DEFER 16
207
208#define OPpOUR_INTRO 16
209
210#define OPpMAYBE_LVSUB 8
211
212#define OPpPAD_STATE 16
213
214
215
216#define OPpDONT_INIT_GV 4
217
218
219
220
221#define OPpMAY_RETURN_CONSTANT 1
222
223
224
225#define OPpTARGET_MY 16
226
227
228#define OPpITER_REVERSED 4
229#define OPpITER_DEF 8
230
231
232#define OPpCONST_NOVER 2
233#define OPpCONST_SHORTCIRCUIT 4
234#define OPpCONST_STRICT 8
235#define OPpCONST_ENTERED 16
236#define OPpCONST_ARYBASE 32
237#define OPpCONST_BARE 64
238#define OPpCONST_WARNING 128
239
240
241#define OPpFLIP_LINENUM 64
242
243
244#define OPpLIST_GUESSED 64
245
246
247#define OPpSLICE 64
248
249
250#define OPpEXISTS_SUB 64
251
252
253#define OPpSORT_NUMERIC 1
254#define OPpSORT_INTEGER 2
255#define OPpSORT_REVERSE 4
256#define OPpSORT_INPLACE 8
257#define OPpSORT_DESCEND 16
258#define OPpSORT_QSORT 32
259#define OPpSORT_STABLE 64
260
261
262#define OPpOPEN_IN_RAW 16
263#define OPpOPEN_IN_CRLF 32
264#define OPpOPEN_OUT_RAW 64
265#define OPpOPEN_OUT_CRLF 128
266
267
268#define OPpHUSH_VMSISH 64
269#define OPpEXIT_VMSISH 128
270
271
272#define OPpFT_ACCESS 2
273#define OPpFT_STACKED 4
274#define OP_IS_FILETEST_ACCESS(op) \
275 (((op)->op_type) == OP_FTRREAD || \
276 ((op)->op_type) == OP_FTRWRITE || \
277 ((op)->op_type) == OP_FTREXEC || \
278 ((op)->op_type) == OP_FTEREAD || \
279 ((op)->op_type) == OP_FTEWRITE || \
280 ((op)->op_type) == OP_FTEEXEC)
281
282
283#define OPpGREP_LEX 2
284
285
286#define OPpEVAL_HAS_HH 2
287
288struct op {
289 BASEOP
290};
291
292struct unop {
293 BASEOP
294 OP * op_first;
295};
296
297struct binop {
298 BASEOP
299 OP * op_first;
300 OP * op_last;
301};
302
303struct logop {
304 BASEOP
305 OP * op_first;
306 OP * op_other;
307};
308
309struct listop {
310 BASEOP
311 OP * op_first;
312 OP * op_last;
313};
314
315struct pmop {
316 BASEOP
317 OP * op_first;
318 OP * op_last;
319#ifdef USE_ITHREADS
320 IV op_pmoffset;
321#else
322 REGEXP * op_pmregexp;
323#endif
324 U32 op_pmflags;
325 union {
326 OP * op_pmreplroot;
327#ifdef USE_ITHREADS
328 PADOFFSET op_pmtargetoff;
329#else
330 GV * op_pmtargetgv;
331#endif
332 } op_pmreplrootu;
333 union {
334 OP * op_pmreplstart;
335#ifdef USE_ITHREADS
336 char * op_pmstashpv;
337#else
338 HV * op_pmstash;
339#endif
340 } op_pmstashstartu;
341};
342
343#ifdef USE_ITHREADS
344#define PM_GETRE(o) (INT2PTR(REGEXP*,SvIVX(PL_regex_pad[(o)->op_pmoffset])))
345
346
347#define PM_SETRE(o,r) STMT_START { \
348 const REGEXP *const slosh = (r); \
349 PM_SETRE_OFFSET((o), PTR2IV(slosh)); \
350 } STMT_END
351
352
353#define PM_SETRE_OFFSET(o,iv) \
354 STMT_START { \
355 SV* const sv = PL_regex_pad[(o)->op_pmoffset]; \
356 sv_setiv(sv, (iv)); \
357 } STMT_END
358
359# ifndef PERL_CORE
360
361#define PM_GETRE_SAFE(o) (PL_regex_pad ? PM_GETRE(o) : (REGEXP*)0)
362#define PM_SETRE_SAFE(o,r) if (PL_regex_pad) PM_SETRE(o,r)
363# endif
364#else
365#define PM_GETRE(o) ((o)->op_pmregexp)
366#define PM_SETRE(o,r) ((o)->op_pmregexp = (r))
367# ifndef PERL_CORE
368#define PM_GETRE_SAFE PM_GETRE
369#define PM_SETRE_SAFE PM_SETRE
370# endif
371#endif
372
373
374#define PMf_RETAINT 0x0001
375#define PMf_ONCE 0x0002
376
377
378
379
380
381#define PMf_UNUSED 0x0004
382#define PMf_MAYBE_CONST 0x0008
383
384#define PMf_USED 0x0010
385
386
387#define PMf_CONST 0x0040
388#define PMf_KEEP 0x0080
389#define PMf_GLOBAL 0x0100
390#define PMf_CONTINUE 0x0200
391#define PMf_EVAL 0x0400
392
393
394
395
396
397#define PMf_LOCALE 0x00800
398#define PMf_MULTILINE 0x01000
399#define PMf_SINGLELINE 0x02000
400#define PMf_FOLD 0x04000
401#define PMf_EXTENDED 0x08000
402#define PMf_KEEPCOPY 0x10000
403
404
405#define PMf_COMPILETIME (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED|PMf_KEEPCOPY)
406
407#ifdef USE_ITHREADS
408
409# define PmopSTASHPV(o) \
410 (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstashpv : NULL)
411# if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
412# define PmopSTASHPV_set(o,pv) ({ \
413 assert((o)->op_pmflags & PMf_ONCE); \
414 ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv)); \
415 })
416# else
417# define PmopSTASHPV_set(o,pv) \
418 ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv))
419# endif
420# define PmopSTASH(o) (PmopSTASHPV(o) \
421 ? gv_stashpv((o)->op_pmstashstartu.op_pmstashpv,GV_ADD) : NULL)
422# define PmopSTASH_set(o,hv) PmopSTASHPV_set(o, ((hv) ? HvNAME_get(hv) : NULL))
423# define PmopSTASH_free(o) PerlMemShared_free(PmopSTASHPV(o))
424
425#else
426# define PmopSTASH(o) \
427 (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstash : NULL)
428# if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
429# define PmopSTASH_set(o,hv) ({ \
430 assert((o)->op_pmflags & PMf_ONCE); \
431 ((o)->op_pmstashstartu.op_pmstash = (hv)); \
432 })
433# else
434# define PmopSTASH_set(o,hv) ((o)->op_pmstashstartu.op_pmstash = (hv))
435# endif
436# define PmopSTASHPV(o) (PmopSTASH(o) ? HvNAME_get(PmopSTASH(o)) : NULL)
437
438# define PmopSTASHPV_set(o,pv) PmopSTASH_set((o), gv_stashpv(pv,GV_ADD))
439
440
441# define PmopSTASH_free(o)
442#endif
443
444struct svop {
445 BASEOP
446 SV * op_sv;
447};
448
449struct padop {
450 BASEOP
451 PADOFFSET op_padix;
452};
453
454struct pvop {
455 BASEOP
456 char * op_pv;
457};
458
459struct loop {
460 BASEOP
461 OP * op_first;
462 OP * op_last;
463 OP * op_redoop;
464 OP * op_nextop;
465 OP * op_lastop;
466};
467
468#define cUNOPx(o) ((UNOP*)o)
469#define cBINOPx(o) ((BINOP*)o)
470#define cLISTOPx(o) ((LISTOP*)o)
471#define cLOGOPx(o) ((LOGOP*)o)
472#define cPMOPx(o) ((PMOP*)o)
473#define cSVOPx(o) ((SVOP*)o)
474#define cPADOPx(o) ((PADOP*)o)
475#define cPVOPx(o) ((PVOP*)o)
476#define cCOPx(o) ((COP*)o)
477#define cLOOPx(o) ((LOOP*)o)
478
479#define cUNOP cUNOPx(PL_op)
480#define cBINOP cBINOPx(PL_op)
481#define cLISTOP cLISTOPx(PL_op)
482#define cLOGOP cLOGOPx(PL_op)
483#define cPMOP cPMOPx(PL_op)
484#define cSVOP cSVOPx(PL_op)
485#define cPADOP cPADOPx(PL_op)
486#define cPVOP cPVOPx(PL_op)
487#define cCOP cCOPx(PL_op)
488#define cLOOP cLOOPx(PL_op)
489
490#define cUNOPo cUNOPx(o)
491#define cBINOPo cBINOPx(o)
492#define cLISTOPo cLISTOPx(o)
493#define cLOGOPo cLOGOPx(o)
494#define cPMOPo cPMOPx(o)
495#define cSVOPo cSVOPx(o)
496#define cPADOPo cPADOPx(o)
497#define cPVOPo cPVOPx(o)
498#define cCOPo cCOPx(o)
499#define cLOOPo cLOOPx(o)
500
501#define kUNOP cUNOPx(kid)
502#define kBINOP cBINOPx(kid)
503#define kLISTOP cLISTOPx(kid)
504#define kLOGOP cLOGOPx(kid)
505#define kPMOP cPMOPx(kid)
506#define kSVOP cSVOPx(kid)
507#define kPADOP cPADOPx(kid)
508#define kPVOP cPVOPx(kid)
509#define kCOP cCOPx(kid)
510#define kLOOP cLOOPx(kid)
511
512
513#ifdef USE_ITHREADS
514# define cGVOPx_gv(o) ((GV*)PAD_SVl(cPADOPx(o)->op_padix))
515# define IS_PADGV(v) (v && SvTYPE(v) == SVt_PVGV && isGV_with_GP(v) \
516 && GvIN_PAD(v))
517# define IS_PADCONST(v) (v && SvREADONLY(v))
518# define cSVOPx_sv(v) (cSVOPx(v)->op_sv \
519 ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ))
520# define cSVOPx_svp(v) (cSVOPx(v)->op_sv \
521 ? &cSVOPx(v)->op_sv : &PAD_SVl((v)->op_targ))
522#else
523# define cGVOPx_gv(o) ((GV*)cSVOPx(o)->op_sv)
524# define IS_PADGV(v) FALSE
525# define IS_PADCONST(v) FALSE
526# define cSVOPx_sv(v) (cSVOPx(v)->op_sv)
527# define cSVOPx_svp(v) (&cSVOPx(v)->op_sv)
528#endif
529
530#define cGVOP_gv cGVOPx_gv(PL_op)
531#define cGVOPo_gv cGVOPx_gv(o)
532#define kGVOP_gv cGVOPx_gv(kid)
533#define cSVOP_sv cSVOPx_sv(PL_op)
534#define cSVOPo_sv cSVOPx_sv(o)
535#define kSVOP_sv cSVOPx_sv(kid)
536
537#define Nullop ((OP*)NULL)
538
539
540#define OA_MARK 1
541#define OA_FOLDCONST 2
542#define OA_RETSCALAR 4
543#define OA_TARGET 8
544#define OA_RETINTEGER 16
545#define OA_OTHERINT 32
546#define OA_DANGEROUS 64
547#define OA_DEFGV 128
548#define OA_TARGLEX 256
549
550
551#define OCSHIFT 9
552
553#define OA_CLASS_MASK (15 << OCSHIFT)
554
555#define OA_BASEOP (0 << OCSHIFT)
556#define OA_UNOP (1 << OCSHIFT)
557#define OA_BINOP (2 << OCSHIFT)
558#define OA_LOGOP (3 << OCSHIFT)
559#define OA_LISTOP (4 << OCSHIFT)
560#define OA_PMOP (5 << OCSHIFT)
561#define OA_SVOP (6 << OCSHIFT)
562#define OA_PADOP (7 << OCSHIFT)
563#define OA_PVOP_OR_SVOP (8 << OCSHIFT)
564#define OA_LOOP (9 << OCSHIFT)
565#define OA_COP (10 << OCSHIFT)
566#define OA_BASEOP_OR_UNOP (11 << OCSHIFT)
567#define OA_FILESTATOP (12 << OCSHIFT)
568#define OA_LOOPEXOP (13 << OCSHIFT)
569
570#define OASHIFT 13
571
572
573#define OA_SCALAR 1
574#define OA_LIST 2
575#define OA_AVREF 3
576#define OA_HVREF 4
577#define OA_CVREF 5
578#define OA_FILEREF 6
579#define OA_SCALARREF 7
580#define OA_OPTIONAL 8
581
582
583
584
585
586
587
588
589
590
591#ifdef USE_ITHREADS
592# define OP_REFCNT_INIT MUTEX_INIT(&PL_op_mutex)
593# ifdef PERL_CORE
594# define OP_REFCNT_LOCK MUTEX_LOCK(&PL_op_mutex)
595# define OP_REFCNT_UNLOCK MUTEX_UNLOCK(&PL_op_mutex)
596# else
597# define OP_REFCNT_LOCK op_refcnt_lock()
598# define OP_REFCNT_UNLOCK op_refcnt_unlock()
599# endif
600# define OP_REFCNT_TERM MUTEX_DESTROY(&PL_op_mutex)
601#else
602# define OP_REFCNT_INIT NOOP
603# define OP_REFCNT_LOCK NOOP
604# define OP_REFCNT_UNLOCK NOOP
605# define OP_REFCNT_TERM NOOP
606#endif
607
608#define OpREFCNT_set(o,n) ((o)->op_targ = (n))
609#ifdef PERL_DEBUG_READONLY_OPS
610# define OpREFCNT_inc(o) Perl_op_refcnt_inc(aTHX_ o)
611# define OpREFCNT_dec(o) Perl_op_refcnt_dec(aTHX_ o)
612#else
613# define OpREFCNT_inc(o) ((o) ? (++(o)->op_targ, (o)) : NULL)
614# define OpREFCNT_dec(o) (--(o)->op_targ)
615#endif
616
617
618#define PERL_LOADMOD_DENY 0x1
619#define PERL_LOADMOD_NOIMPORT 0x2
620#define PERL_LOADMOD_IMPORT_OPS 0x4
621
622#if defined(PERL_IN_PERLY_C) || defined(PERL_IN_OP_C)
623#define ref(o, type) doref(o, type, TRUE)
624#endif
625
626
627#ifndef PERL_CORE
628#define cv_ckproto(cv, gv, p) \
629 cv_ckproto_len((cv), (gv), (p), (p) ? strlen(p) : 0)
630#endif
631
632#ifdef USE_REENTRANT_API
633#include "reentr.h"
634#endif
635
636#if defined(PL_OP_SLAB_ALLOC)
637#define NewOp(m,var,c,type) \
638 (var = (type *) Perl_Slab_Alloc(aTHX_ c*sizeof(type)))
639#define NewOpSz(m,var,size) \
640 (var = (OP *) Perl_Slab_Alloc(aTHX_ size))
641#define FreeOp(p) Perl_Slab_Free(aTHX_ p)
642#else
643#define NewOp(m, var, c, type) \
644 (var = (MEM_WRAP_CHECK_(c,type) \
645 (type*)PerlMemShared_calloc(c, sizeof(type))))
646#define NewOpSz(m, var, size) \
647 (var = (OP*)PerlMemShared_calloc(1, size))
648#define FreeOp(p) PerlMemShared_free(p)
649#endif
650
651#ifdef PERL_MAD
652# define MAD_NULL 1
653# define MAD_PV 2
654# define MAD_OP 3
655# define MAD_SV 4
656
657struct madprop {
658 MADPROP* mad_next;
659 const void *mad_val;
660 U32 mad_vlen;
661
662 char mad_key;
663 char mad_type;
664};
665
666struct token {
667 I32 tk_type;
668 YYSTYPE tk_lval;
669 MADPROP* tk_mad;
670};
671#endif
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757