Skip to content

Commit

Permalink
Similiarly Perl_newHV() can become a mathom by making newHV() a
Browse files Browse the repository at this point in the history
wrapper around newSV_type() and tweaking Perl_sv_upgrade().

p4raw-id: //depot/perl@32676
  • Loading branch information
nwc10 committed Dec 20, 2007
1 parent ac572bf commit 78ac7dd
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 27 deletions.
2 changes: 1 addition & 1 deletion embed.fnc
Expand Up @@ -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
Expand Down
24 changes: 0 additions & 24 deletions hv.c
Expand Up @@ -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)
{
Expand Down
10 changes: 10 additions & 0 deletions hv.h
Expand Up @@ -527,6 +527,16 @@ struct refcounted_he {
#define HV_FETCH_JUST_SV 0x20
#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
Expand Down
10 changes: 10 additions & 0 deletions mathoms.c
Expand Up @@ -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.
Expand Down Expand Up @@ -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 */

/*
Expand Down
4 changes: 2 additions & 2 deletions proto.h
Expand Up @@ -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__
Expand Down
14 changes: 14 additions & 0 deletions sv.c
Expand Up @@ -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.
Expand Down

0 comments on commit 78ac7dd

Please sign in to comment.