This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Two missing 'static's, spotted by Merijn's smoker.
[perl5.git] / hv.h
diff --git a/hv.h b/hv.h
index 8d4088e..7f96a13 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -1,7 +1,7 @@
 /*    hv.h
  *
  *    Copyright (C) 1991, 1992, 1993, 1996, 1997, 1998, 1999,
- *    2000, 2001, 2002, 2003, 2005, 2006, 2007, by Larry Wall and others
+ *    2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008, 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.
@@ -52,6 +52,7 @@ struct mro_meta {
     U32     cache_gen;       /* Bumping this invalidates our method cache */
     U32     pkg_gen;         /* Bumps when local methods/@ISA change */
     const struct mro_alg *mro_which; /* which mro alg is in use? */
+    HV      *isa;            /* Everything this class @ISA */
 };
 
 /* Subject to change.
@@ -165,6 +166,8 @@ is to be expected. (For information only--not to be used).
 =for apidoc AmU||Nullhv
 Null HV pointer.
 
+(deprecated - use C<(HV *)NULL> instead)
+
 =head1 Hash Manipulation Functions
 
 =for apidoc Am|char*|HvNAME|HV* stash
@@ -198,7 +201,18 @@ variable C<PL_na>, though this is rather less efficient than using a local
 variable.  Remember though, that hash keys in perl are free to contain
 embedded nulls, so using C<strlen()> or similar is not a good way to find
 the length of hash keys. This is very similar to the C<SvPV()> macro
-described elsewhere in this document.
+described elsewhere in this document. See also C<HeUTF8>.
+
+If you are using C<HePV> to get values to pass to C<newSVpvn()> to create a
+new SV, you should consider using C<newSVhek(HeKEY_hek(he))> as it is more
+efficient.
+
+=for apidoc Am|char*|HeUTF8|HE* he|STRLEN len
+Returns whether the C<char *> value returned by C<HePV> is encoded in UTF-8,
+doing any necessary dereferencing of possibly C<SV*> keys.  The value returned
+will be 0 or non-0, not necessarily 1 (or even a value with any low bits set),
+so B<do not> blindly assign this to a C<bool> variable, as C<bool> may be a
+typedef for C<char>.
 
 =for apidoc Am|SV*|HeSVKEY|HE* he
 Returns the key as an C<SV*>, or C<NULL> if the hash entry does not
@@ -219,8 +233,9 @@ C<SV*>.
 /* these hash entry flags ride on hent_klen (for use only in magic/tied HVs) */
 #define HEf_SVKEY      -2      /* hent_key is an SV* */
 
-
-#define Nullhv Null(HV*)
+#ifndef PERL_CORE
+#  define Nullhv Null(HV*)
+#endif
 #define HvARRAY(hv)    ((hv)->sv_u.svu_hash)
 #define HvFILL(hv)     ((XPVHV*)  SvANY(hv))->xhv_fill
 #define HvMAX(hv)      ((XPVHV*)  SvANY(hv))->xhv_max
@@ -289,7 +304,9 @@ C<SV*>.
 #define HvREHASH_on(hv)                (SvFLAGS(hv) |= SVphv_REHASH)
 #define HvREHASH_off(hv)       (SvFLAGS(hv) &= ~SVphv_REHASH)
 
-#define Nullhe Null(HE*)
+#ifndef PERL_CORE
+#  define Nullhe Null(HE*)
+#endif
 #define HeNEXT(he)             (he)->hent_next
 #define HeKEY_hek(he)          (he)->hent_hek
 #define HeKEY(he)              HEK_KEY(HeKEY_hek(he))
@@ -305,6 +322,9 @@ C<SV*>.
 #define HePV(he,lp)            ((HeKLEN(he) == HEf_SVKEY) ?            \
                                 SvPV(HeKEY_sv(he),lp) :                \
                                 ((lp = HeKLEN(he)), HeKEY(he)))
+#define HeUTF8(he)             ((HeKLEN(he) == HEf_SVKEY) ?            \
+                                SvUTF8(HeKEY_sv(he)) :                 \
+                                (U32)HeKUTF8(he))
 
 #define HeSVKEY(he)            ((HeKEY(he) &&                          \
                                  HeKLEN(he) == HEf_SVKEY) ?            \
@@ -313,12 +333,14 @@ C<SV*>.
 #define HeSVKEY_force(he)      (HeKEY(he) ?                            \
                                 ((HeKLEN(he) == HEf_SVKEY) ?           \
                                  HeKEY_sv(he) :                        \
-                                 sv_2mortal(newSVpvn(HeKEY(he),        \
-                                                    HeKLEN(he)))) :    \
+                                 newSVpvn_flags(HeKEY(he),             \
+                                                HeKLEN(he), SVs_TEMP)) : \
                                 &PL_sv_undef)
 #define HeSVKEY_set(he,sv)     ((HeKLEN(he) = HEf_SVKEY), (HeKEY_sv(he) = sv))
 
