summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--embed.fnc3
-rw-r--r--embed.h1
-rw-r--r--gv.c17
-rw-r--r--proto.h5
4 files changed, 22 insertions, 4 deletions
diff --git a/embed.fnc b/embed.fnc
index c17bf390d3..7793f0ccd3 100644
--- a/embed.fnc
+++ b/embed.fnc
@@ -548,6 +548,9 @@ px |GV * |gv_override |NN const char * const name \
XMpd |void |gv_try_downgrade|NN GV* gv
Apd |HV* |gv_stashpv |NN const char* name|I32 flags
Apd |HV* |gv_stashpvn |NN const char* name|U32 namelen|I32 flags
+#if defined(PERL_IN_GV_C)
+i |HV* |gv_stashpvn_internal|NN const char* name|U32 namelen|I32 flags
+#endif
Apd |HV* |gv_stashsv |NN SV* sv|I32 flags
Apd |void |hv_clear |NULLOK HV *hv
: used in SAVEHINTS() and op.c
diff --git a/embed.h b/embed.h
index 50d07bb81d..766f82c3d4 100644
--- a/embed.h
+++ b/embed.h
@@ -1439,6 +1439,7 @@
#define gv_is_in_main(a,b,c) S_gv_is_in_main(aTHX_ a,b,c)
#define gv_magicalize(a,b,c,d,e,f) S_gv_magicalize(aTHX_ a,b,c,d,e,f)
#define gv_magicalize_isa(a) S_gv_magicalize_isa(aTHX_ a)
+#define gv_stashpvn_internal(a,b,c) S_gv_stashpvn_internal(aTHX_ a,b,c)
#define maybe_multimagic_gv(a,b,c) S_maybe_multimagic_gv(aTHX_ a,b,c)
#define parse_gv_stash_name(a,b,c,d,e,f,g,h) S_parse_gv_stash_name(aTHX_ a,b,c,d,e,f,g,h)
#define require_tie_mod(a,b,c,d,e) S_require_tie_mod(aTHX_ a,b,c,d,e)
diff --git a/gv.c b/gv.c
index 7cc2c1e50c..3eec538e05 100644
--- a/gv.c
+++ b/gv.c
@@ -1316,8 +1316,16 @@ The most important of which are probably GV_ADD and SVf_UTF8.
=cut
*/
+/*
+gv_stashpvn_internal
+
+Perform the internal bits of gv_stashsvpvn_cached. You could think of this
+as being one half of the logic. Not to be called except from gv_stashsvpvn_cached().
+
+*/
+
PERL_STATIC_INLINE HV*
-S_stashpvn(pTHX_ const char *name, U32 namelen, I32 flags)
+S_gv_stashpvn_internal(pTHX_ const char *name, U32 namelen, I32 flags)
{
char smallbuf[128];
char *tmpbuf;
@@ -1325,7 +1333,7 @@ S_stashpvn(pTHX_ const char *name, U32 namelen, I32 flags)
GV *tmpgv;
U32 tmplen = namelen + 2;
- PERL_ARGS_ASSERT_GV_STASHPVN;
+ PERL_ARGS_ASSERT_GV_STASHPVN_INTERNAL;
if (tmplen <= sizeof smallbuf)
tmpbuf = smallbuf;
@@ -1365,10 +1373,11 @@ Perl_gv_stashpvn(pTHX_ const char *name, U32 namelen, I32 flags)
if (he) return INT2PTR(HV*,SvIVX(HeVAL(he)));
else if (flags & GV_CACHE_ONLY) return NULL;
- stash = S_stashpvn(aTHX_ name, namelen, flags);
+ stash = gv_stashpvn_internal(name, namelen, flags);
+
if (stash && namelen) {
SV* const ref = newSViv(PTR2IV(stash));
- hv_store(PL_stashcache, name,
+ (void)hv_store(PL_stashcache, name,
(flags & SVf_UTF8) ? -(I32)namelen : (I32)namelen, ref, 0);
}
return stash;
diff --git a/proto.h b/proto.h
index 30d70a587d..5fc86faadd 100644
--- a/proto.h
+++ b/proto.h
@@ -5907,6 +5907,11 @@ STATIC void S_gv_magicalize_isa(pTHX_ GV *gv)
#define PERL_ARGS_ASSERT_GV_MAGICALIZE_ISA \
assert(gv)
+PERL_STATIC_INLINE HV* S_gv_stashpvn_internal(pTHX_ const char* name, U32 namelen, I32 flags)
+ __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_STASHPVN_INTERNAL \
+ assert(name)
+
STATIC void S_maybe_multimagic_gv(pTHX_ GV *gv, const char *name, const svtype sv_type)
__attribute__nonnull__(pTHX_1)
__attribute__nonnull__(pTHX_2);