X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=universal.c;h=67f96c381bbd17fbf2e60f0f0589693bf8192280;hb=e17cb2a9c513ce1acd034452f9a933fcfa6c0129;hp=03b907de0cb1d8770b55d496dcc8ff803a8ed242;hpb=ff0cee690d2ef6ba882e59dd4baaa0c944adb7a2;p=p5sagit%2Fp5-mst-13.2.git diff --git a/universal.c b/universal.c index 03b907d..67f96c3 100644 --- a/universal.c +++ b/universal.c @@ -8,11 +8,7 @@ */ static SV * -isa_lookup(stash, name, len, level) -HV *stash; -char *name; -int len; -int level; +isa_lookup(HV *stash, char *name, int len, int level) { AV* av; GV* gv; @@ -52,7 +48,8 @@ int level; } if(hv) { SV** svp = AvARRAY(av); - I32 items = AvFILL(av) + 1; + /* NOTE: No support for tied ISA */ + I32 items = AvFILLp(av) + 1; while (items--) { SV* sv = *svp++; HV* basestash = gv_stashsv(sv, FALSE); @@ -71,13 +68,11 @@ int level; } } - return &sv_no; + return boolSV(strEQ(name, "UNIVERSAL")); } bool -sv_derived_from(sv, name) -SV * sv ; -char * name ; +sv_derived_from(SV *sv, char *name) { SV *rv; char *type; @@ -120,8 +115,7 @@ XS(XS_UNIVERSAL_isa) sv = ST(0); name = (char *)SvPV(ST(1),na); - ST(0) = (sv_derived_from(sv, name) ? &sv_yes : &sv_no) ; - + ST(0) = boolSV(sv_derived_from(sv, name)); XSRETURN(1); } @@ -132,8 +126,6 @@ XS(XS_UNIVERSAL_can) SV *sv; char *name; SV *rv; - GV *gv; - CV *cvp; HV *pkg = NULL; if (items != 2) @@ -153,16 +145,9 @@ XS(XS_UNIVERSAL_can) } if (pkg) { - gv = gv_fetchmethod(pkg, name); - - if(gv && GvCV(gv)) { - /* If the sub is only a stub then we may have a gv to AUTOLOAD */ - GV **gvp = (GV**)hv_fetch(GvSTASH(gv), name, strlen(name), TRUE); - if(gvp && (cvp = GvCV(*gvp))) { - rv = sv_newmortal(); - sv_setsv(rv, newRV((SV*)cvp)); - } - } + GV *gv = gv_fetchmethod_autoload(pkg, name, FALSE); + if (gv && isGV(gv)) + rv = sv_2mortal(newRV((SV*)GvCV(gv))); } ST(0) = rv; @@ -213,7 +198,7 @@ XS(XS_UNIVERSAL_VERSION) } void -boot_core_UNIVERSAL() +boot_core_UNIVERSAL(void) { char *file = __FILE__;