summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hv.h10
-rw-r--r--mro.c13
2 files changed, 18 insertions, 5 deletions
diff --git a/hv.h b/hv.h
index 5600ac3359..1aaee59a89 100644
--- 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 8d98fdceeb..f6be44b86e 100644
--- 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++;