-#define Nullhek Null(HEK*)
+#ifndef PERL_CORE
+#  define Nullhek Null(HEK*)
+#endif
 #define HEK_BASESIZE           STRUCT_OFFSET(HEK, hek_key[0])
 #define HEK_HASH(hek)          (hek)->hek_hash
 #define HEK_LEN(hek)           (hek)->hek_len
@@ -385,42 +407,42 @@ C<SV*>.
        ->shared_he_he.he_valu.hent_refcount),                          \
      hek)
 
-#define hv_store_ent(zlonk, awk, touche, zgruppp)                      \
-    ((HE *) hv_common((zlonk), (awk), NULL, 0, 0, HV_FETCH_ISSTORE,    \
-                     (touche), (zgruppp)))
+#define hv_store_ent(hv, keysv, val, hash)                             \
+    ((HE *) hv_common((hv), (keysv), NULL, 0, 0, HV_FETCH_ISSTORE,     \
+                     (val), (hash)))
 
-#define hv_exists_ent(zlonk, awk, zgruppp)                             \
-    (hv_common((zlonk), (awk), NULL, 0, 0, HV_FETCH_ISEXISTS, 0, (zgruppp))\
+#define hv_exists_ent(hv, keysv, hash)                                 \
+    (hv_common((hv), (keysv), NULL, 0, 0, HV_FETCH_ISEXISTS, 0, (hash))        \
      ? TRUE : FALSE)
-#define hv_fetch_ent(zlonk, awk, touche, zgruppp)                      \
-    ((HE *) hv_common((zlonk), (awk), NULL, 0, 0,                      \
-                     ((touche) ? HV_FETCH_LVALUE : 0), NULL, (zgruppp)))
-#define hv_delete_ent(zlonk, awk, touche, zgruppp)                     \
-    ((SV *) hv_common((zlonk), (awk), NULL, 0, 0, (touche) | HV_DELETE,        \
-                     NULL, (zgruppp)))
-
-#define hv_store_flags(urkk, zamm, clunk, thwape, sploosh, eee_yow)    \
-    ((SV**) hv_common((urkk), NULL, (zamm), (clunk), (eee_yow),                \
-                     (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), (thwape),    \
-                     (sploosh)))
-
-#define hv_store(urkk, zamm, clunk, thwape, sploosh)                   \
-    ((SV**) hv_common_key_len((urkk), (zamm), (clunk),                 \
+#define hv_fetch_ent(hv, keysv, lval, hash)                            \
+    ((HE *) hv_common((hv), (keysv), NULL, 0, 0,                       \
+                     ((lval) ? HV_FETCH_LVALUE : 0), NULL, (hash)))
+#define hv_delete_ent(hv, key, flags, hash)                            \
+    ((SV *) hv_common((hv), (key), NULL, 0, 0, (flags) | HV_DELETE,    \
+                     NULL, (hash)))
+
+#define hv_store_flags(hv, key, klen, val, hash, flags)                        \
+    ((SV**) hv_common((hv), NULL, (key), (klen), (flags),              \
+                     (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV), (val),       \
+                     (hash)))
+
+#define hv_store(hv, key, klen, val, hash)                             \
+    ((SV**) hv_common_key_len((hv), (key), (klen),                     \
                              (HV_FETCH_ISSTORE|HV_FETCH_JUST_SV),      \
-                             (thwape), (sploosh)))
+                             (val), (hash)))
 
-#define hv_exists(urkk, zamm, clunk)                                   \
-    (hv_common_key_len((urkk), (zamm), (clunk), HV_FETCH_ISEXISTS, NULL, 0) \
+#define hv_exists(hv, key, klen)                                       \
+    (hv_common_key_len((hv), (key), (klen), HV_FETCH_ISEXISTS, NULL, 0) \
      ? TRUE : FALSE)
 
-#define hv_fetch(urkk, zamm, clunk, pam)                               \
-    ((SV**) hv_common_key_len((urkk), (zamm), (clunk), (pam)           \
+#define hv_fetch(hv, key, klen, lval)                                  \
+    ((SV**) hv_common_key_len((hv), (key), (klen), (lval)              \
                              ? (HV_FETCH_JUST_SV | HV_FETCH_LVALUE)    \
                              : HV_FETCH_JUST_SV, NULL, 0))
 
-#define hv_delete(urkk, zamm, clunk, pam)                              \
-    ((SV*) hv_common_key_len((urkk), (zamm), (clunk),                  \
-                            (pam) | HV_DELETE, NULL, 0))
+#define hv_delete(hv, key, klen, flags)                                        \
+    ((SV*) hv_common_key_len((hv), (key), (klen),                      \
+                            (flags) | HV_DELETE, NULL, 0))
 
 /* This refcounted he structure is used for storing the hints used for lexical
    pragmas. Without threads, it's basically struct he + refcount.