Skip to content

Commit bfcb351

Browse files
committed
Move hv_name, hv_eiter and hv_riter into a new aux structure.
Provide (more efficient) _get and _set macros. Adjust the core to use them. p4raw-id: //depot/perl@24526
1 parent ca73285 commit bfcb351

File tree

24 files changed

+426
-187
lines changed

24 files changed

+426
-187
lines changed

dump.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,9 +1060,10 @@ Perl_magic_dump(pTHX_ const MAGIC *mg)
10601060
void
10611061
Perl_do_hv_dump(pTHX_ I32 level, PerlIO *file, const char *name, HV *sv)
10621062
{
1063+
const char *hvname;
10631064
Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
1064-
if (sv && HvNAME(sv))
1065-
PerlIO_printf(file, "\t\"%s\"\n", HvNAME(sv));
1065+
if (sv && (hvname = HvNAME_get(sv)))
1066+
PerlIO_printf(file, "\t\"%s\"\n", hvname);
10661067
else
10671068
PerlIO_putc(file, '\n');
10681069
}
@@ -1082,9 +1083,10 @@ Perl_do_gvgv_dump(pTHX_ I32 level, PerlIO *file, const char *name, GV *sv)
10821083
{
10831084
Perl_dump_indent(aTHX_ level, file, "%s = 0x%"UVxf, name, PTR2UV(sv));
10841085
if (sv && GvNAME(sv)) {
1086+
const char *hvname;
10851087
PerlIO_printf(file, "\t\"");
1086-
if (GvSTASH(sv) && HvNAME(GvSTASH(sv)))
1087-
PerlIO_printf(file, "%s\" :: \"", HvNAME(GvSTASH(sv)));
1088+
if (GvSTASH(sv) && (hvname = HvNAME_get(GvSTASH(sv))))
1089+
PerlIO_printf(file, "%s\" :: \"", hvname);
10881090
PerlIO_printf(file, "%s\"\n", GvNAME(sv));
10891091
}
10901092
else
@@ -1420,17 +1422,20 @@ Perl_do_sv_dump(pTHX_ I32 level, PerlIO *file, SV *sv, I32 nest, I32 maxnest, bo
14201422
Perl_dump_indent(aTHX_ level, file, " KEYS = %"IVdf"\n", (IV)HvKEYS(sv));
14211423
Perl_dump_indent(aTHX_ level, file, " FILL = %"IVdf"\n", (IV)HvFILL(sv));
14221424
Perl_dump_indent(aTHX_ level, file, " MAX = %"IVdf"\n", (IV)HvMAX(sv));
1423-
Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER(sv));
1424-
Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER(sv)));
1425+
Perl_dump_indent(aTHX_ level, file, " RITER = %"IVdf"\n", (IV)HvRITER_get(sv));
1426+
Perl_dump_indent(aTHX_ level, file, " EITER = 0x%"UVxf"\n", PTR2UV(HvEITER_get(sv)));
14251427
{
14261428
MAGIC *mg = mg_find(sv, PERL_MAGIC_symtab);
14271429
if (mg && mg->mg_obj) {
14281430
Perl_dump_indent(aTHX_ level, file, " PMROOT = 0x%"UVxf"\n", PTR2UV(mg->mg_obj));
14291431
}
14301432
}
1431-
if (HvNAME(sv))
1432-
Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", HvNAME(sv));
1433-
if (nest < maxnest && !HvEITER(sv)) { /* Try to preserve iterator */
1433+
{
1434+
const char *hvname = HvNAME_get(sv);
1435+
if (hvname)
1436+
Perl_dump_indent(aTHX_ level, file, " NAME = \"%s\"\n", hvname);
1437+
}
1438+
if (nest < maxnest && !HvEITER_get(sv)) { /* Try to preserve iterator */
14341439
HE *he;
14351440
HV *hv = (HV*)sv;
14361441
int count = maxnest - nest;

embed.fnc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1397,7 +1397,12 @@ sM |HE* |hv_fetch_common|HV* tb|SV* key_sv|const char* key|STRLEN klen|int flags
13971397
Apd |void |hv_clear_placeholders|HV* hb
13981398

13991399
Apd |SV* |hv_scalar |HV* hv|
1400-
1400+
Apo |I32* |hv_riter_p |HV* hv
1401+
Apo |HE** |hv_eiter_p |HV* hv
1402+
Apo |void |hv_riter_set |HV* hv|I32 riter
1403+
Apo |void |hv_eiter_set |HV* hv|HE* eiter
1404+
Apo |char** |hv_name_p |HV* hv
1405+
Apo |void |hv_name_set |HV* hv|const char *|STRLEN len|int flags
14011406
Apo |I32* |hv_placeholders_p |HV* hv
14021407
Apo |I32 |hv_placeholders_get |HV* hv
14031408
Apo |void |hv_placeholders_set |HV* hv|I32 ph

ext/Data/Dumper/Dumper.xs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ static I32 DD_dump (pTHX_ SV *val, char *name, STRLEN namelen, SV *retval,
1414
I32 purity, I32 deepcopy, I32 quotekeys, SV *bless,
1515
I32 maxdepth, SV *sortkeys);
1616

17+
#ifndef HvNAME_get
18+
#define HvNAME_get HvNAME
19+
#endif
20+
1721
#if PERL_VERSION <= 6 /* Perl 5.6 and earlier */
1822

1923
# ifdef EBCDIC
@@ -281,7 +285,7 @@ DD_dump(pTHX_ SV *val, char *name, STRLEN namelen, SV *retval, HV *seenhv,
281285
(void) sprintf(id, "0x%"UVxf, PTR2UV(ival));
282286
idlen = strlen(id);
283287
if (SvOBJECT(ival))
284-
realpack = HvNAME(SvSTASH(ival));
288+
realpack = HvNAME_get(SvSTASH(ival));
285289
else
286290
realpack = Nullch;
287291

ext/Devel/DProf/DProf.xs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ dprof_dbg_sub_notify(pTHX_ SV *Sub) {
4242
GV *gv = cv ? CvGV(cv) : NULL;
4343
if (cv && gv) {
4444
warn("XS DBsub(%s::%s)\n",
45-
((GvSTASH(gv) && HvNAME(GvSTASH(gv))) ?
46-
HvNAME(GvSTASH(gv)) : "(null)"),
45+
((GvSTASH(gv) && HvNAME_get(GvSTASH(gv))) ?
46+
HvNAME_get(GvSTASH(gv)) : "(null)"),
4747
GvNAME(gv));
4848
} else {
4949
warn("XS DBsub(unknown) at %x", Sub);
@@ -371,9 +371,8 @@ prof_mark(pTHX_ opcode ptype)
371371

372372
cv = db_get_cv(aTHX_ Sub);
373373
gv = CvGV(cv);
374-
pname = ((GvSTASH(gv) && HvNAME(GvSTASH(gv)))
375-
? HvNAME(GvSTASH(gv))
376-
: (char *) "(null)");
374+
pname = GvSTASH(gv) ? HvNAME_get(GvSTASH(gv)) : 0;
375+
pname = pname ? pname : (char *) "(null)";
377376
gname = GvNAME(gv);
378377

379378
set_cv_key(aTHX_ cv, pname, gname);

ext/Opcode/Opcode.xs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -268,9 +268,9 @@ PPCODE:
268268

269269
hv = gv_stashpv(Package, GV_ADDWARN); /* should exist already */
270270

271-
if (strNE(HvNAME(hv),"main")) {
272-
Safefree(HvNAME(hv));
273-
HvNAME(hv) = savepv("main"); /* make it think it's in main:: */
271+
if (strNE(HvNAME_get(hv),"main")) {
272+
/* make it think it's in main:: */
273+
Perl_hv_name_set(aTHX_ hv, "main", 4, 0);
274274
hv_store(hv,"_",1,(SV *)PL_defgv,0); /* connect _ to global */
275275
SvREFCNT_inc((SV *)PL_defgv); /* want to keep _ around! */
276276
}

ext/PerlIO/via/via.xs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ PerlIOVia_fetchmethod(pTHX_ PerlIOVia * s, char *method, CV ** save)
4545
{
4646
GV *gv = gv_fetchmeth(s->stash, method, strlen(method), 0);
4747
#if 0
48-
Perl_warn(aTHX_ "Lookup %s::%s => %p", HvNAME(s->stash), method, gv);
48+
Perl_warn(aTHX_ "Lookup %s::%s => %p", HvNAME_get(s->stash), method, gv);
4949
#endif
5050
if (gv) {
5151
return *save = GvCV(gv);
@@ -87,7 +87,7 @@ PerlIOVia_method(pTHX_ PerlIO * f, char *method, CV ** save, int flags,
8787
}
8888
if (*PerlIONext(f)) {
8989
if (!s->fh) {
90-
GV *gv = newGVgen(HvNAME(s->stash));
90+
GV *gv = newGVgen(HvNAME_get(s->stash));
9191
GvIOp(gv) = newIO();
9292
s->fh = newRV_noinc((SV *) gv);
9393
s->io = GvIOp(gv);

ext/Storable/Storable.xs

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,24 @@ typedef double NV; /* Older perls lack the NV type */
107107
#define dVAR dNOOP
108108
#endif
109109

110+
#ifndef HvRITER_set
111+
# define HvRITER_set(hv,r) (*HvRITER(hv) = r)
112+
#endif
113+
#ifndef HvEITER_set
114+
# define HvEITER_set(hv,r) (*HvEITER(hv) = r)
115+
#endif
116+
117+
#ifndef HvRITER_get
118+
# define HvRITER_get HvRITER
119+
#endif
120+
#ifndef HvEITER_get
121+
# define HvEITER_get HvEITER
122+
#endif
123+
124+
#ifndef HvNAME_get
125+
#define HvNAME_get HvNAME
126+
#endif
127+
110128
#ifndef HvPLACEHOLDERS_get
111129
# define HvPLACEHOLDERS_get HvPLACEHOLDERS
112130
#endif
@@ -1637,6 +1655,8 @@ static SV *pkg_fetchmeth(
16371655
{
16381656
GV *gv;
16391657
SV *sv;
1658+
const char *hvname = HvNAME_get(pkg);
1659+
16401660

16411661
/*
16421662
* The following code is the same as the one performed by UNIVERSAL::can
@@ -1646,18 +1666,18 @@ static SV *pkg_fetchmeth(
16461666
gv = gv_fetchmethod_autoload(pkg, method, FALSE);
16471667
if (gv && isGV(gv)) {
16481668
sv = newRV((SV*) GvCV(gv));
1649-
TRACEME(("%s->%s: 0x%"UVxf, HvNAME(pkg), method, PTR2UV(sv)));
1669+
TRACEME(("%s->%s: 0x%"UVxf, hvname, method, PTR2UV(sv)));
16501670
} else {
16511671
sv = newSVsv(&PL_sv_undef);
1652-
TRACEME(("%s->%s: not found", HvNAME(pkg), method));
1672+
TRACEME(("%s->%s: not found", hvname, method));
16531673
}
16541674

16551675
/*
16561676
* Cache the result, ignoring failure: if we can't store the value,
16571677
* it just won't be cached.
16581678
*/
16591679

1660-
(void) hv_store(cache, HvNAME(pkg), strlen(HvNAME(pkg)), sv, 0);
1680+
(void) hv_store(cache, hvname, strlen(hvname), sv, 0);
16611681

16621682
return SvOK(sv) ? sv : (SV *) 0;
16631683
}
@@ -1673,8 +1693,9 @@ static void pkg_hide(
16731693
HV *pkg,
16741694
char *method)
16751695
{
1696+
const char *hvname = HvNAME_get(pkg);
16761697
(void) hv_store(cache,
1677-
HvNAME(pkg), strlen(HvNAME(pkg)), newSVsv(&PL_sv_undef), 0);
1698+
hvname, strlen(hvname), newSVsv(&PL_sv_undef), 0);
16781699
}
16791700

16801701
/*
@@ -1688,7 +1709,8 @@ static void pkg_uncache(
16881709
HV *pkg,
16891710
char *method)
16901711
{
1691-
(void) hv_delete(cache, HvNAME(pkg), strlen(HvNAME(pkg)), G_DISCARD);
1712+
const char *hvname = HvNAME_get(pkg);
1713+
(void) hv_delete(cache, hvname, strlen(hvname), G_DISCARD);
16921714
}
16931715

16941716
/*
@@ -1707,8 +1729,9 @@ static SV *pkg_can(
17071729
{
17081730
SV **svh;
17091731
SV *sv;
1732+
const char *hvname = HvNAME_get(pkg);
17101733

1711-
TRACEME(("pkg_can for %s->%s", HvNAME(pkg), method));
1734+
TRACEME(("pkg_can for %s->%s", hvname, method));
17121735

17131736
/*
17141737
* Look into the cache to see whether we already have determined
@@ -1718,15 +1741,15 @@ static SV *pkg_can(
17181741
* that only one hook (i.e. always the same) is cached in a given cache.
17191742
*/
17201743

1721-
svh = hv_fetch(cache, HvNAME(pkg), strlen(HvNAME(pkg)), FALSE);
1744+
svh = hv_fetch(cache, hvname, strlen(hvname), FALSE);
17221745
if (svh) {
17231746
sv = *svh;
17241747
if (!SvOK(sv)) {
1725-
TRACEME(("cached %s->%s: not found", HvNAME(pkg), method));
1748+
TRACEME(("cached %s->%s: not found", hvname, method));
17261749
return (SV *) 0;
17271750
} else {
17281751
TRACEME(("cached %s->%s: 0x%"UVxf,
1729-
HvNAME(pkg), method, PTR2UV(sv)));
1752+
hvname, method, PTR2UV(sv)));
17301753
return sv;
17311754
}
17321755
}
@@ -2260,8 +2283,8 @@ static int store_hash(pTHX_ stcxt_t *cxt, HV *hv)
22602283
* Save possible iteration state via each() on that table.
22612284
*/
22622285

2263-
riter = HvRITER(hv);
2264-
eiter = HvEITER(hv);
2286+
riter = HvRITER_get(hv);
2287+
eiter = HvEITER_get(hv);
22652288
hv_iterinit(hv);
22662289

22672290
/*
@@ -2529,8 +2552,8 @@ static int store_hash(pTHX_ stcxt_t *cxt, HV *hv)
25292552
TRACEME(("ok (hash 0x%"UVxf")", PTR2UV(hv)));
25302553

25312554
out:
2532-
HvRITER(hv) = riter; /* Restore hash iterator state */
2533-
HvEITER(hv) = eiter;
2555+
HvRITER_set(hv, riter); /* Restore hash iterator state */
2556+
HvEITER_set(hv, eiter);
25342557

25352558
return ret;
25362559
}
@@ -2835,7 +2858,7 @@ static int store_hook(
28352858
char mtype = '\0'; /* for blessed ref to tied structures */
28362859
unsigned char eflags = '\0'; /* used when object type is SHT_EXTRA */
28372860

2838-
TRACEME(("store_hook, classname \"%s\", tagged #%d", HvNAME(pkg), cxt->tagnum));
2861+
TRACEME(("store_hook, classname \"%s\", tagged #%d", HvNAME_get(pkg), cxt->tagnum));
28392862

28402863
/*
28412864
* Determine object type on 2 bits.
@@ -2886,7 +2909,7 @@ static int store_hook(
28862909
}
28872910
flags = SHF_NEED_RECURSE | obj_type;
28882911

2889-
classname = HvNAME(pkg);
2912+
classname = HvNAME_get(pkg);
28902913
len = strlen(classname);
28912914

28922915
/*
@@ -3254,7 +3277,7 @@ static int store_blessed(
32543277
char *classname;
32553278
I32 classnum;
32563279

3257-
TRACEME(("store_blessed, type %d, class \"%s\"", type, HvNAME(pkg)));
3280+
TRACEME(("store_blessed, type %d, class \"%s\"", type, HvNAME_get(pkg)));
32583281

32593282
/*
32603283
* Look for a hook for this blessed SV and redirect to store_hook()
@@ -3269,7 +3292,7 @@ static int store_blessed(
32693292
* This is a blessed SV without any serialization hook.
32703293
*/
32713294

3272-
classname = HvNAME(pkg);
3295+
classname = HvNAME_get(pkg);
32733296
len = strlen(classname);
32743297

32753298
TRACEME(("blessed 0x%"UVxf" in %s, no hook: tagged #%d",
@@ -4511,7 +4534,7 @@ static SV *retrieve_overloaded(pTHX_ stcxt_t *cxt, char *cname)
45114534
}
45124535
if (!Gv_AMG(stash)) {
45134536
SV *psv = newSVpvn("require ", 8);
4514-
const char *package = HvNAME(stash);
4537+
const char *package = HvNAME_get(stash);
45154538
sv_catpv(psv, package);
45164539

45174540
TRACEME(("No overloading defined for package %s", package));

ext/threads/shared/shared.xs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -529,7 +529,7 @@ sharedsv_scalar_store(pTHX_ SV *sv, shared_sv *shared)
529529
sv_setsv_nomg(SHAREDSvPTR(shared), tmp);
530530
SvREFCNT_dec(tmp);
531531
if(SvOBJECT(SvRV(sv))) {
532-
SV* fake_stash = newSVpv(HvNAME(SvSTASH(SvRV(sv))),0);
532+
SV* fake_stash = newSVpv(HvNAME_get(SvSTASH(SvRV(sv))),0);
533533
SvOBJECT_on(SHAREDSvPTR(target));
534534
SvSTASH_set(SHAREDSvPTR(target), (HV*)fake_stash);
535535
}
@@ -544,7 +544,7 @@ sharedsv_scalar_store(pTHX_ SV *sv, shared_sv *shared)
544544
SHARED_CONTEXT;
545545
sv_setsv_nomg(SHAREDSvPTR(shared), sv);
546546
if(SvOBJECT(sv)) {
547-
SV* fake_stash = newSVpv(HvNAME(SvSTASH(sv)),0);
547+
SV* fake_stash = newSVpv(HvNAME_get(SvSTASH(sv)),0);
548548
SvOBJECT_on(SHAREDSvPTR(shared));
549549
SvSTASH_set(SHAREDSvPTR(shared), (HV*)fake_stash);
550550
}
@@ -1294,7 +1294,7 @@ bless(SV* ref, ...);
12941294
ENTER_LOCK;
12951295
SHARED_CONTEXT;
12961296
{
1297-
SV* fake_stash = newSVpv(HvNAME(stash),0);
1297+
SV* fake_stash = newSVpv(HvNAME_get(stash),0);
12981298
(void)sv_bless(SHAREDSvPTR(shared),(HV*)fake_stash);
12991299
}
13001300
CALLER_CONTEXT;

global.sym

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -675,6 +675,12 @@ Perl_save_set_svflags
675675
Perl_hv_assert
676676
Perl_hv_clear_placeholders
677677
Perl_hv_scalar
678+
Perl_hv_riter_p
679+
Perl_hv_eiter_p
680+
Perl_hv_riter_set
681+
Perl_hv_eiter_set
682+
Perl_hv_name_p
683+
Perl_hv_name_set
678684
Perl_hv_placeholders_p
679685
Perl_hv_placeholders_get
680686
Perl_hv_placeholders_set

0 commit comments

Comments
 (0)