Merge gv_AVadd(), gv_HVadd() and gv_SVadd() into gv_add_by_type().
authorNicholas Clark <nick@ccl4.org>
Sat, 8 Aug 2009 11:05:40 +0000 (12:05 +0100)
committerNicholas Clark <nick@ccl4.org>
Sat, 8 Aug 2009 16:48:32 +0000 (17:48 +0100)
The "short" names become macro wrappers, and the Perl_* versions become mathoms.

embed.fnc
embed.h
global.sym
gv.c
gv.h
mathoms.c
proto.h
t/pod/diag.t

index 54389d5..3ada68a 100644 (file)
--- a/embed.fnc
+++ b/embed.fnc
@@ -339,8 +339,9 @@ p   |char*  |getenv_len     |NN const char *env_elem|NN unsigned long *len
 pox    |void   |get_db_sub     |NULLOK SV **svp|NN CV *cv
 Ap     |void   |gp_free        |NULLOK GV* gv
 Ap     |GP*    |gp_ref         |NULLOK GP* gp
-Ap     |GV*    |gv_AVadd       |NN GV* gv
-Ap     |GV*    |gv_HVadd       |NN GV* gv
+Ap     |GV*    |gv_add_by_type |NN GV *gv|svtype type
+Apmb   |GV*    |gv_AVadd       |NN GV *gv
+Apmb   |GV*    |gv_HVadd       |NN GV *gv
 Ap     |GV*    |gv_IOadd       |NULLOK GV* gv
 ApR    |GV*    |gv_autoload4   |NULLOK HV* stash|NN const char* name|STRLEN len|I32 method
 Ap     |void   |gv_check       |NN const HV* stash
@@ -2081,7 +2082,7 @@ p |void   |dump_sv_child  |NN SV *sv
 #endif
 
 #ifdef PERL_DONT_CREATE_GVSV
-Ap     |GV*    |gv_SVadd       |NN GV* gv
+Apbm   |GV*    |gv_SVadd       |NN GV *gv
 #endif
 Apo    |bool   |ckwarn         |U32 w
 Apo    |bool   |ckwarn_d       |U32 w
diff --git a/embed.h b/embed.h
index 0847c63..ae708d6 100644 (file)
--- a/embed.h
+++ b/embed.h
 #endif
 #define gp_free                        Perl_gp_free
 #define gp_ref                 Perl_gp_ref
-#define gv_AVadd               Perl_gv_AVadd
-#define gv_HVadd               Perl_gv_HVadd
+#define gv_add_by_type         Perl_gv_add_by_type
 #define gv_IOadd               Perl_gv_IOadd
 #define gv_autoload4           Perl_gv_autoload4
 #define gv_check               Perl_gv_check
 #endif
 #endif
 #ifdef PERL_DONT_CREATE_GVSV
-#define gv_SVadd               Perl_gv_SVadd
 #endif
 #ifdef PERL_CORE
 #define offer_nice_chunk       Perl_offer_nice_chunk
 #endif
 #define gp_free(a)             Perl_gp_free(aTHX_ a)
 #define gp_ref(a)              Perl_gp_ref(aTHX_ a)
-#define gv_AVadd(a)            Perl_gv_AVadd(aTHX_ a)
-#define gv_HVadd(a)            Perl_gv_HVadd(aTHX_ a)
+#define gv_add_by_type(a,b)    Perl_gv_add_by_type(aTHX_ a,b)
 #define gv_IOadd(a)            Perl_gv_IOadd(aTHX_ a)
 #define gv_autoload4(a,b,c,d)  Perl_gv_autoload4(aTHX_ a,b,c,d)
 #define gv_check(a)            Perl_gv_check(aTHX_ a)
 #endif
 #endif
 #ifdef PERL_DONT_CREATE_GVSV
-#define gv_SVadd(a)            Perl_gv_SVadd(aTHX_ a)
 #endif
 #if defined(PERL_CORE) || defined(PERL_EXT)
 #endif
index de14a7b..115490a 100644 (file)
@@ -126,6 +126,7 @@ Perl_vform
 Perl_free_tmps
 Perl_gp_free
 Perl_gp_ref
+Perl_gv_add_by_type
 Perl_gv_AVadd
 Perl_gv_HVadd
 Perl_gv_IOadd
diff --git a/gv.c b/gv.c
index f16e0ac..d46b253 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -40,42 +40,26 @@ Perl stores its global variables.
 static const char S_autoload[] = "AUTOLOAD";
 static const STRLEN S_autolen = sizeof(S_autoload)-1;
 
-
-#ifdef PERL_DONT_CREATE_GVSV
 GV *
-Perl_gv_SVadd(pTHX_ GV *gv)
+Perl_gv_add_by_type(pTHX_ GV *gv, svtype type)
 {
-    PERL_ARGS_ASSERT_GV_SVADD;
-
-    if (!gv || SvTYPE((const SV *)gv) != SVt_PVGV)
-       Perl_croak(aTHX_ "Bad symbol for scalar");
-    if (!GvSV(gv))
-       GvSV(gv) = newSV(0);
-    return gv;
-}
-#endif
+    SV **where;
 
