3 * Copyright (c) 1997-2002, Larry Wall
5 * You may distribute under the terms of either the GNU General Public
6 * License or the Artistic License, as specified in the README file.
11 * "The roots of those mountains must be roots indeed; there must be
12 * great secrets buried there which have not been discovered since the
13 * beginning." --Gandalf, relating Gollum's story
17 #define PERL_IN_UNIVERSAL_C
21 * Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
22 * The main guts of traverse_isa was actually copied from gv_fetchmeth
26 S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash,
35 /* A stash/class can go by many names (ie. User == main::User), so
36 we compare the stash itself just in case */
37 if (name_stash && (stash == name_stash))
40 if (strEQ(HvNAME(stash), name))
44 Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
47 gvp = (GV**)hv_fetch(stash, "::ISA::CACHE::", 14, FALSE);
49 if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (subgen = GvSV(gv))
52 if (SvIV(subgen) == (IV)PL_sub_generation) {
54 SV** svp = (SV**)hv_fetch(hv, name, len, FALSE);
55 if (svp && (sv = *svp) != (SV*)&PL_sv_undef) {
56 DEBUG_o( Perl_deb(aTHX_ "Using cached ISA %s for package %s\n",
57 name, HvNAME(stash)) );
62 DEBUG_o( Perl_deb(aTHX_ "ISA Cache in package %s is stale\n",
65 sv_setiv(subgen, PL_sub_generation);
69 gvp = (GV**)hv_fetch(stash,"ISA",3,FALSE);
71 if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (av = GvAV(gv))) {
73 gvp = (GV**)hv_fetch(stash, "::ISA::CACHE::", 14, TRUE);
77 if (SvTYPE(gv) != SVt_PVGV)
78 gv_init(gv, stash, "::ISA::CACHE::", 14, TRUE);
83 subgen = newSViv(PL_sub_generation);
88 SV** svp = AvARRAY(av);
89 /* NOTE: No support for tied ISA */
90 I32 items = AvFILLp(av) + 1;
93 HV* basestash = gv_stashsv(sv, FALSE);
95 if (ckWARN(WARN_MISC))
96 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
97 "Can't locate package %s for @%s::ISA",
98 SvPVX(sv), HvNAME(stash));
101 if (&PL_sv_yes == isa_lookup(basestash, name, name_stash,
103 (void)hv_store(hv,name,len,&PL_sv_yes,0);
107 (void)hv_store(hv,name,len,&PL_sv_no,0);
111 return boolSV(strEQ(name, "UNIVERSAL"));
115 =head1 SV Manipulation Functions
117 =for apidoc sv_derived_from
119 Returns a boolean indicating whether the SV is derived from the specified
120 class. This is the function that implements C<UNIVERSAL::isa>. It works
121 for class names as well as for objects.
127 Perl_sv_derived_from(pTHX_ SV *sv, const char *name)
141 type = sv_reftype(sv,0);
146 stash = gv_stashsv(sv, FALSE);
149 name_stash = gv_stashpv(name, FALSE);
151 return (type && strEQ(type,name)) ||
152 (stash && isa_lookup(stash, name, name_stash, strlen(name), 0)
160 void XS_UNIVERSAL_isa(pTHX_ CV *cv);
161 void XS_UNIVERSAL_can(pTHX_ CV *cv);
162 void XS_UNIVERSAL_VERSION(pTHX_ CV *cv);
167 XS(XS_utf8_downgrade);
168 XS(XS_utf8_unicode_to_native);
169 XS(XS_utf8_native_to_unicode);
170 XS(XS_Internals_SvREADONLY);
171 XS(XS_Internals_SvREFCNT);
172 XS(XS_Internals_hv_clear_placehold);
175 Perl_boot_core_UNIVERSAL(pTHX)
177 char *file = __FILE__;
179 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
180 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
181 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
182 newXS("utf8::valid", XS_utf8_valid, file);
183 newXS("utf8::encode", XS_utf8_encode, file);
184 newXS("utf8::decode", XS_utf8_decode, file);
185 newXS("utf8::upgrade", XS_utf8_upgrade, file);
186 newXS("utf8::downgrade", XS_utf8_downgrade, file);
187 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
188 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
189 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
190 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
191 newXSproto("Internals::hv_clear_placeholders",
192 XS_Internals_hv_clear_placehold, file, "\\%");
204 Perl_croak(aTHX_ "Usage: UNIVERSAL::isa(reference, kind)");
211 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))))
214 name = (char *)SvPV(ST(1),n_a);
216 ST(0) = boolSV(sv_derived_from(sv, name));
230 Perl_croak(aTHX_ "Usage: UNIVERSAL::can(object-ref, method)");
237 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))))
240 name = (char *)SvPV(ST(1),n_a);
249 pkg = gv_stashsv(sv, FALSE);
253 GV *gv = gv_fetchmethod_autoload(pkg, name, FALSE);
255 rv = sv_2mortal(newRV((SV*)GvCV(gv)));
262 XS(XS_UNIVERSAL_VERSION)
272 sv = (SV*)SvRV(ST(0));
274 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
278 pkg = gv_stashsv(ST(0), FALSE);
281 gvp = pkg ? (GV**)hv_fetch(pkg,"VERSION",7,FALSE) : Null(GV**);
283 if (gvp && isGV(gv = *gvp) && SvOK(sv = GvSV(gv))) {
284 SV *nsv = sv_newmortal();
290 sv = (SV*)&PL_sv_undef;
301 "%s does not define $%s::VERSION--version check failed",
302 HvNAME(pkg), HvNAME(pkg));
304 char *str = SvPVx(ST(0), len);
307 "%s defines neither package nor VERSION--version check failed", str);
310 if (!SvNIOK(sv) && SvPOK(sv)) {
311 char *str = SvPVx(sv,len);
314 /* XXX could DWIM "1.2.3" here */
315 if (!isDIGIT(str[len]) && str[len] != '.' && str[len] != '_')
319 if (SvNOK(req) && SvPOK(req)) {
320 /* they said C<use Foo v1.2.3> and $Foo::VERSION
321 * doesn't look like a float: do string compare */
322 if (sv_cmp(req,sv) == 1) {
323 Perl_croak(aTHX_ "%s v%"VDf" required--"
324 "this is only v%"VDf,
325 HvNAME(pkg), req, sv);
329 /* they said C<use Foo 1.002_003> and $Foo::VERSION
330 * doesn't look like a float: force numeric compare */
331 (void)SvUPGRADE(sv, SVt_PVNV);
332 SvNVX(sv) = str_to_version(sv);
337 /* if we get here, we're looking for a numeric comparison,
338 * so force the required version into a float, even if they
339 * said C<use Foo v1.2.3> */
340 if (SvNOK(req) && SvPOK(req)) {
342 req = sv_newmortal();
346 if (SvNV(req) > SvNV(sv))
347 Perl_croak(aTHX_ "%s version %s required--this is only version %s",
348 HvNAME(pkg), SvPV_nolen(req), SvPV_nolen(sv));
361 Perl_croak(aTHX_ "Usage: utf8::valid(sv)");
366 char *s = SvPV(sv,len);
367 if (!SvUTF8(sv) || is_utf8_string((U8*)s,len))
380 Perl_croak(aTHX_ "Usage: utf8::encode(sv)");
393 Perl_croak(aTHX_ "Usage: utf8::decode(sv)");
398 RETVAL = sv_utf8_decode(sv);
399 ST(0) = boolSV(RETVAL);
409 Perl_croak(aTHX_ "Usage: utf8::upgrade(sv)");
415 RETVAL = sv_utf8_upgrade(sv);
416 XSprePUSH; PUSHi((IV)RETVAL);
421 XS(XS_utf8_downgrade)
424 if (items < 1 || items > 2)
425 Perl_croak(aTHX_ "Usage: utf8::downgrade(sv, failok=0)");
434 failok = (int)SvIV(ST(1));
437 RETVAL = sv_utf8_downgrade(sv, failok);
438 ST(0) = boolSV(RETVAL);
444 XS(XS_utf8_native_to_unicode)
450 Perl_croak(aTHX_ "Usage: utf8::native_to_unicode(sv)");
452 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
456 XS(XS_utf8_unicode_to_native)
462 Perl_croak(aTHX_ "Usage: utf8::unicode_to_native(sv)");
464 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
468 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
471 SV *sv = SvRV(ST(0));
478 else if (items == 2) {
484 /* I hope you really know what you are doing. */
489 XSRETURN_UNDEF; /* Can't happen. */
492 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
495 SV *sv = SvRV(ST(0));
497 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
498 else if (items == 2) {
499 /* I hope you really know what you are doing. */
500 SvREFCNT(sv) = SvIV(ST(1));
501 XSRETURN_IV(SvREFCNT(sv));
503 XSRETURN_UNDEF; /* Can't happen. */
506 /* Maybe this should return the number of placeholders found in scalar context,
507 and a list of them in list context. */
508 XS(XS_Internals_hv_clear_placehold)
511 HV *hv = (HV *) SvRV(ST(0));
513 /* I don't care how many parameters were passed in, but I want to avoid
514 the unused variable warning. */
516 items = (I32)HvPLACEHOLDERS(hv);
520 I32 riter = HvRITER(hv);
521 HE *eiter = HvEITER(hv);
523 /* This may look suboptimal with the items *after* the iternext, but
524 it's quite deliberate. We only get here with items==0 if we've
525 just deleted the last placeholder in the hash. If we've just done
526 that then it means that the hash is in lazy delete mode, and the
527 HE is now only referenced in our iterator. If we just quit the loop
528 and discarded our iterator then the HE leaks. So we do the && the
529 other way to ensure iternext is called just one more time, which
530 has the side effect of triggering the lazy delete. */
531 while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
533 SV *val = hv_iterval(hv, entry);
535 if (val == &PL_sv_undef) {
537 /* It seems that I have to go back in the front of the hash
538 API to delete a hash, even though I have a HE structure
539 pointing to the very entry I want to delete, and could hold
540 onto the previous HE that points to it. And it's easier to
541 go in with SVs as I can then specify the precomputed hash,
542 and don't have fun and games with utf8 keys. */
543 SV *key = hv_iterkeysv(entry);
545 hv_delete_ent (hv, key, G_DISCARD, HeHASH(entry));