X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=universal.c;h=6c118b7845a4da18a19cf85748cdb0e3f8b387d7;hb=345dbb93fc4813c4387eb6b1eedefc6d79a752d0;hp=a90ba5d58f1b229b99498f2c0e9c2b5332c50f05;hpb=0723351e0aae3b4ed046fabd41bf188a3d6a77df;p=p5sagit%2Fp5-mst-13.2.git diff --git a/universal.c b/universal.c index a90ba5d..6c118b7 100644 --- a/universal.c +++ b/universal.c @@ -40,13 +40,16 @@ S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash, GV** gvp; HV* hv = Nullhv; SV* subgen = Nullsv; + const char *hvname; /* A stash/class can go by many names (ie. User == main::User), so we compare the stash itself just in case */ if (name_stash && (stash == name_stash)) return &PL_sv_yes; - if (strEQ(HvNAME(stash), name)) + hvname = HvNAME_get(stash); + + if (strEQ(hvname, name)) return &PL_sv_yes; if (strEQ(name, "UNIVERSAL")) @@ -54,7 +57,7 @@ S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash, if (level > 100) Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'", - HvNAME(stash)); + hvname); gvp = (GV**)hv_fetch(stash, "::ISA::CACHE::", 14, FALSE); @@ -66,13 +69,13 @@ S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash, SV** svp = (SV**)hv_fetch(hv, name, len, FALSE); if (svp && (sv = *svp) != (SV*)&PL_sv_undef) { DEBUG_o( Perl_deb(aTHX_ "Using cached ISA %s for package %s\n", - name, HvNAME(stash)) ); + name, hvname) ); return sv; } } else { DEBUG_o( Perl_deb(aTHX_ "ISA Cache in package %s is stale\n", - HvNAME(stash)) ); + hvname) ); hv_clear(hv); sv_setiv(subgen, PL_sub_generation); } @@ -106,8 +109,8 @@ S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash, if (!basestash) { if (ckWARN(WARN_MISC)) Perl_warner(aTHX_ packWARN(WARN_SYNTAX), - "Can't locate package %"SVf" for @%s::ISA", - sv, HvNAME(stash)); + "Can't locate package %"SVf" for @%s::ISA", + sv, hvname); continue; } if (&PL_sv_yes == isa_lookup(basestash, name, name_stash, @@ -137,13 +140,10 @@ for class names as well as for objects. bool Perl_sv_derived_from(pTHX_ SV *sv, const char *name) { - const char *type; - HV *stash; + const char *type = Nullch; + HV *stash = Nullhv; HV *name_stash; - stash = Nullhv; - type = Nullch; - if (SvGMAGICAL(sv)) mg_get(sv) ; @@ -168,15 +168,19 @@ Perl_sv_derived_from(pTHX_ SV *sv, const char *name) #include "XSUB.h" -void XS_UNIVERSAL_isa(pTHX_ CV *cv); -void XS_UNIVERSAL_can(pTHX_ CV *cv); -void XS_UNIVERSAL_VERSION(pTHX_ CV *cv); +PERL_XS_EXPORT_C void XS_UNIVERSAL_isa(pTHX_ CV *cv); +PERL_XS_EXPORT_C void XS_UNIVERSAL_can(pTHX_ CV *cv); +PERL_XS_EXPORT_C void XS_UNIVERSAL_VERSION(pTHX_ CV *cv); XS(XS_version_new); XS(XS_version_stringify); XS(XS_version_numify); XS(XS_version_vcmp); XS(XS_version_boolean); +#ifdef HASATTRIBUTE_NORETURN +XS(XS_version_noop) __attribute__noreturn__; +#else XS(XS_version_noop); +#endif XS(XS_version_is_alpha); XS(XS_version_qv); XS(XS_utf8_is_utf8); @@ -251,7 +255,6 @@ XS(XS_UNIVERSAL_isa) SV *sv; const char *name; STRLEN n_a; - (void)cv; if (items != 2) Perl_croak(aTHX_ "Usage: UNIVERSAL::isa(reference, kind)"); @@ -279,7 +282,6 @@ XS(XS_UNIVERSAL_can) SV *rv; HV *pkg = NULL; STRLEN n_a; - (void)cv; if (items != 2) Perl_croak(aTHX_ "Usage: UNIVERSAL::can(object-ref, method)"); @@ -323,7 +325,6 @@ XS(XS_UNIVERSAL_VERSION) GV *gv; SV *sv; const char *undef; - (void)cv; if (SvROK(ST(0))) { sv = (SV*)SvRV(ST(0)); @@ -351,19 +352,19 @@ XS(XS_UNIVERSAL_VERSION) } if (items > 1) { - STRLEN len; SV *req = ST(1); if (undef) { - if (pkg) - Perl_croak(aTHX_ - "%s does not define $%s::VERSION--version check failed", - HvNAME(pkg), HvNAME(pkg)); - else { - const char *str = SvPVx(ST(0), len); - - Perl_croak(aTHX_ - "%s defines neither package nor VERSION--version check failed", str); + if (pkg) { + const char *name = HvNAME_get(pkg); + Perl_croak(aTHX_ + "%s does not define $%s::VERSION--version check failed", + name, name); + } else { + STRLEN n_a; + Perl_croak(aTHX_ + "%s defines neither package nor VERSION--version check failed", + SvPVx(ST(0),n_a) ); } } @@ -377,7 +378,7 @@ XS(XS_UNIVERSAL_VERSION) if ( vcmp( req, sv ) > 0 ) Perl_croak(aTHX_ "%s version %"SVf" (%"SVf") required--" - "this is only version %"SVf" (%"SVf")", HvNAME(pkg), + "this is only version %"SVf" (%"SVf")", HvNAME_get(pkg), vnumify(req),vnormal(req),vnumify(sv),vnormal(sv)); } @@ -393,7 +394,6 @@ XS(XS_UNIVERSAL_VERSION) XS(XS_version_new) { dXSARGS; - (void)cv; if (items > 3) Perl_croak(aTHX_ "Usage: version::new(class, version)"); SP -= items; @@ -420,12 +420,11 @@ XS(XS_version_new) XS(XS_version_stringify) { dXSARGS; - (void)cv; if (items < 1) Perl_croak(aTHX_ "Usage: version::stringify(lobj, ...)"); SP -= items; { - SV * lobj; + SV * lobj = Nullsv; if (sv_derived_from(ST(0), "version")) { SV *tmp = SvRV(ST(0)); @@ -444,12 +443,11 @@ XS(XS_version_stringify) XS(XS_version_numify) { dXSARGS; - (void)cv; if (items < 1) Perl_croak(aTHX_ "Usage: version::numify(lobj, ...)"); SP -= items; { - SV * lobj; + SV * lobj = Nullsv; if (sv_derived_from(ST(0), "version")) { SV *tmp = SvRV(ST(0)); @@ -468,12 +466,11 @@ XS(XS_version_numify) XS(XS_version_vcmp) { dXSARGS; - (void)cv; if (items < 1) Perl_croak(aTHX_ "Usage: version::vcmp(lobj, ...)"); SP -= items; { - SV * lobj; + SV * lobj = Nullsv; if (sv_derived_from(ST(0), "version")) { SV *tmp = SvRV(ST(0)); @@ -514,12 +511,11 @@ XS(XS_version_vcmp) XS(XS_version_boolean) { dXSARGS; - (void)cv; if (items < 1) Perl_croak(aTHX_ "Usage: version::boolean(lobj, ...)"); SP -= items; { - SV * lobj; + SV * lobj = Nullsv; if (sv_derived_from(ST(0), "version")) { /* XXX If tmp serves a purpose, explain it. */ @@ -542,37 +538,26 @@ XS(XS_version_boolean) XS(XS_version_noop) { - dXSARGS; - (void)cv; - if (items < 1) - Perl_croak(aTHX_ "Usage: version::noop(lobj, ...)"); - { - SV * lobj; - - if (sv_derived_from(ST(0), "version")) { - SV *tmp = SvRV(ST(0)); - lobj = tmp; - } - else - Perl_croak(aTHX_ "lobj is not of type version"); - - { - Perl_croak(aTHX_ "operation not supported with version object"); - } - - } - XSRETURN_EMPTY; + dXSARGS; + if (items < 1) + Perl_croak(aTHX_ "Usage: version::noop(lobj, ...)"); + if (sv_derived_from(ST(0), "version")) + Perl_croak(aTHX_ "operation not supported with version object"); + else + Perl_croak(aTHX_ "lobj is not of type version"); +#ifndef HASATTRIBUTE_NORETURN + XSRETURN_EMPTY; +#endif } XS(XS_version_is_alpha) { dXSARGS; - (void)cv; if (items != 1) Perl_croak(aTHX_ "Usage: version::is_alpha(lobj)"); SP -= items; { - SV *lobj; + SV * lobj = Nullsv; if (sv_derived_from(ST(0), "version")) { /* XXX If tmp serves a purpose, explain it. */ @@ -597,7 +582,6 @@ XS(XS_version_is_alpha) XS(XS_version_qv) { dXSARGS; - (void)cv; if (items != 1) Perl_croak(aTHX_ "Usage: version::qv(ver)"); SP -= items; @@ -635,7 +619,6 @@ XS(XS_version_qv) XS(XS_utf8_is_utf8) { dXSARGS; - (void)cv; if (items != 1) Perl_croak(aTHX_ "Usage: utf8::is_utf8(sv)"); { @@ -653,7 +636,6 @@ XS(XS_utf8_is_utf8) XS(XS_utf8_valid) { dXSARGS; - (void)cv; if (items != 1) Perl_croak(aTHX_ "Usage: utf8::valid(sv)"); { @@ -673,7 +655,6 @@ XS(XS_utf8_valid) XS(XS_utf8_encode) { dXSARGS; - (void)cv; if (items != 1) Perl_croak(aTHX_ "Usage: utf8::encode(sv)"); { @@ -687,7 +668,6 @@ XS(XS_utf8_encode) XS(XS_utf8_decode) { dXSARGS; - (void)cv; if (items != 1) Perl_croak(aTHX_ "Usage: utf8::decode(sv)"); { @@ -702,7 +682,6 @@ XS(XS_utf8_decode) XS(XS_utf8_upgrade) { dXSARGS; - (void)cv; if (items != 1) Perl_croak(aTHX_ "Usage: utf8::upgrade(sv)"); { @@ -719,7 +698,6 @@ XS(XS_utf8_upgrade) XS(XS_utf8_downgrade) { dXSARGS; - (void)cv; if (items < 1 || items > 2) Perl_croak(aTHX_ "Usage: utf8::downgrade(sv, failok=0)"); { @@ -737,7 +715,6 @@ XS(XS_utf8_native_to_unicode) { dXSARGS; const UV uv = SvUV(ST(0)); - (void)cv; if (items > 1) Perl_croak(aTHX_ "Usage: utf8::native_to_unicode(sv)"); @@ -750,7 +727,6 @@ XS(XS_utf8_unicode_to_native) { dXSARGS; const UV uv = SvUV(ST(0)); - (void)cv; if (items > 1) Perl_croak(aTHX_ "Usage: utf8::unicode_to_native(sv)"); @@ -763,7 +739,6 @@ XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */ { dXSARGS; SV *sv = SvRV(ST(0)); - (void)cv; if (items == 1) { if (SvREADONLY(sv)) @@ -789,7 +764,6 @@ XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */ { dXSARGS; SV *sv = SvRV(ST(0)); - (void)cv; if (items == 1) XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */ @@ -805,7 +779,6 @@ XS(XS_Internals_hv_clear_placehold) { dXSARGS; HV *hv = (HV *) SvRV(ST(0)); - (void)cv; if (items != 1) Perl_croak(aTHX_ "Usage: UNIVERSAL::hv_clear_placeholders(hv)"); @@ -815,13 +788,11 @@ XS(XS_Internals_hv_clear_placehold) XS(XS_Regexp_DESTROY) { - (void)cv; } XS(XS_PerlIO_get_layers) { dXSARGS; - (void)cv; if (items < 1 || items % 2 == 0) Perl_croak(aTHX_ "Usage: PerlIO_get_layers(filehandle[,args])"); #ifdef USE_PERLIO @@ -905,9 +876,9 @@ XS(XS_PerlIO_get_layers) if (details) { XPUSHs(namok ? - newSVpv(SvPVX(*namsvp), 0) : &PL_sv_undef); + newSVpv(SvPVX_const(*namsvp), 0) : &PL_sv_undef); XPUSHs(argok ? - newSVpv(SvPVX(*argsvp), 0) : &PL_sv_undef); + newSVpv(SvPVX_const(*argsvp), 0) : &PL_sv_undef); if (flgok) XPUSHi(SvIVX(*flgsvp)); else @@ -948,8 +919,8 @@ XS(XS_Internals_hash_seed) { /* Using dXSARGS would also have dITEM and dSP, * which define 2 unused local variables. */ - dMARK; dAX; - (void)cv; + dAXMARK; + (void)mark; XSRETURN_UV(PERL_HASH_SEED); } @@ -957,15 +928,14 @@ XS(XS_Internals_rehash_seed) { /* Using dXSARGS would also have dITEM and dSP, * which define 2 unused local variables. */ - dMARK; dAX; - (void)cv; + dAXMARK; + (void)mark; XSRETURN_UV(PL_rehash_seed); } XS(XS_Internals_HvREHASH) /* Subject to change */ { dXSARGS; - (void)cv; if (SvROK(ST(0))) { const HV *hv = (HV *) SvRV(ST(0)); if (items == 1 && SvTYPE(hv) == SVt_PVHV) { @@ -985,5 +955,5 @@ XS(XS_Internals_HvREHASH) /* Subject to change */ * indent-tabs-mode: t * End: * - * vim: shiftwidth=4: -*/ + * ex: set ts=8 sts=4 sw=4 noet: + */