3 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
4 * by Larry Wall and others
6 * You may distribute under the terms of either the GNU General Public
7 * License or the Artistic License, as specified in the README file.
12 * "The roots of those mountains must be roots indeed; there must be
13 * great secrets buried there which have not been discovered since the
14 * beginning." --Gandalf, relating Gollum's story
18 #define PERL_IN_UNIVERSAL_C
22 #include "perliol.h" /* For the PERLIO_F_XXX */
26 * Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
27 * The main guts of traverse_isa was actually copied from gv_fetchmeth
31 S_isa_lookup(pTHX_ HV *stash, const char *name, HV* name_stash,
40 /* A stash/class can go by many names (ie. User == main::User), so
41 we compare the stash itself just in case */
42 if (name_stash && (stash == name_stash))
45 if (strEQ(HvNAME(stash), name))
49 Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
52 gvp = (GV**)hv_fetch(stash, "::ISA::CACHE::", 14, FALSE);
54 if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (subgen = GvSV(gv))
57 if (SvIV(subgen) == (IV)PL_sub_generation) {
59 SV** svp = (SV**)hv_fetch(hv, name, len, FALSE);
60 if (svp && (sv = *svp) != (SV*)&PL_sv_undef) {
61 DEBUG_o( Perl_deb(aTHX_ "Using cached ISA %s for package %s\n",
62 name, HvNAME(stash)) );
67 DEBUG_o( Perl_deb(aTHX_ "ISA Cache in package %s is stale\n",
70 sv_setiv(subgen, PL_sub_generation);
74 gvp = (GV**)hv_fetch(stash,"ISA",3,FALSE);
76 if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (av = GvAV(gv))) {
78 gvp = (GV**)hv_fetch(stash, "::ISA::CACHE::", 14, TRUE);
82 if (SvTYPE(gv) != SVt_PVGV)
83 gv_init(gv, stash, "::ISA::CACHE::", 14, TRUE);
88 subgen = newSViv(PL_sub_generation);
93 SV** svp = AvARRAY(av);
94 /* NOTE: No support for tied ISA */
95 I32 items = AvFILLp(av) + 1;
98 HV* basestash = gv_stashsv(sv, FALSE);
100 if (ckWARN(WARN_MISC))
101 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
102 "Can't locate package %"SVf" for @%s::ISA",
106 if (&PL_sv_yes == isa_lookup(basestash, name, name_stash,
108 (void)hv_store(hv,name,len,&PL_sv_yes,0);
112 (void)hv_store(hv,name,len,&PL_sv_no,0);
116 return boolSV(strEQ(name, "UNIVERSAL"));
120 =head1 SV Manipulation Functions
122 =for apidoc sv_derived_from
124 Returns a boolean indicating whether the SV is derived from the specified
125 class. This is the function that implements C<UNIVERSAL::isa>. It works
126 for class names as well as for objects.
132 Perl_sv_derived_from(pTHX_ SV *sv, const char *name)
146 type = sv_reftype(sv,0);
151 stash = gv_stashsv(sv, FALSE);
154 name_stash = gv_stashpv(name, FALSE);
156 return (type && strEQ(type,name)) ||
157 (stash && isa_lookup(stash, name, name_stash, strlen(name), 0)
165 void XS_UNIVERSAL_isa(pTHX_ CV *cv);
166 void XS_UNIVERSAL_can(pTHX_ CV *cv);
167 void XS_UNIVERSAL_VERSION(pTHX_ CV *cv);
169 XS(XS_version_stringify);
170 XS(XS_version_numify);
172 XS(XS_version_boolean);
174 XS(XS_version_is_alpha);
180 XS(XS_utf8_downgrade);
181 XS(XS_utf8_unicode_to_native);
182 XS(XS_utf8_native_to_unicode);
183 XS(XS_Internals_SvREADONLY);
184 XS(XS_Internals_SvREFCNT);
185 XS(XS_Internals_hv_clear_placehold);
186 XS(XS_PerlIO_get_layers);
187 XS(XS_Regexp_DESTROY);
190 Perl_boot_core_UNIVERSAL(pTHX)
192 char *file = __FILE__;
194 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
195 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
196 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
198 /* register the overloading (type 'A') magic */
199 PL_amagic_generation++;
200 /* Make it findable via fetchmethod */
201 newXS("version::()", XS_version_noop, file);
202 newXS("version::new", XS_version_new, file);
203 newXS("version::(\"\"", XS_version_stringify, file);
204 newXS("version::stringify", XS_version_stringify, file);
205 newXS("version::(0+", XS_version_numify, file);
206 newXS("version::numify", XS_version_numify, file);
207 newXS("version::(cmp", XS_version_vcmp, file);
208 newXS("version::(<=>", XS_version_vcmp, file);
209 newXS("version::vcmp", XS_version_vcmp, file);
210 newXS("version::(bool", XS_version_boolean, file);
211 newXS("version::boolean", XS_version_boolean, file);
212 newXS("version::(nomethod", XS_version_noop, file);
213 newXS("version::noop", XS_version_noop, file);
214 newXS("version::is_alpha", XS_version_is_alpha, file);
216 newXS("utf8::is_utf8", XS_utf8_is_utf8, file);
217 newXS("utf8::valid", XS_utf8_valid, file);
218 newXS("utf8::encode", XS_utf8_encode, file);
219 newXS("utf8::decode", XS_utf8_decode, file);
220 newXS("utf8::upgrade", XS_utf8_upgrade, file);
221 newXS("utf8::downgrade", XS_utf8_downgrade, file);
222 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
223 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
224 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
225 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
226 newXSproto("Internals::hv_clear_placeholders",
227 XS_Internals_hv_clear_placehold, file, "\\%");
228 newXSproto("PerlIO::get_layers",
229 XS_PerlIO_get_layers, file, "*;@");
230 newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
242 Perl_croak(aTHX_ "Usage: UNIVERSAL::isa(reference, kind)");
249 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
250 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
253 name = (char *)SvPV(ST(1),n_a);
255 ST(0) = boolSV(sv_derived_from(sv, name));
269 Perl_croak(aTHX_ "Usage: UNIVERSAL::can(object-ref, method)");
276 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
277 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
280 name = (char *)SvPV(ST(1),n_a);
289 pkg = gv_stashsv(sv, FALSE);
293 GV *gv = gv_fetchmethod_autoload(pkg, name, FALSE);
295 rv = sv_2mortal(newRV((SV*)GvCV(gv)));
302 XS(XS_UNIVERSAL_VERSION)
312 sv = (SV*)SvRV(ST(0));
314 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
318 pkg = gv_stashsv(ST(0), FALSE);
321 gvp = pkg ? (GV**)hv_fetch(pkg,"VERSION",7,FALSE) : Null(GV**);
323 if (gvp && isGV(gv = *gvp) && SvOK(sv = GvSV(gv))) {
324 SV *nsv = sv_newmortal();
330 sv = (SV*)&PL_sv_undef;
341 "%s does not define $%s::VERSION--version check failed",
342 HvNAME(pkg), HvNAME(pkg));
344 char *str = SvPVx(ST(0), len);
347 "%s defines neither package nor VERSION--version check failed", str);
350 if ( !sv_derived_from(sv, "version"))
351 sv = new_version(sv);
353 if ( !sv_derived_from(req, "version"))
354 req = new_version(req);
356 if ( vcmp( SvRV(req), SvRV(sv) ) > 0 )
358 "%s version %"SVf" required--this is only version %"SVf,
359 HvNAME(pkg), req, sv);
371 Perl_croak(aTHX_ "Usage: version::new(class, version)");
374 /* char * class = (char *)SvPV_nolen(ST(0)); */
378 char *vs = savepvn(SvPVX(ST(2)),SvCUR(ST(2)));
379 version = Perl_newSVpvf(aTHX_ "v%s",vs);
382 PUSHs(new_version(version));
388 XS(XS_version_stringify)
392 Perl_croak(aTHX_ "Usage: version::stringify(lobj, ...)");
397 if (sv_derived_from(ST(0), "version")) {
398 SV *tmp = SvRV(ST(0));
402 Perl_croak(aTHX_ "lobj is not of type version");
405 PUSHs(vstringify(lobj));
413 XS(XS_version_numify)
417 Perl_croak(aTHX_ "Usage: version::numify(lobj, ...)");
422 if (sv_derived_from(ST(0), "version")) {
423 SV *tmp = SvRV(ST(0));
427 Perl_croak(aTHX_ "lobj is not of type version");
430 PUSHs(vnumify(lobj));
442 Perl_croak(aTHX_ "Usage: version::vcmp(lobj, ...)");
447 if (sv_derived_from(ST(0), "version")) {
448 SV *tmp = SvRV(ST(0));
452 Perl_croak(aTHX_ "lobj is not of type version");
458 IV swap = (IV)SvIV(ST(2));
460 if ( ! sv_derived_from(robj, "version") )
462 robj = new_version(robj);
468 rs = newSViv(vcmp(rvs,lobj));
472 rs = newSViv(vcmp(lobj,rvs));
483 XS(XS_version_boolean)
487 Perl_croak(aTHX_ "Usage: version::boolean(lobj, ...)");
492 if (sv_derived_from(ST(0), "version")) {
493 SV *tmp = SvRV(ST(0));
497 Perl_croak(aTHX_ "lobj is not of type version");
501 rs = newSViv( vcmp(lobj,new_version(newSVpvn("0",1))) );
514 Perl_croak(aTHX_ "Usage: version::noop(lobj, ...)");
518 if (sv_derived_from(ST(0), "version")) {
519 SV *tmp = SvRV(ST(0));
523 Perl_croak(aTHX_ "lobj is not of type version");
526 Perl_croak(aTHX_ "operation not supported with version object");
533 XS(XS_version_is_alpha)
537 Perl_croak(aTHX_ "Usage: version::is_alpha(lobj)");
542 if (sv_derived_from(ST(0), "version")) {
543 SV *tmp = SvRV(ST(0));
547 Perl_croak(aTHX_ "lobj is not of type version");
549 I32 len = av_len((AV *)lobj);
550 I32 digit = SvIVX(*av_fetch((AV *)lobj, len, 0));
565 Perl_croak(aTHX_ "Usage: utf8::is_utf8(sv)");
582 Perl_croak(aTHX_ "Usage: utf8::valid(sv)");
587 char *s = SvPV(sv,len);
588 if (!SvUTF8(sv) || is_utf8_string((U8*)s,len))
601 Perl_croak(aTHX_ "Usage: utf8::encode(sv)");
614 Perl_croak(aTHX_ "Usage: utf8::decode(sv)");
619 RETVAL = sv_utf8_decode(sv);
620 ST(0) = boolSV(RETVAL);
630 Perl_croak(aTHX_ "Usage: utf8::upgrade(sv)");
636 RETVAL = sv_utf8_upgrade(sv);
637 XSprePUSH; PUSHi((IV)RETVAL);
642 XS(XS_utf8_downgrade)
645 if (items < 1 || items > 2)
646 Perl_croak(aTHX_ "Usage: utf8::downgrade(sv, failok=0)");
655 failok = (int)SvIV(ST(1));
658 RETVAL = sv_utf8_downgrade(sv, failok);
659 ST(0) = boolSV(RETVAL);
665 XS(XS_utf8_native_to_unicode)
671 Perl_croak(aTHX_ "Usage: utf8::native_to_unicode(sv)");
673 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
677 XS(XS_utf8_unicode_to_native)
683 Perl_croak(aTHX_ "Usage: utf8::unicode_to_native(sv)");
685 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
689 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
692 SV *sv = SvRV(ST(0));
699 else if (items == 2) {
705 /* I hope you really know what you are doing. */
710 XSRETURN_UNDEF; /* Can't happen. */
713 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
716 SV *sv = SvRV(ST(0));
718 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
719 else if (items == 2) {
720 /* I hope you really know what you are doing. */
721 SvREFCNT(sv) = SvIV(ST(1));
722 XSRETURN_IV(SvREFCNT(sv));
724 XSRETURN_UNDEF; /* Can't happen. */
727 /* Maybe this should return the number of placeholders found in scalar context,
728 and a list of them in list context. */
729 XS(XS_Internals_hv_clear_placehold)
732 HV *hv = (HV *) SvRV(ST(0));
734 /* I don't care how many parameters were passed in, but I want to avoid
735 the unused variable warning. */
737 items = (I32)HvPLACEHOLDERS(hv);
741 I32 riter = HvRITER(hv);
742 HE *eiter = HvEITER(hv);
744 /* This may look suboptimal with the items *after* the iternext, but
745 it's quite deliberate. We only get here with items==0 if we've
746 just deleted the last placeholder in the hash. If we've just done
747 that then it means that the hash is in lazy delete mode, and the
748 HE is now only referenced in our iterator. If we just quit the loop
749 and discarded our iterator then the HE leaks. So we do the && the
750 other way to ensure iternext is called just one more time, which
751 has the side effect of triggering the lazy delete. */
752 while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
754 SV *val = hv_iterval(hv, entry);
756 if (val == &PL_sv_undef) {
758 /* It seems that I have to go back in the front of the hash
759 API to delete a hash, even though I have a HE structure
760 pointing to the very entry I want to delete, and could hold
761 onto the previous HE that points to it. And it's easier to
762 go in with SVs as I can then specify the precomputed hash,
763 and don't have fun and games with utf8 keys. */
764 SV *key = hv_iterkeysv(entry);
766 hv_delete_ent (hv, key, G_DISCARD, HeHASH(entry));
777 XS(XS_Regexp_DESTROY)
782 XS(XS_PerlIO_get_layers)
785 if (items < 1 || items % 2 == 0)
786 Perl_croak(aTHX_ "Usage: PerlIO_get_layers(filehandle[,args])");
793 bool details = FALSE;
798 for (svp = MARK + 2; svp <= SP; svp += 2) {
802 char *key = SvPV(*varp, klen);
806 if (klen == 5 && memEQ(key, "input", 5)) {
807 input = SvTRUE(*valp);
812 if (klen == 6 && memEQ(key, "output", 6)) {
813 input = !SvTRUE(*valp);
818 if (klen == 7 && memEQ(key, "details", 7)) {
819 details = SvTRUE(*valp);
826 "get_layers: unknown argument '%s'",
838 if (SvROK(sv) && isGV(SvRV(sv)))
841 gv = gv_fetchpv(SvPVX(sv), FALSE, SVt_PVIO);
844 if (gv && (io = GvIO(gv))) {
846 AV* av = PerlIO_get_layers(aTHX_ input ?
847 IoIFP(io) : IoOFP(io));
849 I32 last = av_len(av);
852 for (i = last; i >= 0; i -= 3) {
856 bool namok, argok, flgok;
858 namsvp = av_fetch(av, i - 2, FALSE);
859 argsvp = av_fetch(av, i - 1, FALSE);
860 flgsvp = av_fetch(av, i, FALSE);
862 namok = namsvp && *namsvp && SvPOK(*namsvp);
863 argok = argsvp && *argsvp && SvPOK(*argsvp);
864 flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
868 newSVpv(SvPVX(*namsvp), 0) : &PL_sv_undef);
870 newSVpv(SvPVX(*argsvp), 0) : &PL_sv_undef);
872 XPUSHi(SvIVX(*flgsvp));
874 XPUSHs(&PL_sv_undef);
879 XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
882 XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf, *namsvp));
884 XPUSHs(&PL_sv_undef);
887 IV flags = SvIVX(*flgsvp);
889 if (flags & PERLIO_F_UTF8) {
890 XPUSHs(newSVpvn("utf8", 4));