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))
48 if (strEQ(name, "UNIVERSAL"))
52 Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
55 gvp = (GV**)hv_fetch(stash, "::ISA::CACHE::", 14, FALSE);
57 if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (subgen = GvSV(gv))
60 if (SvIV(subgen) == (IV)PL_sub_generation) {
62 SV** svp = (SV**)hv_fetch(hv, name, len, FALSE);
63 if (svp && (sv = *svp) != (SV*)&PL_sv_undef) {
64 DEBUG_o( Perl_deb(aTHX_ "Using cached ISA %s for package %s\n",
65 name, HvNAME(stash)) );
70 DEBUG_o( Perl_deb(aTHX_ "ISA Cache in package %s is stale\n",
73 sv_setiv(subgen, PL_sub_generation);
77 gvp = (GV**)hv_fetch(stash,"ISA",3,FALSE);
79 if (gvp && (gv = *gvp) != (GV*)&PL_sv_undef && (av = GvAV(gv))) {
81 gvp = (GV**)hv_fetch(stash, "::ISA::CACHE::", 14, TRUE);
85 if (SvTYPE(gv) != SVt_PVGV)
86 gv_init(gv, stash, "::ISA::CACHE::", 14, TRUE);
91 subgen = newSViv(PL_sub_generation);
96 SV** svp = AvARRAY(av);
97 /* NOTE: No support for tied ISA */
98 I32 items = AvFILLp(av) + 1;
101 HV* basestash = gv_stashsv(sv, FALSE);
103 if (ckWARN(WARN_MISC))
104 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
105 "Can't locate package %"SVf" for @%s::ISA",
109 if (&PL_sv_yes == isa_lookup(basestash, name, name_stash,
111 (void)hv_store(hv,name,len,&PL_sv_yes,0);
115 (void)hv_store(hv,name,len,&PL_sv_no,0);
122 =head1 SV Manipulation Functions
124 =for apidoc sv_derived_from
126 Returns a boolean indicating whether the SV is derived from the specified
127 class. This is the function that implements C<UNIVERSAL::isa>. It works
128 for class names as well as for objects.
134 Perl_sv_derived_from(pTHX_ SV *sv, const char *name)
148 type = sv_reftype(sv,0);
153 stash = gv_stashsv(sv, FALSE);
156 name_stash = gv_stashpv(name, FALSE);
158 return (type && strEQ(type,name)) ||
159 (stash && isa_lookup(stash, name, name_stash, strlen(name), 0)
167 void XS_UNIVERSAL_isa(pTHX_ CV *cv);
168 void XS_UNIVERSAL_can(pTHX_ CV *cv);
169 void XS_UNIVERSAL_VERSION(pTHX_ CV *cv);
171 XS(XS_version_stringify);
172 XS(XS_version_numify);
174 XS(XS_version_boolean);
176 XS(XS_version_is_alpha);
182 XS(XS_utf8_downgrade);
183 XS(XS_utf8_unicode_to_native);
184 XS(XS_utf8_native_to_unicode);
185 XS(XS_Internals_SvREADONLY);
186 XS(XS_Internals_SvREFCNT);
187 XS(XS_Internals_hv_clear_placehold);
188 XS(XS_PerlIO_get_layers);
189 XS(XS_Regexp_DESTROY);
190 XS(XS_Internals_hash_seed);
191 XS(XS_Internals_new_hash_seed);
192 XS(XS_Internals_HvREHASH);
195 Perl_boot_core_UNIVERSAL(pTHX)
197 char *file = __FILE__;
199 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
200 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
201 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
203 /* register the overloading (type 'A') magic */
204 PL_amagic_generation++;
205 /* Make it findable via fetchmethod */
206 newXS("version::()", XS_version_noop, file);
207 newXS("version::new", XS_version_new, file);
208 newXS("version::(\"\"", XS_version_stringify, file);
209 newXS("version::stringify", XS_version_stringify, file);
210 newXS("version::(0+", XS_version_numify, file);
211 newXS("version::numify", XS_version_numify, file);
212 newXS("version::(cmp", XS_version_vcmp, file);
213 newXS("version::(<=>", XS_version_vcmp, file);
214 newXS("version::vcmp", XS_version_vcmp, file);
215 newXS("version::(bool", XS_version_boolean, file);
216 newXS("version::boolean", XS_version_boolean, file);
217 newXS("version::(nomethod", XS_version_noop, file);
218 newXS("version::noop", XS_version_noop, file);
219 newXS("version::is_alpha", XS_version_is_alpha, file);
221 newXS("utf8::is_utf8", XS_utf8_is_utf8, file);
222 newXS("utf8::valid", XS_utf8_valid, file);
223 newXS("utf8::encode", XS_utf8_encode, file);
224 newXS("utf8::decode", XS_utf8_decode, file);
225 newXS("utf8::upgrade", XS_utf8_upgrade, file);
226 newXS("utf8::downgrade", XS_utf8_downgrade, file);
227 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
228 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
229 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
230 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
231 newXSproto("Internals::hv_clear_placeholders",
232 XS_Internals_hv_clear_placehold, file, "\\%");
233 newXSproto("PerlIO::get_layers",
234 XS_PerlIO_get_layers, file, "*;@");
235 newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
236 newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
237 newXSproto("Internals::new_hash_seed",XS_Internals_new_hash_seed, file,
239 newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
251 Perl_croak(aTHX_ "Usage: UNIVERSAL::isa(reference, kind)");
258 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
259 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
262 name = (char *)SvPV(ST(1),n_a);
264 ST(0) = boolSV(sv_derived_from(sv, name));
278 Perl_croak(aTHX_ "Usage: UNIVERSAL::can(object-ref, method)");
285 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
286 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
289 name = (char *)SvPV(ST(1),n_a);
298 pkg = gv_stashsv(sv, FALSE);
302 GV *gv = gv_fetchmethod_autoload(pkg, name, FALSE);
304 rv = sv_2mortal(newRV((SV*)GvCV(gv)));
311 XS(XS_UNIVERSAL_VERSION)
321 sv = (SV*)SvRV(ST(0));
323 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
327 pkg = gv_stashsv(ST(0), FALSE);
330 gvp = pkg ? (GV**)hv_fetch(pkg,"VERSION",7,FALSE) : Null(GV**);
332 if (gvp && isGV(gv = *gvp) && SvOK(sv = GvSV(gv))) {
333 SV *nsv = sv_newmortal();
339 sv = (SV*)&PL_sv_undef;
350 "%s does not define $%s::VERSION--version check failed",
351 HvNAME(pkg), HvNAME(pkg));
353 char *str = SvPVx(ST(0), len);
356 "%s defines neither package nor VERSION--version check failed", str);
359 if ( !sv_derived_from(sv, "version"))
360 sv = new_version(sv);
362 if ( !sv_derived_from(req, "version"))
363 req = new_version(req);
365 if ( vcmp( SvRV(req), SvRV(sv) ) > 0 )
367 "%s version %"SVf" required--this is only version %"SVf,
368 HvNAME(pkg), req, sv);
380 Perl_croak(aTHX_ "Usage: version::new(class, version)");
383 /* char * class = (char *)SvPV_nolen(ST(0)); */
387 char *vs = savepvn(SvPVX(ST(2)),SvCUR(ST(2)));
388 version = Perl_newSVpvf(aTHX_ "v%s",vs);
391 PUSHs(new_version(version));
397 XS(XS_version_stringify)
401 Perl_croak(aTHX_ "Usage: version::stringify(lobj, ...)");
406 if (sv_derived_from(ST(0), "version")) {
407 SV *tmp = SvRV(ST(0));
411 Perl_croak(aTHX_ "lobj is not of type version");
414 PUSHs(vstringify(lobj));
422 XS(XS_version_numify)
426 Perl_croak(aTHX_ "Usage: version::numify(lobj, ...)");
431 if (sv_derived_from(ST(0), "version")) {
432 SV *tmp = SvRV(ST(0));
436 Perl_croak(aTHX_ "lobj is not of type version");
439 PUSHs(vnumify(lobj));
451 Perl_croak(aTHX_ "Usage: version::vcmp(lobj, ...)");
456 if (sv_derived_from(ST(0), "version")) {
457 SV *tmp = SvRV(ST(0));
461 Perl_croak(aTHX_ "lobj is not of type version");
467 IV swap = (IV)SvIV(ST(2));
469 if ( ! sv_derived_from(robj, "version") )
471 robj = new_version(robj);
477 rs = newSViv(vcmp(rvs,lobj));
481 rs = newSViv(vcmp(lobj,rvs));
492 XS(XS_version_boolean)
496 Perl_croak(aTHX_ "Usage: version::boolean(lobj, ...)");
501 if (sv_derived_from(ST(0), "version")) {
502 SV *tmp = SvRV(ST(0));
506 Perl_croak(aTHX_ "lobj is not of type version");
510 rs = newSViv( vcmp(lobj,new_version(newSVpvn("0",1))) );
523 Perl_croak(aTHX_ "Usage: version::noop(lobj, ...)");
527 if (sv_derived_from(ST(0), "version")) {
528 SV *tmp = SvRV(ST(0));
532 Perl_croak(aTHX_ "lobj is not of type version");
535 Perl_croak(aTHX_ "operation not supported with version object");
542 XS(XS_version_is_alpha)
546 Perl_croak(aTHX_ "Usage: version::is_alpha(lobj)");
551 if (sv_derived_from(ST(0), "version")) {
552 SV *tmp = SvRV(ST(0));
556 Perl_croak(aTHX_ "lobj is not of type version");
558 I32 len = av_len((AV *)lobj);
559 I32 digit = SvIVX(*av_fetch((AV *)lobj, len, 0));
574 Perl_croak(aTHX_ "Usage: utf8::is_utf8(sv)");
591 Perl_croak(aTHX_ "Usage: utf8::valid(sv)");
596 char *s = SvPV(sv,len);
597 if (!SvUTF8(sv) || is_utf8_string((U8*)s,len))
610 Perl_croak(aTHX_ "Usage: utf8::encode(sv)");
623 Perl_croak(aTHX_ "Usage: utf8::decode(sv)");
628 RETVAL = sv_utf8_decode(sv);
629 ST(0) = boolSV(RETVAL);
639 Perl_croak(aTHX_ "Usage: utf8::upgrade(sv)");
645 RETVAL = sv_utf8_upgrade(sv);
646 XSprePUSH; PUSHi((IV)RETVAL);
651 XS(XS_utf8_downgrade)
654 if (items < 1 || items > 2)
655 Perl_croak(aTHX_ "Usage: utf8::downgrade(sv, failok=0)");
664 failok = (int)SvIV(ST(1));
667 RETVAL = sv_utf8_downgrade(sv, failok);
668 ST(0) = boolSV(RETVAL);
674 XS(XS_utf8_native_to_unicode)
680 Perl_croak(aTHX_ "Usage: utf8::native_to_unicode(sv)");
682 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
686 XS(XS_utf8_unicode_to_native)
692 Perl_croak(aTHX_ "Usage: utf8::unicode_to_native(sv)");
694 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
698 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
701 SV *sv = SvRV(ST(0));
708 else if (items == 2) {
714 /* I hope you really know what you are doing. */
719 XSRETURN_UNDEF; /* Can't happen. */
722 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
725 SV *sv = SvRV(ST(0));
727 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
728 else if (items == 2) {
729 /* I hope you really know what you are doing. */
730 SvREFCNT(sv) = SvIV(ST(1));
731 XSRETURN_IV(SvREFCNT(sv));
733 XSRETURN_UNDEF; /* Can't happen. */
736 /* Maybe this should return the number of placeholders found in scalar context,
737 and a list of them in list context. */
738 XS(XS_Internals_hv_clear_placehold)
741 HV *hv = (HV *) SvRV(ST(0));
743 /* I don't care how many parameters were passed in, but I want to avoid
744 the unused variable warning. */
746 items = (I32)HvPLACEHOLDERS(hv);
750 I32 riter = HvRITER(hv);
751 HE *eiter = HvEITER(hv);
753 /* This may look suboptimal with the items *after* the iternext, but
754 it's quite deliberate. We only get here with items==0 if we've
755 just deleted the last placeholder in the hash. If we've just done
756 that then it means that the hash is in lazy delete mode, and the
757 HE is now only referenced in our iterator. If we just quit the loop
758 and discarded our iterator then the HE leaks. So we do the && the
759 other way to ensure iternext is called just one more time, which
760 has the side effect of triggering the lazy delete. */
761 while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
763 SV *val = hv_iterval(hv, entry);
765 if (val == &PL_sv_placeholder) {
767 /* It seems that I have to go back in the front of the hash
768 API to delete a hash, even though I have a HE structure
769 pointing to the very entry I want to delete, and could hold
770 onto the previous HE that points to it. And it's easier to
771 go in with SVs as I can then specify the precomputed hash,
772 and don't have fun and games with utf8 keys. */
773 SV *key = hv_iterkeysv(entry);
775 hv_delete_ent (hv, key, G_DISCARD, HeHASH(entry));
786 XS(XS_Regexp_DESTROY)
791 XS(XS_PerlIO_get_layers)
794 if (items < 1 || items % 2 == 0)
795 Perl_croak(aTHX_ "Usage: PerlIO_get_layers(filehandle[,args])");
802 bool details = FALSE;
807 for (svp = MARK + 2; svp <= SP; svp += 2) {
811 char *key = SvPV(*varp, klen);
815 if (klen == 5 && memEQ(key, "input", 5)) {
816 input = SvTRUE(*valp);
821 if (klen == 6 && memEQ(key, "output", 6)) {
822 input = !SvTRUE(*valp);
827 if (klen == 7 && memEQ(key, "details", 7)) {
828 details = SvTRUE(*valp);
835 "get_layers: unknown argument '%s'",
847 if (SvROK(sv) && isGV(SvRV(sv)))
850 gv = gv_fetchpv(SvPVX(sv), FALSE, SVt_PVIO);
853 if (gv && (io = GvIO(gv))) {
855 AV* av = PerlIO_get_layers(aTHX_ input ?
856 IoIFP(io) : IoOFP(io));
858 I32 last = av_len(av);
861 for (i = last; i >= 0; i -= 3) {
865 bool namok, argok, flgok;
867 namsvp = av_fetch(av, i - 2, FALSE);
868 argsvp = av_fetch(av, i - 1, FALSE);
869 flgsvp = av_fetch(av, i, FALSE);
871 namok = namsvp && *namsvp && SvPOK(*namsvp);
872 argok = argsvp && *argsvp && SvPOK(*argsvp);
873 flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
877 newSVpv(SvPVX(*namsvp), 0) : &PL_sv_undef);
879 newSVpv(SvPVX(*argsvp), 0) : &PL_sv_undef);
881 XPUSHi(SvIVX(*flgsvp));
883 XPUSHs(&PL_sv_undef);
888 XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
891 XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf, *namsvp));
893 XPUSHs(&PL_sv_undef);
896 IV flags = SvIVX(*flgsvp);
898 if (flags & PERLIO_F_UTF8) {
899 XPUSHs(newSVpvn("utf8", 4));
916 XS(XS_Internals_hash_seed)
918 /* Using dXSARGS would also have dITEM and dSP,
919 * which define 2 unused local variables. */
921 XSRETURN_UV(PERL_HASH_SEED);
924 XS(XS_Internals_new_hash_seed)
926 /* Using dXSARGS would also have dITEM and dSP,
927 * which define 2 unused local variables. */
929 XSRETURN_UV(PL_new_hash_seed);
932 XS(XS_Internals_HvREHASH) /* Subject to change */
936 HV *hv = (HV *) SvRV(ST(0));
937 if (items == 1 && SvTYPE(hv) == SVt_PVHV) {
944 Perl_croak(aTHX_ "Internals::HvREHASH $hashref");