This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[perl #41484] qr// stack bug
[perl5.git] / op.h
diff --git a/op.h b/op.h
index e33cf2d..746e635 100644 (file)
--- a/op.h
+++ b/op.h
@@ -1,7 +1,7 @@
 /*    op.h
  *
  *    Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- *    2000, 2001, 2002, 2003, 2004, 2005 by Larry Wall and others
+ *    2000, 2001, 2002, 2003, 2004, 2005, 2006 by Larry Wall and others
  *
  *    You may distribute under the terms of either the GNU General Public
  *    License or the Artistic License, as specified in the README file.
  *     op_static       Whether or not the op is statically defined.
  *                     This flag is used by the B::C compiler backend
  *                     and indicates that the op should not be freed.
- *     op_spare        Five spare bits!
+ *
+ *                     See the comments in S_clear_yystack() for more
+ *                     details on the following three flags:
+
+ *     op_latefree     tell op_free() to clear this op (and free any kids)
+ *                     but not yet deallocate the struct. This means that
+ *                     the op may be safely op_free()d multiple times
+ *     op_latefreed    an op_latefree op has been op_free()d
+ *     op_attached     this op (sub)tree has been attached to a CV
+ *
+ *     op_spare        two spare bits!
  *     op_flags        Flags common to all operations.  See OPf_* below.
  *     op_private      Flags peculiar to a particular operation (BUT,
  *                     by default, set to the number of children until
     unsigned   op_type:9;              \
     unsigned   op_opt:1;               \
     unsigned   op_static:1;            \
-    unsigned   op_spare:5;             \
+    unsigned   op_latefree:1;          \
+    unsigned   op_latefreed:1;         \
+    unsigned   op_attached:1;          \
+    unsigned   op_spare:2;             \
     U8         op_flags;               \
     U8         op_private;
 #endif
@@ -354,14 +367,19 @@ struct pmop {
 #define PMf_GLOBAL     0x0100          /* pattern had a g modifier */
 #define PMf_CONTINUE   0x0200          /* don't reset pos() if //g fails */
 #define PMf_EVAL       0x0400          /* evaluating replacement as expr */
-#define PMf_LOCALE     0x0800          /* use locale for character types */
-#define PMf_MULTILINE  0x1000          /* assume multiple lines */
-#define PMf_SINGLELINE 0x2000          /* assume single line */
-#define PMf_FOLD       0x4000          /* case insensitivity */
-#define PMf_EXTENDED   0x8000          /* chuck embedded whitespace */
 
-/* mask of bits stored in regexp->reganch */
-#define PMf_COMPILETIME        (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED)
+/* The following flags have exact equivalents in regcomp.h with the prefix RXf_
+ * which are stored in the regexp->extflags member.
+ */
+#define PMf_LOCALE     0x00800         /* use locale for character types */
+#define PMf_MULTILINE  0x01000         /* assume multiple lines */
+#define PMf_SINGLELINE 0x02000         /* assume single line */
+#define PMf_FOLD       0x04000         /* case insensitivity */
+#define PMf_EXTENDED   0x08000         /* chuck embedded whitespace */
+#define PMf_KEEPCOPY   0x10000         /* copy the string when matching */
+
+/* mask of bits that need to be transfered to re->extflags */
+#define PMf_COMPILETIME        (PMf_MULTILINE|PMf_SINGLELINE|PMf_LOCALE|PMf_FOLD|PMf_EXTENDED|PMf_KEEPCOPY)
 
 #ifdef USE_ITHREADS
 
@@ -452,7 +470,8 @@ struct loop {
 
 #ifdef USE_ITHREADS
 #  define      cGVOPx_gv(o)    ((GV*)PAD_SVl(cPADOPx(o)->op_padix))
-#  define      IS_PADGV(v)     (v && SvTYPE(v) == SVt_PVGV && GvIN_PAD(v))
+#  define      IS_PADGV(v)     (v && SvTYPE(v) == SVt_PVGV && isGV_with_GP(v) \
+                                && GvIN_PAD(v))
 #  define      IS_PADCONST(v)  (v && SvREADONLY(v))
 #  define      cSVOPx_sv(v)    (cSVOPx(v)->op_sv \
                                 ? cSVOPx(v)->op_sv : PAD_SVl((v)->op_targ))
@@ -518,6 +537,15 @@ struct loop {
 #define OA_SCALARREF 7
 #define OA_OPTIONAL 8
 
+/* Op_REFCNT is a reference count at the head of each op tree: needed
+ * since the tree is shared between threads, and between cloned closure
+ * copies in the same thread. OP_REFCNT_LOCK/UNLOCK is used when modifying
+ * this count.
+ * The same mutex is used to protect the refcounts of the reg_trie_data
+ * and reg_ac_data structures, which are shared between duplicated
+ * regexes.
+ */
+
 #ifdef USE_ITHREADS
 #  define OP_REFCNT_INIT               MUTEX_INIT(&PL_op_mutex)
 #  ifdef PERL_CORE
@@ -550,7 +578,8 @@ struct loop {
 
 /* no longer used anywhere in core */
 #ifndef PERL_CORE
-#define cv_ckproto(cv, gv, p) cv_ckproto_len(cv, gv, p, p ? strlen(p) : 0)
+#define cv_ckproto(cv, gv, p) \
+   cv_ckproto_len((cv), (gv), (p), (p) ? strlen(p) : 0)
 #endif
 
 #ifdef USE_REENTRANT_API