Re: HvMROMETA
authorBrandon Black <blblack@gmail.com>
Tue, 29 May 2007 19:08:13 +0000 (14:08 -0500)
committerRafael Garcia-Suarez <rgarciasuarez@gmail.com>
Wed, 30 May 2007 15:21:10 +0000 (15:21 +0000)
From: "Brandon Black" <blblack@gmail.com>
Message-ID: <84621a60705291708m3f106d74r473f3d91c780163d@mail.gmail.com>

p4raw-id: //depot/perl@31312

hv.h
mro.c

diff --git a/hv.h b/hv.h
index 5600ac3..1aaee59 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -261,9 +261,13 @@ C<SV*>.
 #define HvRITER_get(hv)        (SvOOK(hv) ? HvAUX(hv)->xhv_riter : -1)
 #define HvEITER_get(hv)        (SvOOK(hv) ? HvAUX(hv)->xhv_eiter : 0)
 #define HvNAME(hv)     HvNAME_get(hv)
-#define HvMROMETA(hv)  (SvOOK(hv) \
-                       ? (HvAUX(hv)->xhv_mro_meta ? HvAUX(hv)->xhv_mro_meta : mro_meta_init(hv)) \
-                       : NULL)
+
+/* Checking that hv is a valid package stash is the
+   caller's responsibility */
+#define HvMROMETA(hv) (HvAUX(hv)->xhv_mro_meta \
+                       ? HvAUX(hv)->xhv_mro_meta \
+                       : mro_meta_init(hv))
+
 /* FIXME - all of these should use a UTF8 aware API, which should also involve
    getting the length. */
 /* This macro may go away without notice.  */
diff --git a/mro.c b/mro.c
index 8d98fdc..f6be44b 100644 (file)
--- a/mro.c
+++ b/mro.c
@@ -411,8 +411,10 @@ AV*
 Perl_mro_get_linear_isa(pTHX_ HV *stash)
 {
     struct mro_meta* meta;
+
     assert(stash);
-    assert(HvAUX(stash));
+    if(!SvOOK(stash))
+        Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
 
     meta = HvMROMETA(stash);
     if(meta->mro_which == MRO_DFS) {
@@ -444,12 +446,16 @@ Perl_mro_isa_changed_in(pTHX_ HV* stash)
     SV** svp;
     I32 items;
     bool is_universal;
+    struct mro_meta * meta;
 
     const char * const stashname = HvNAME_get(stash);
     const STRLEN stashname_len = HvNAMELEN_get(stash);
 
+    if(!stashname)
+        Perl_croak(aTHX_ "Can't call mro_isa_changed_in() on anonymous symbol table");
+
     /* wipe out the cached linearizations for this stash */
-    struct mro_meta * const meta = HvMROMETA(stash);
+    meta = HvMROMETA(stash);
     SvREFCNT_dec((SV*)meta->mro_linear_dfs);
     SvREFCNT_dec((SV*)meta->mro_linear_c3);
     meta->mro_linear_dfs = NULL;
@@ -577,6 +583,9 @@ Perl_mro_method_changed_in(pTHX_ HV *stash)
     SV ** const svp = hv_fetch(PL_isarev, stashname, stashname_len, 0);
     HV * const isarev = svp ? (HV*)*svp : NULL;
 
+    if(!stashname)
+        Perl_croak(aTHX_ "Can't call mro_method_changed_in() on anonymous symbol table");
+
     /* Inc the package generation, since a local method changed */
     HvMROMETA(stash)->pkg_gen++;