From: Nicholas Clark Date: Thu, 20 Dec 2007 20:23:45 +0000 (+0000) Subject: Similiarly Perl_newHV() can become a mathom by making newHV() a X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=78ac7dd9596fbc525d458adec628f7d991dfe43a;p=p5sagit%2Fp5-mst-13.2.git Similiarly Perl_newHV() can become a mathom by making newHV() a wrapper around newSV_type() and tweaking Perl_sv_upgrade(). p4raw-id: //depot/perl@32676 --- diff --git a/embed.fnc b/embed.fnc index 256f80f..a37d54f 100644 --- 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 --- 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 --- 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 diff --git a/mathoms.c b/mathoms.c index 3caab1b..1ea9f34 100644 --- 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 --- 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 --- 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.