This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Retract the #8838 and #8840 for now because of
[perl5.git] / op.h
diff --git a/op.h b/op.h
index 5231a41..b1b11a5 100644 (file)
--- a/op.h
+++ b/op.h
@@ -1,6 +1,6 @@
 /*    op.h
  *
- *    Copyright (c) 1991-1999, Larry Wall
+ *    Copyright (c) 1991-2001, Larry Wall
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
@@ -52,6 +52,20 @@ typedef U32 PADOFFSET;
         ((op)->op_flags & OPf_WANT) == OPf_WANT_LIST   ? G_ARRAY   : \
         dfl)
 
+/*
+=for apidoc Amn|U32|GIMME_V
+The XSUB-writer's equivalent to Perl's C<wantarray>.  Returns C<G_VOID>,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
+respectively.
+
+=for apidoc Amn|U32|GIMME
+A backward-compatible version of C<GIMME_V> which can only return
+C<G_SCALAR> or C<G_ARRAY>; in a void context, it returns C<G_SCALAR>.
+Deprecated.  Use C<GIMME_V> instead.
+
+=cut
+*/
+
 #define GIMME_V                OP_GIMME(PL_op, block_gimme())
 
 /* Public flags */
@@ -77,13 +91,16 @@ typedef U32 PADOFFSET;
                                /*  On flipflop, we saw ... instead of .. */
                                /*  On UNOPs, saw bare parens, e.g. eof(). */
                                /*  On OP_ENTERSUB || OP_NULL, saw a "do". */
+                               /*  On OP_EXISTS, treat av as av, not avhv.  */
                                /*  On OP_(ENTER|LEAVE)EVAL, don't clear $@ */
                                /*  On OP_ENTERITER, loop var is per-thread */
-                                /*  On pushre, re is /\s+/ imp. by split " " */
+                               /*  On pushre, re is /\s+/ imp. by split " " */
+                               /*  On regcomp, "use re 'eval'" was in scope */
 
 /* old names; don't use in new code, but don't break them, either */
 #define OPf_LIST       OPf_WANT_LIST
 #define OPf_KNOW       OPf_WANT
+
 #define GIMME \
          (PL_op->op_flags & OPf_WANT                                   \
           ? ((PL_op->op_flags & OPf_WANT) == OPf_WANT_LIST             \
@@ -91,6 +108,9 @@ typedef U32 PADOFFSET;
              : G_SCALAR)                                               \
           : dowantarray())
 
+/* NOTE: OP_NEXTSTATE, OP_DBSTATE, and OP_SETSTATE (i.e. COPs) carry lower
+ * bits of PL_hints in op_private */
+
 /* Private for lvalues */
 #define OPpLVAL_INTRO  128     /* Lvalue must be localized or lvalue sub */
 
@@ -99,6 +119,7 @@ typedef U32 PADOFFSET;
 
 /* Private for OP_AASSIGN */
 #define OPpASSIGN_COMMON       64      /* Left & right have syms in common. */
+#define OPpASSIGN_HASH         32      /* Assigning to possible pseudohash. */
 
 /* Private for OP_SASSIGN */
 #define OPpASSIGN_BACKWARDS    64      /* Left & right switched. */
@@ -109,9 +130,7 @@ typedef U32 PADOFFSET;
 /* Private for OP_TRANS */
 #define OPpTRANS_FROM_UTF      1
 #define OPpTRANS_TO_UTF                2
-#define OPpTRANS_IDENTICAL     4
-       /* When CU or UC, means straight latin-1 to utf-8 or vice versa */
-       /* Otherwise, IDENTICAL means the right side is the same as the left */
+#define OPpTRANS_IDENTICAL     4       /* right side is same as left */
 #define OPpTRANS_SQUASH                8
 #define OPpTRANS_DELETE                16
 #define OPpTRANS_COMPLEMENT    32
@@ -136,7 +155,11 @@ typedef U32 PADOFFSET;
 #define OPpEARLY_CV            32      /* foo() called before sub foo was parsed */
   /* OP_?ELEM only */
 #define OPpLVAL_DEFER          16      /* Defer creation of array/hash elem */
-  /* for OP_RV2?V, lower bits carry hints */
+  /* OP_RV2?V, OP_GVSV only */
+#define OPpOUR_INTRO           16      /* Variable was in an our() */
+  /* OP_RV2[AH]V, OP_PAD[AH]V, OP_[AH]ELEM */
+#define OPpMAYBE_LVSUB         8       /* We might be an lvalue to return */
+  /* for OP_RV2?V, lower bits carry hints (currently only HINT_STRICT_REFS) */
 
 /* Private for OPs with TARGLEX */
   /* (lower bits may carry MAXARG) */
