X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=XS.xs;h=1ad66143340ea15f7e9c8dc1813339fb2a8acb53;hb=68fe9f2928a5a423e6d31eaf4b2bf0c17c9bfb27;hp=db14fd525ecfbec52547bb2c68061a18a3c360ed;hpb=6ed110b7fc5eb75d2ec95703dbbe7cba0f03b6dc;p=gitmo%2FClass-C3-XS.git diff --git a/XS.xs b/XS.xs index db14fd5..1ad6614 100644 --- a/XS.xs +++ b/XS.xs @@ -50,6 +50,10 @@ /* *********** end ppport.h stuff */ +#ifndef SVfARG +# define SVfARG(p) ((void*)(p)) +#endif + /* Most of this code is backported from the bleadperl patch's mro.c, and then modified to work with Class::C3's internals. @@ -231,13 +235,22 @@ __mro_linear_isa_c3(pTHX_ HV* stash, HV* cache, I32 level) /* If we had candidates, but nobody won, then the @ISA hierarchy is not C3-incompatible */ if(!winner) { + SV *errmsg; + I32 i; /* we have to do some cleanup before we croak */ + errmsg = newSVpvf("Inconsistent hierarchy during C3 merge of class '%s':\n\t" + "current merge results [\n", stashname); + for (i = 0; i <= av_len(retval); i++) { + SV **elem = av_fetch(retval, i, 0); + sv_catpvf(errmsg, "\t\t%"SVf",\n", SVfARG(*elem)); + } + sv_catpvf(errmsg, "\t]\n\tmerging failed on '%"SVf"'", SVfARG(cand)); + SvREFCNT_dec(retval); Safefree(heads); - Perl_croak(aTHX_ "Inconsistent hierarchy during C3 merge of class '%s': " - "merging failed on parent '%s'", stashname, SvPV_nolen(cand)); + croak("%"SVf, SVfARG(errmsg)); } } }