This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Groundwork to allow cops and pmops to store the UTF8 flag
authorBrian Fraser <fraserbn@gmail.com>
Tue, 5 Jul 2011 03:13:02 +0000 (00:13 -0300)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 6 Oct 2011 20:00:56 +0000 (13:00 -0700)
With threaded builds, cop.h and op.h get an extra member in their
structs, to save the UTF-8ness of the stash's name.

*STASH_set() checks for the flag, stores it through
*STASH_flags(), and *STASH() uses the latter to fetch the
correct scalar.

cop.h
op.h

diff --git a/cop.h b/cop.h
index 83c8698..626feee 100644 (file)
--- a/cop.h
+++ b/cop.h
@@ -389,6 +389,7 @@ struct cop {
 #ifdef USE_ITHREADS
     char *     cop_stashpv;    /* package line was compiled in */
     char *     cop_file;       /* file name the following line # is from */
+    U32         cop_stashflags; /* currently only SVf_UTF8 */
 #else
     HV *       cop_stash;      /* package line was compiled in */
     GV *       cop_filegv;     /* file the following line # is from */
@@ -433,9 +434,20 @@ struct cop {
 #    define CopSTASHPV_set(c,pv)       ((c)->cop_stashpv = savesharedpv(pv))
 #  endif
 
-#  define CopSTASH(c)          (CopSTASHPV(c) \
-                                ? gv_stashpv(CopSTASHPV(c),GV_ADD) : NULL)
-#  define CopSTASH_set(c,hv)   CopSTASHPV_set(c, (hv) ? HvNAME_get(hv) : NULL)
+#  define CopSTASH_flags(c)            ((c)->cop_stashflags)
+#  define CopSTASH_flags_set(c,flags)  ((c)->cop_stashflags = flags)
+
+#  define CopSTASH(c)          (CopSTASHPV(c)                                 \
+                                ? gv_stashpv(CopSTASHPV(c),                   \
+                                            GV_ADD|(CopSTASH_flags(c)          \
+                                                    ? CopSTASH_flags(c): 0 )) \
+                                 : NULL)
+#  define CopSTASH_set(c,hv)   (CopSTASHPV_set(c, (hv) ? HvNAME_get(hv) : NULL), \
+                                CopSTASH_flags_set(c,                            \
+                                            ((hv) && HvNAME_HEK(hv) &&              \
+                                                     HvNAMEUTF8(hv))                \
+                                                ? SVf_UTF8                          \
+                                                : 0))
 #  define CopSTASH_eq(c,hv)    ((hv) && stashpv_hvname_match(c,hv))
 #  ifdef NETWARE
 #    define CopSTASH_free(c) SAVECOPSTASH_FREE(c)
diff --git a/op.h b/op.h
index 6ae8dd9..02b6652 100644 (file)
--- a/op.h
+++ b/op.h
@@ -351,7 +351,10 @@ struct pmop {
     union {
        OP *    op_pmreplstart; /* Only used in OP_SUBST */
 #ifdef USE_ITHREADS
-       char *  op_pmstashpv;   /* Only used in OP_MATCH, with PMf_ONCE set */
+       struct {
+            char *     op_pmstashpv;   /* Only used in OP_MATCH, with PMf_ONCE set */
+            U32     op_pmstashflags;  /* currently only SVf_UTF8 or 0 */
+        } op_pmstashthr;
 #else
        HV *    op_pmstash;
 #endif
@@ -421,19 +424,27 @@ struct pmop {
 #ifdef USE_ITHREADS
 
 #  define PmopSTASHPV(o)                                               \
-    (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstashpv : NULL)
+    (((o)->op_pmflags & PMf_ONCE) ? (o)->op_pmstashstartu.op_pmstashthr.op_pmstashpv : NULL)
 #  if defined (DEBUGGING) && defined(__GNUC__) && !defined(PERL_GCC_BRACE_GROUPS_FORBIDDEN)
 #    define PmopSTASHPV_set(o,pv)      ({                              \
        assert((o)->op_pmflags & PMf_ONCE);                             \
-       ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv));        \
+       ((o)->op_pmstashstartu.op_pmstashthr.op_pmstashpv = savesharedpv(pv));  \
     })
 #  else
 #    define PmopSTASHPV_set(o,pv)                                      \
-    ((o)->op_pmstashstartu.op_pmstashpv = savesharedpv(pv))
+    ((o)->op_pmstashstartu.op_pmstashthr.op_pmstashpv = savesharedpv(pv))
 #  endif
-#  define PmopSTASH(o)         (PmopSTASHPV(o) \
-                                ? gv_stashpv((o)->op_pmstashstartu.op_pmstashpv,GV_ADD) : NULL)
-#  define PmopSTASH_set(o,hv)  PmopSTASHPV_set(o, ((hv) ? HvNAME_get(hv) : NULL))
+#  define PmopSTASH_flags(o)           ((o)->op_pmstashstartu.op_pmstashthr.op_pmstashflags)
+#  define PmopSTASH_flags_set(o,flags) ((o)->op_pmstashstartu.op_pmstashthr.op_pmstashflags = flags)
+#  define PmopSTASH(o)         (PmopSTASHPV(o)                                     \
+                                ? gv_stashpv((o)->op_pmstashstartu.op_pmstashthr.op_pmstashpv,   \
+                                            GV_ADD | PmopSTASH_flags(o)) : NULL)
+#  define PmopSTASH_set(o,hv)  (PmopSTASHPV_set(o, (hv) ? HvNAME_get(hv) : NULL), \
+                                PmopSTASH_flags_set(o,                            \
+                                            ((hv) && HvNAME_HEK(hv) &&           \
+                                                        HvNAMEUTF8(hv))           \
+                                                ? SVf_UTF8                        \
+                                                : 0))
 #  define PmopSTASH_free(o)    PerlMemShared_free(PmopSTASHPV(o))
 
 #else