AV* av;
GV* gv;
GV** gvp;
- HV* hv = Nullhv;
- SV* subgen = Nullsv;
+ HV* hv = NULL;
+ SV* subgen = NULL;
const char *hvname;
/* A stash/class can go by many names (ie. User == main::User), so
{
if (SvIV(subgen) == (IV)PL_sub_generation) {
SV* sv;
- SV** svp = (SV**)hv_fetch(hv, name, len, FALSE);
+ SV** const 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) );
bool
Perl_sv_derived_from(pTHX_ SV *sv, const char *name)
{
- const char *type = Nullch;
- HV *stash = Nullhv;
- HV *name_stash;
+ HV *stash;
SvGETMAGIC(sv);
if (SvROK(sv)) {
+ const char *type;
sv = SvRV(sv);
type = sv_reftype(sv,0);
- if (SvOBJECT(sv))
- stash = SvSTASH(sv);
+ if (type && strEQ(type,name))
+ return TRUE;
+ stash = SvOBJECT(sv) ? SvSTASH(sv) : NULL;
}
else {
stash = gv_stashsv(sv, FALSE);
}
- name_stash = gv_stashpv(name, FALSE);
+ if (stash) {
+ HV * const name_stash = gv_stashpv(name, FALSE);
+ return isa_lookup(stash, name, name_stash, strlen(name), 0) == &PL_sv_yes;
+ }
+ else
+ return FALSE;
- return (type && strEQ(type,name)) ||
- (stash && isa_lookup(stash, name, name_stash, strlen(name), 0)
- == &PL_sv_yes)
- ? TRUE
- : FALSE ;
}
#include "XSUB.h"
XS(XS_Internals_hash_seed);
XS(XS_Internals_rehash_seed);
XS(XS_Internals_HvREHASH);
+XS(XS_Internals_inc_sub_generation);
void
Perl_boot_core_UNIVERSAL(pTHX)
newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, "");
newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
+ newXSproto("Internals::inc_sub_generation",XS_Internals_inc_sub_generation,
+ file, "");
}
sv = nsv;
if ( !sv_derived_from(sv, "version"))
upg_version(sv);
- undef = Nullch;
+ undef = NULL;
}
else {
sv = (SV*)&PL_sv_undef;
Perl_croak(aTHX_ "Usage: version::stringify(lobj, ...)");
SP -= items;
{
- SV * lobj = Nullsv;
+ SV * lobj;
if (sv_derived_from(ST(0), "version")) {
lobj = SvRV(ST(0));
Perl_croak(aTHX_ "Usage: version::numify(lobj, ...)");
SP -= items;
{
- SV * lobj = Nullsv;
+ SV * lobj;
if (sv_derived_from(ST(0), "version")) {
lobj = SvRV(ST(0));
Perl_croak(aTHX_ "Usage: version::normal(lobj, ...)");
SP -= items;
{
- SV * lobj = Nullsv;
+ SV * lobj;
if (sv_derived_from(ST(0), "version")) {
lobj = SvRV(ST(0));
Perl_croak(aTHX_ "Usage: version::vcmp(lobj, ...)");
SP -= items;
{
- SV * lobj = Nullsv;
+ SV * lobj;
if (sv_derived_from(ST(0), "version")) {
lobj = SvRV(ST(0));
SV *rs;
SV *rvs;
SV * robj = ST(1);
- IV swap = (IV)SvIV(ST(2));
+ const IV swap = (IV)SvIV(ST(2));
if ( ! sv_derived_from(robj, "version") )
{
if ( SvNOK(ver) ) /* may get too much accuracy */
{
char tbuf[64];
- sprintf(tbuf,"%.9"NVgf, SvNVX(ver));
- version = savepv(tbuf);
+ const STRLEN len = my_sprintf(tbuf,"%.9"NVgf, SvNVX(ver));
+ version = savepvn(tbuf, len);
}
else
{
if (!isGV(sv)) {
if (SvROK(sv) && isGV(SvRV(sv)))
gv = (GV*)SvRV(sv);
- else
- gv = gv_fetchsv(sv, FALSE, SVt_PVIO);
+ else if (SvPOKp(sv))
+ gv = gv_fetchsv(sv, 0, SVt_PVIO);
}
if (gv && (io = GvIO(gv))) {
Perl_croak(aTHX_ "Internals::HvREHASH $hashref");
}
+XS(XS_Internals_inc_sub_generation)
+{
+ /* Using dXSARGS would also have dITEM and dSP,
+ * which define 2 unused local variables. */
+ dAXMARK;
+ PERL_UNUSED_ARG(cv);
+ PERL_UNUSED_VAR(mark);
+ ++PL_sub_generation;
+ XSRETURN_EMPTY;
+}
+
/*
* Local variables:
* c-indentation-style: bsd