@@ -158,6 +181,9 @@ typedef U32 PADOFFSET;
 /* Private for OP_DELETE */
 #define OPpSLICE               64      /* Operating on a list of keys */
 
+/* Private for OP_EXISTS */
+#define OPpEXISTS_SUB          64      /* Checking for &sub, not {} or [].  */
+
 /* Private for OP_SORT, OP_PRTF, OP_SPRINTF, OP_FTTEXT, OP_FTBINARY, */
 /*             string comparisons, and case changers. */
 #define OPpLOCALE              64      /* Use locale */
@@ -169,6 +195,15 @@ typedef U32 PADOFFSET;
 /* Private for OP_THREADSV */
 #define OPpDONE_SVREF          64      /* Been through newSVREF once */
 
+/* Private for OP_OPEN and OP_BACKTICK */
+#define OPpOPEN_IN_RAW         16      /* binmode(F,":raw") on input fh */
+#define OPpOPEN_IN_CRLF                32      /* binmode(F,":crlf") on input fh */
+#define OPpOPEN_OUT_RAW                64      /* binmode(F,":raw") on output fh */
+#define OPpOPEN_OUT_CRLF       128     /* binmode(F,":crlf") on output fh */
+
+/* Private for OP_EXIT */
+#define OPpEXIT_VMSISH         128     /* exit(0) vs. exit(1) vmsish mode*/
+
 struct op {
     BASEOP
 };
@@ -194,14 +229,12 @@ struct listop {
     BASEOP
     OP *       op_first;
     OP *       op_last;
-    U32                op_children;
 };
 
 struct pmop {
     BASEOP
     OP *       op_first;
     OP *       op_last;
-    U32                op_children;
     OP *       op_pmreplroot;
     OP *       op_pmreplstart;
     PMOP *     op_pmnext;              /* list of all scanpats */
@@ -213,6 +246,10 @@ struct pmop {
 
 #define PMdf_USED      0x01            /* pm has been used once already */
 #define PMdf_TAINTED   0x02            /* pm compiled from tainted pattern */
+#define PMdf_UTF8      0x04            /* pm compiled from utf8 data */
+#define PMdf_DYN_UTF8  0x08
+
+#define PMdf_CMP_UTF8  (PMdf_UTF8|PMdf_DYN_UTF8)
 
 #define PMf_RETAINT    0x0001          /* taint $1 etc. if target tainted */
 #define PMf_ONCE       0x0002          /* use pattern only once per reset */
@@ -253,7 +290,6 @@ struct loop {
     BASEOP
     OP *       op_first;
     OP *       op_last;
-    U32                op_children;
     OP *       op_redoop;
     OP *       op_nextop;
     OP *       op_lastop;
@@ -372,3 +408,25 @@ struct loop {
 #define OA_SCALARREF 7
 #define OA_OPTIONAL 8
 
+#ifdef USE_ITHREADS
+#  define OP_REFCNT_INIT               MUTEX_INIT(&PL_op_mutex)
+#  define OP_REFCNT_LOCK               MUTEX_LOCK(&PL_op_mutex)
+#  define OP_REFCNT_UNLOCK             MUTEX_UNLOCK(&PL_op_mutex)
+#  define OP_REFCNT_TERM               MUTEX_DESTROY(&PL_op_mutex)
+#  define OpREFCNT_set(o,n)            ((o)->op_targ = (n))
+#  define OpREFCNT_inc(o)              ((o) ? (++(o)->op_targ, (o)) : Nullop)
+#  define OpREFCNT_dec(o)              (--(o)->op_targ)
+#else
+#  define OP_REFCNT_INIT               NOOP
+#  define OP_REFCNT_LOCK               NOOP
+#  define OP_REFCNT_UNLOCK             NOOP
+#  define OP_REFCNT_TERM               NOOP
+#  define OpREFCNT_set(o,n)            NOOP
+#  define OpREFCNT_inc(o)              (o)
+#  define OpREFCNT_dec(o)              0
+#endif
+
+/* flags used by Perl_load_module() */
+#define PERL_LOADMOD_DENY              0x1
+#define PERL_LOADMOD_NOIMPORT          0x2
+#define PERL_LOADMOD_IMPORT_OPS                0x4