From: Brandon Black Date: Tue, 29 May 2007 19:08:13 +0000 (-0500) Subject: Re: HvMROMETA X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=2c7f4b87d1721d033cf5fc3b5a553f25a8d8485f;p=p5sagit%2Fp5-mst-13.2.git Re: HvMROMETA From: "Brandon Black" Message-ID: <84621a60705291708m3f106d74r473f3d91c780163d@mail.gmail.com> p4raw-id: //depot/perl@31312 --- diff --git a/hv.h b/hv.h index 5600ac3..1aaee59 100644 --- a/hv.h +++ b/hv.h @@ -261,9 +261,13 @@ C. #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 --- 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++;