This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Update the FAQ now that Scalar-List-Utils 1.03 has shuffle().
[perl5.git] / op.h
diff --git a/op.h b/op.h
index c9ec2df..789ce58 100644 (file)
--- a/op.h
+++ b/op.h
@@ -1,6 +1,6 @@
 /*    op.h
  *
- *    Copyright (c) 1991-2000, 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.
@@ -55,7 +55,7 @@ typedef U32 PADOFFSET;
 /*
 =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 array context,
+C<G_SCALAR> or C<G_ARRAY> for void, scalar or list context,
 respectively.
 
 =for apidoc Amn|U32|GIMME
@@ -94,7 +94,8 @@ Deprecated.  Use C<GIMME_V> instead.
                                /*  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
@@ -129,9 +130,7 @@ Deprecated.  Use C<GIMME_V> instead.
 /* 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
@@ -140,9 +139,6 @@ Deprecated.  Use C<GIMME_V> instead.
 /* Private for OP_REPEAT */
 #define OPpREPEAT_DOLIST       64      /* List replication. */
 
-/* Private for OP_LEAVELOOP */
-#define OPpLOOP_CONTINUE       64      /* a continue block is present */
-
 /* Private for OP_RV2?V, OP_?ELEM */
 #define OPpDEREF               (32|64) /* Want ref to something: */
 #define OPpDEREF_AV            32      /*   Want ref to AV. */
@@ -160,7 +156,9 @@ Deprecated.  Use C<GIMME_V> instead.
   /* OP_?ELEM only */
 #define OPpLVAL_DEFER          16      /* Defer creation of array/hash elem */
   /* OP_RV2?V, OP_GVSV only */
-#define OPpOUR_INTRO           16      /* Defer creation of array/hash elem */
+#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 */
@@ -186,10 +184,6 @@ Deprecated.  Use C<GIMME_V> instead.
 /* 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 */
-
 /* Private for OP_SORT */
 #define OPpSORT_NUMERIC                1       /* Optimized away { $a <=> $b } */
 #define OPpSORT_INTEGER                2       /* Ditto while under "use integer" */
@@ -197,6 +191,15 @@ Deprecated.  Use C<GIMME_V> instead.
 /* 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
 };
@@ -222,26 +225,48 @@ 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 */
-    REGEXP *   op_pmregexp;            /* compiled expression */
+#ifdef USE_ITHREADS
+    IV          op_pmoffset;
+#else
+    REGEXP *    op_pmregexp;            /* compiled expression */
+#endif
     U16                op_pmflags;
     U16                op_pmpermflags;
     U8         op_pmdynflags;
+#ifdef USE_ITHREADS
+    char *     op_pmstashpv;
+#else
+    HV *       op_pmstash;
+#endif
 };
 
+#ifdef USE_ITHREADS
+#define PM_GETRE(o)     ((REGEXP*)SvIVX(PL_regex_pad[(o)->op_pmoffset]))
+#define PM_SETRE(o,r)   (sv_setiv(PL_regex_pad[(o)->op_pmoffset], (IV)r))
+#define PM_GETRE_SAFE(o) (PL_regex_pad ? PM_GETRE(o) : (REGEXP*)0)
+#define PM_SETRE_SAFE(o,r) if (PL_regex_pad) PM_SETRE(o,r)
+#else
+#define PM_GETRE(o)     ((o)->op_pmregexp)
+#define PM_SETRE(o,r)   ((o)->op_pmregexp = (r))
+#define PM_GETRE_SAFE PM_GETRE
+#define PM_SETRE_SAFE PM_SETRE
+#endif
+
 #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 */
@@ -263,6 +288,20 @@ struct pmop {
 /* mask of bits stored in regexp->reganch */
 #define PMf_COMPILETIME        (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED)
 
+#ifdef USE_ITHREADS
+#  define PmopSTASHPV(o)       ((o)->op_pmstashpv)
+#  define PmopSTASHPV_set(o,pv)        ((o)->op_pmstashpv = ((pv) ? savepv(pv) : Nullch))
+#  define PmopSTASH(o)         (PmopSTASHPV(o) \
+                                ? gv_stashpv(PmopSTASHPV(o),GV_ADD) : Nullhv)
+#  define PmopSTASH_set(o,hv)  PmopSTASHPV_set(o, (hv) ? HvNAME(hv) : Nullch)
+#else
+#  define PmopSTASH(o)         ((o)->op_pmstash)
+#  define PmopSTASH_set(o,hv)  ((o)->op_pmstash = (hv))
+#  define PmopSTASHPV(o)       (PmopSTASH(o) ? HvNAME(PmopSTASH(o)) : Nullch)
+   /* op_pmstash is not refcounted */
+#  define PmopSTASHPV_set(o,pv)        PmopSTASH_set((o), gv_stashpv(pv,GV_ADD))
+#endif
+
 struct svop {
     BASEOP
     SV *       op_sv;
@@ -282,7 +321,6 @@ struct loop {
     BASEOP
     OP *       op_first;
     OP *       op_last;
-    U32                op_children;
     OP *       op_redoop;
     OP *       op_nextop;
     OP *       op_lastop;
@@ -358,7 +396,7 @@ struct loop {
 
 #define Nullop Null(OP*)
 
-/* Lowest byte of PL_opargs */
+/* Lowest byte-and-a-bit of PL_opargs */
 #define OA_MARK 1
 #define OA_FOLDCONST 2
 #define OA_RETSCALAR 4
@@ -401,3 +439,47 @@ 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)
+#else
+#  define OP_REFCNT_INIT               NOOP
+#  define OP_REFCNT_LOCK               NOOP
+#  define OP_REFCNT_UNLOCK             NOOP
+#  define OP_REFCNT_TERM               NOOP
+#endif
+
+#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)
+
+/* flags used by Perl_load_module() */
+#define PERL_LOADMOD_DENY              0x1
+#define PERL_LOADMOD_NOIMPORT          0x2
+#define PERL_LOADMOD_IMPORT_OPS                0x4
+
+#ifdef USE_REENTRANT_API
+
+typedef struct {
+  struct tm* tmbuff;
+} REBUF;
+
+#define localtime(a)       (localtime_r((a),PL_reentrant_buffer->tmbuff) ? PL_reentrant_buffer->tmbuff : NULL)
+#define gmtime(a)          (gmtime_r((a),PL_reentrant_buffer->tmbuff) ?  PL_reentrant_buffer->tmbuff : NULL)
+
+#if defined(__hpux) && defined(__ux_version) && __ux_version <= 1020
+
+/* HP-UX 10.20 returns 0 on success, what it returns on failure is hidden
+   in the fog somewhere, possibly -1 which means the following should do 
+   the right thing - 20010816 sky */
+
+#undef localtime
+#undef gmtime
+#define localtime(a)       ((localtime_r((a),PL_reentrant_buffer->tmbuff) == 0) ? PL_reentrant_buffer->tmbuff : NULL)
+#define gmtime(a)          ((gmtime_r((a),PL_reentrant_buffer->tmbuff) == 0) ? PL_reentrant_buffer->tmbuff : NULL)
+#endif /* HP-UX 10.20 */
+
+#endif
+