Similiarly Perl_newHV() can become a mathom by making newHV() a
Nicholas Clark [Thu, 20 Dec 2007 20:23:45 +0000 (20:23 +0000)]
wrapper around newSV_type() and tweaking Perl_sv_upgrade().

p4raw-id: //depot/perl@32676

embed.fnc
hv.c
hv.h
mathoms.c
proto.h
sv.c

index 256f80f..a37d54f 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -573,7 +573,7 @@ Apa |OP*    |newGVOP        |I32 type|I32 flags|NN GV* gv
 Apa    |GV*    |newGVgen       |NN const char* pack
 Apa    |OP*    |newGVREF       |I32 type|NULLOK OP* o
 ApaR   |OP*    |newHVREF       |NN OP* o
-ApdaR  |HV*    |newHV
+AmdbaR |HV*    |newHV
 ApaR   |HV*    |newHVhv        |NULLOK HV* hv
 Apa    |IO*    |newIO
 Apa    |OP*    |newLISTOP      |I32 type|I32 flags|NULLOK OP* first|NULLOK OP* last
diff --git a/hv.c b/hv.c
index c8279d8..9523fb0 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -1305,30 +1305,6 @@ Perl_hv_ksplit(pTHX_ HV *hv, IV newmax)
     }
 }
 
-/*
-=for apidoc newHV
-
-Creates a new HV.  The reference count is set to 1.
-
-=cut
-*/
-
-HV *
-Perl_newHV(pTHX)
-{
-    register XPVHV* xhv;
-    HV * const hv = (HV*)newSV_type(SVt_PVHV);
-    xhv = (XPVHV*)SvANY(hv);
-    assert(!SvOK(hv));
-#ifndef NODEFAULT_SHAREKEYS
-    HvSHAREKEYS_on(hv);         /* key-sharing on by default */
-#endif
-
-    xhv->xhv_max    = 7;       /* HvMAX(hv) = 7 (start with 8 buckets) */
-    xhv->xhv_fill   = 0;       /* HvFILL(hv) = 0 */
-    return hv;
-}
-
 HV *
 Perl_newHVhv(pTHX_ HV *ohv)
 {
diff --git a/hv.h b/hv.h
index b8d6b7d..dd35ae5 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -528,6 +528,16 @@ struct refcounted_he {
 #define HV_DELETE              0x40
 
 /*
+=for apidoc newHV
+
+Creates a new HV.  The reference count is set to 1.
+
+=cut
+*/
+
+#define newHV()        ((HV*)newSV_type(SVt_PVHV))
+
+/*
  * Local variables:
  * c-indentation-style: bsd
  * c-basic-offset: 4
index 3caab1b..1ea9f34 100644 (file)
--- a/mathoms.c
+++ b/mathoms.c
@@ -67,6 +67,7 @@ PERL_CALLCONV int Perl_fprintf_nocontext(PerlIO *stream, const char *format, ...
 PERL_CALLCONV int Perl_printf_nocontext(const char *format, ...);
 PERL_CALLCONV int Perl_magic_setglob(pTHX_ SV* sv, MAGIC* mg);
 PERL_CALLCONV AV * Perl_newAV(pTHX);
+PERL_CALLCONV HV * Perl_newHV(pTHX);
 
 /* ref() is now a macro using Perl_doref;
  * this version provided for binary compatibility only.
@@ -1338,6 +1339,15 @@ Perl_newAV(pTHX)
     AvMAX(av) = AvFILLp(av) = -1; */
 }
 
+HV *
+Perl_newHV(pTHX)
+{
+    HV * const hv = (HV*)newSV_type(SVt_PVHV);
+    assert(!SvOK(hv));
+
+    return hv;
+}
+
 #endif /* NO_MATHOMS */
 
 /*
diff --git a/proto.h b/proto.h
index 2642512..42b4131 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -1544,9 +1544,9 @@ PERL_CALLCONV OP* Perl_newHVREF(pTHX_ OP* o)
                        __attribute__warn_unused_result__
                        __attribute__nonnull__(pTHX_1);
 
-PERL_CALLCONV HV*      Perl_newHV(pTHX)
+/* PERL_CALLCONV HV*   Perl_newHV(pTHX)
                        __attribute__malloc__
-                       __attribute__warn_unused_result__;
+                       __attribute__warn_unused_result__; */
 
 PERL_CALLCONV HV*      Perl_newHVhv(pTHX_ HV* hv)
                        __attribute__malloc__
diff --git a/sv.c b/sv.c
index eaaa726..8dfd3ac 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -1260,6 +1260,20 @@ Perl_sv_upgrade(pTHX_ register SV *sv, svtype new_type)
                   Lets not write to it, in case it confuses a write-back
                   cache.  */
            }
+       } else {
+           assert(!SvOK(sv));
+           SvOK_off(sv);
+#ifndef NODEFAULT_SHAREKEYS
+           HvSHAREKEYS_on(sv);         /* key-sharing on by default */
+#endif
+           HvMAX(sv) = 7; /* (start with 8 buckets) */
+           if (old_type >= SVt_RV) {
+               HvFILL(sv) = 0;
+           } else {
+               /* It will have been zeroed when the new body was allocated.
+                  Lets not write to it, in case it confuses a write-back
+                  cache.  */
+           }
        }
 
        /* SVt_NULL isn't the only thing upgraded to AV or HV.