-GV *
-Perl_gv_AVadd(pTHX_ register GV *gv)
-{
-    PERL_ARGS_ASSERT_GV_AVADD;
+    PERL_ARGS_ASSERT_GV_ADD_BY_TYPE;
 
     if (!gv || SvTYPE((const SV *)gv) != SVt_PVGV)
-       Perl_croak(aTHX_ "Bad symbol for array");
-    if (!GvAV(gv))
-       GvAV(gv) = newAV();
-    return gv;
-}
+       Perl_croak(aTHX_ "Bad symbol for %s", type == SVt_PVAV ? "array" : type == SVt_PVHV ? "hash" : "scalar");
 
-GV *
-Perl_gv_HVadd(pTHX_ register GV *gv)
-{
-    PERL_ARGS_ASSERT_GV_HVADD;
+    if (type == SVt_PVHV) {
+       where = (SV **)&GvHV(gv);
+    } else if (type == SVt_PVAV) {
+       where = (SV **)&GvAV(gv);
+    } else {
+       where = &GvSV(gv);
+    }
 
-    if (!gv || SvTYPE((const SV *)gv) != SVt_PVGV)
-       Perl_croak(aTHX_ "Bad symbol for hash");
-    if (!GvHV(gv))
-       GvHV(gv) = newHV();
+    if (!*where)
+       *where = newSV_type(type);
     return gv;
 }
 
diff --git a/gv.h b/gv.h
index 8344997..d09a929 100644 (file)
--- a/gv.h
+++ b/gv.h
@@ -207,6 +207,10 @@ Return the SV from the GV.
 #define gv_efullname3(sv,gv,prefix) gv_efullname4(sv,gv,prefix,TRUE)
 #define gv_fetchmethod(stash, name) gv_fetchmethod_autoload(stash, name, TRUE)
 
+#define gv_AVadd(gv) gv_add_by_type((gv), SVt_PVAV)
+#define gv_HVadd(gv) gv_add_by_type((gv), SVt_PVHV)
+#define gv_SVadd(gv) gv_add_by_type((gv), SVt_NULL)
+
 /*
  * Local variables:
  * c-indentation-style: bsd
index 7eae87e..5ae5d2d 100644 (file)
--- a/mathoms.c
+++ b/mathoms.c
@@ -1473,6 +1473,32 @@ Perl_save_op(pTHX)
     save_op();
 }
 
+#ifdef PERL_DONT_CREATE_GVSV
+GV *
+Perl_gv_SVadd(pTHX_ GV *gv)
+{
+    PERL_ARGS_ASSERT_GV_SVADD;
+
+    return gv_SVadd(gv);
+}
+#endif
+
+GV *
+Perl_gv_AVadd(pTHX_ GV *gv)
+{
+    PERL_ARGS_ASSERT_GV_AVADD;
+
+    return gv_AVadd(gv);
+}
+
+GV *
+Perl_gv_HVadd(pTHX_ register GV *gv)
+{
+    PERL_ARGS_ASSERT_GV_HVADD;
+
+    return gv_HVadd(gv);
+}
+
 #endif /* NO_MATHOMS */
 
 /*
diff --git a/proto.h b/proto.h
index 8241132..aee22c0 100644 (file)
--- a/proto.h
+++ b/proto.h
@@ -832,13 +832,18 @@ PERL_CALLCONV void        Perl_get_db_sub(pTHX_ SV **svp, CV *cv)
 
 PERL_CALLCONV void     Perl_gp_free(pTHX_ GV* gv);
 PERL_CALLCONV GP*      Perl_gp_ref(pTHX_ GP* gp);
-PERL_CALLCONV GV*      Perl_gv_AVadd(pTHX_ GV* gv)
+PERL_CALLCONV GV*      Perl_gv_add_by_type(pTHX_ GV *gv, svtype type)
                        __attribute__nonnull__(pTHX_1);
+#define PERL_ARGS_ASSERT_GV_ADD_BY_TYPE        \
+       assert(gv)
+
+/* PERL_CALLCONV GV*   Perl_gv_AVadd(pTHX_ GV *gv)
+                       __attribute__nonnull__(pTHX_1); */
 #define PERL_ARGS_ASSERT_GV_AVADD      \
        assert(gv)
 
-PERL_CALLCONV GV*      Perl_gv_HVadd(pTHX_ GV* gv)
-                       __attribute__nonnull__(pTHX_1);
+/* PERL_CALLCONV GV*   Perl_gv_HVadd(pTHX_ GV *gv)
+                       __attribute__nonnull__(pTHX_1); */
 #define PERL_ARGS_ASSERT_GV_HVADD      \
        assert(gv)
 
@@ -6342,8 +6347,8 @@ PERL_CALLCONV void        Perl_dump_sv_child(pTHX_ SV *sv)
 #endif
 
 #ifdef PERL_DONT_CREATE_GVSV
-PERL_CALLCONV GV*      Perl_gv_SVadd(pTHX_ GV* gv)
-                       __attribute__nonnull__(pTHX_1);
+/* PERL_CALLCONV GV*   Perl_gv_SVadd(pTHX_ GV *gv)
+                       __attribute__nonnull__(pTHX_1); */
 #define PERL_ARGS_ASSERT_GV_SVADD      \
        assert(gv)
 
index 5f378ae..cfe572f 100644 (file)
@@ -191,7 +191,7 @@ Attempt to free unreferenced scalar: SV 0x%x
 Attempt to reload %s aborted. Compilation failed in require
 av_reify called on tied array
 Bad name after %s%s
-Bad symbol for scalar
+Bad symbol for %s
 bad top format reference
 Bizarre copy of %s
 Bizarre SvTYPE [%d]