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);
178 XS(XS_utf8_downgrade);
179 XS(XS_utf8_unicode_to_native);
180 XS(XS_utf8_native_to_unicode);
181 XS(XS_Internals_SvREADONLY);
182 XS(XS_Internals_SvREFCNT);
183 XS(XS_Internals_hv_clear_placehold);
184 XS(XS_PerlIO_get_layers);
185 XS(XS_Regexp_DESTROY);
188 Perl_boot_core_UNIVERSAL(pTHX)
190 char *file = __FILE__;
192 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
193 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
194 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
196 /* register the overloading (type 'A') magic */
197 PL_amagic_generation++;
198 /* Make it findable via fetchmethod */
199 newXS("version::()", XS_version_noop, file);
200 newXS("version::new", XS_version_new, file);
201 newXS("version::(\"\"", XS_version_stringify, file);
202 newXS("version::stringify", XS_version_stringify, file);
203 newXS("version::(0+", XS_version_numify, file);
204 newXS("version::numify", XS_version_numify, file);
205 newXS("version::(cmp", XS_version_vcmp, file);
206 newXS("version::(<=>", XS_version_vcmp, file);
207 newXS("version::vcmp", XS_version_vcmp, file);
208 newXS("version::(bool", XS_version_boolean, file);
209 newXS("version::boolean", XS_version_boolean, file);
210 newXS("version::(nomethod", XS_version_noop, file);
211 newXS("version::noop", XS_version_noop, file);
213 newXS("utf8::valid", XS_utf8_valid, file);
214 newXS("utf8::encode", XS_utf8_encode, file);
215 newXS("utf8::decode", XS_utf8_decode, file);
216 newXS("utf8::upgrade", XS_utf8_upgrade, file);
217 newXS("utf8::downgrade", XS_utf8_downgrade, file);
218 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
219 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
220 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
221 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
222 newXSproto("Internals::hv_clear_placeholders",
223 XS_Internals_hv_clear_placehold, file, "\\%");
224 newXSproto("PerlIO::get_layers",
225 XS_PerlIO_get_layers, file, "*;@");
226 newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
238 Perl_croak(aTHX_ "Usage: UNIVERSAL::isa(reference, kind)");
245 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
246 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
249 name = (char *)SvPV(ST(1),n_a);
251 ST(0) = boolSV(sv_derived_from(sv, name));
265 Perl_croak(aTHX_ "Usage: UNIVERSAL::can(object-ref, method)");
272 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
273 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
276 name = (char *)SvPV(ST(1),n_a);
285 pkg = gv_stashsv(sv, FALSE);
289 GV *gv = gv_fetchmethod_autoload(pkg, name, FALSE);
291 rv = sv_2mortal(newRV((SV*)GvCV(gv)));
298 XS(XS_UNIVERSAL_VERSION)
308 sv = (SV*)SvRV(ST(0));
310 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
314 pkg = gv_stashsv(ST(0), FALSE);
317 gvp = pkg ? (GV**)hv_fetch(pkg,"VERSION",7,FALSE) : Null(GV**);
319 if (gvp && isGV(gv = *gvp) && SvOK(sv = GvSV(gv))) {
320 SV *nsv = sv_newmortal();
326 sv = (SV*)&PL_sv_undef;
337 "%s does not define $%s::VERSION--version check failed",
338 HvNAME(pkg), HvNAME(pkg));
340 char *str = SvPVx(ST(0), len);
343 "%s defines neither package nor VERSION--version check failed", str);
346 if ( !sv_derived_from(sv, "version"))
347 sv = new_version(sv);
349 if ( !sv_derived_from(req, "version"))
350 req = new_version(req);
352 if ( vcmp( SvRV(req), SvRV(sv) ) > 0 )
354 "%s version %"SVf" required--this is only version %"SVf,
355 HvNAME(pkg), req, sv);
367 Perl_croak(aTHX_ "Usage: version::new(class, version)");
370 /* char * class = (char *)SvPV_nolen(ST(0)); */
374 char *vs = savepvn(SvPVX(ST(2)),SvCUR(ST(2)));
375 version = Perl_newSVpvf(aTHX_ "v%s",vs);
378 PUSHs(new_version(version));
384 XS(XS_version_stringify)
388 Perl_croak(aTHX_ "Usage: version::stringify(lobj, ...)");
393 if (sv_derived_from(ST(0), "version")) {
394 SV *tmp = SvRV(ST(0));
398 Perl_croak(aTHX_ "lobj is not of type version");
401 PUSHs(vstringify(lobj));
409 XS(XS_version_numify)
413 Perl_croak(aTHX_ "Usage: version::numify(lobj, ...)");
418 if (sv_derived_from(ST(0), "version")) {
419 SV *tmp = SvRV(ST(0));
423 Perl_croak(aTHX_ "lobj is not of type version");
426 PUSHs(vnumify(lobj));
438 Perl_croak(aTHX_ "Usage: version::vcmp(lobj, ...)");
443 if (sv_derived_from(ST(0), "version")) {
444 SV *tmp = SvRV(ST(0));
448 Perl_croak(aTHX_ "lobj is not of type version");
454 IV swap = (IV)SvIV(ST(2));
456 if ( ! sv_derived_from(robj, "version") )
458 robj = new_version(robj);
464 rs = newSViv(vcmp(rvs,lobj));
468 rs = newSViv(vcmp(lobj,rvs));
479 XS(XS_version_boolean)
483 Perl_croak(aTHX_ "Usage: version::boolean(lobj, ...)");
488 if (sv_derived_from(ST(0), "version")) {
489 SV *tmp = SvRV(ST(0));
493 Perl_croak(aTHX_ "lobj is not of type version");
497 rs = newSViv( vcmp(lobj,new_version(newSVpvn("0",1))) );
510 Perl_croak(aTHX_ "Usage: version::noop(lobj, ...)");
514 if (sv_derived_from(ST(0), "version")) {
515 SV *tmp = SvRV(ST(0));
519 Perl_croak(aTHX_ "lobj is not of type version");
522 Perl_croak(aTHX_ "operation not supported with version object");
533 Perl_croak(aTHX_ "Usage: utf8::valid(sv)");
538 char *s = SvPV(sv,len);
539 if (!SvUTF8(sv) || is_utf8_string((U8*)s,len))
552 Perl_croak(aTHX_ "Usage: utf8::encode(sv)");
565 Perl_croak(aTHX_ "Usage: utf8::decode(sv)");
570 RETVAL = sv_utf8_decode(sv);
571 ST(0) = boolSV(RETVAL);
581 Perl_croak(aTHX_ "Usage: utf8::upgrade(sv)");
587 RETVAL = sv_utf8_upgrade(sv);
588 XSprePUSH; PUSHi((IV)RETVAL);
593 XS(XS_utf8_downgrade)
596 if (items < 1 || items > 2)
597 Perl_croak(aTHX_ "Usage: utf8::downgrade(sv, failok=0)");
606 failok = (int)SvIV(ST(1));
609 RETVAL = sv_utf8_downgrade(sv, failok);
610 ST(0) = boolSV(RETVAL);
616 XS(XS_utf8_native_to_unicode)
622 Perl_croak(aTHX_ "Usage: utf8::native_to_unicode(sv)");
624 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
628 XS(XS_utf8_unicode_to_native)
634 Perl_croak(aTHX_ "Usage: utf8::unicode_to_native(sv)");
636 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
640 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
643 SV *sv = SvRV(ST(0));
650 else if (items == 2) {
656 /* I hope you really know what you are doing. */
661 XSRETURN_UNDEF; /* Can't happen. */
664 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
667 SV *sv = SvRV(ST(0));
669 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
670 else if (items == 2) {
671 /* I hope you really know what you are doing. */
672 SvREFCNT(sv) = SvIV(ST(1));
673 XSRETURN_IV(SvREFCNT(sv));
675 XSRETURN_UNDEF; /* Can't happen. */
678 /* Maybe this should return the number of placeholders found in scalar context,
679 and a list of them in list context. */
680 XS(XS_Internals_hv_clear_placehold)
683 HV *hv = (HV *) SvRV(ST(0));
685 /* I don't care how many parameters were passed in, but I want to avoid
686 the unused variable warning. */
688 items = (I32)HvPLACEHOLDERS(hv);
692 I32 riter = HvRITER(hv);
693 HE *eiter = HvEITER(hv);
695 /* This may look suboptimal with the items *after* the iternext, but
696 it's quite deliberate. We only get here with items==0 if we've
697 just deleted the last placeholder in the hash. If we've just done
698 that then it means that the hash is in lazy delete mode, and the
699 HE is now only referenced in our iterator. If we just quit the loop
700 and discarded our iterator then the HE leaks. So we do the && the
701 other way to ensure iternext is called just one more time, which
702 has the side effect of triggering the lazy delete. */
703 while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
705 SV *val = hv_iterval(hv, entry);
707 if (val == &PL_sv_undef) {
709 /* It seems that I have to go back in the front of the hash
710 API to delete a hash, even though I have a HE structure
711 pointing to the very entry I want to delete, and could hold
712 onto the previous HE that points to it. And it's easier to
713 go in with SVs as I can then specify the precomputed hash,
714 and don't have fun and games with utf8 keys. */
715 SV *key = hv_iterkeysv(entry);
717 hv_delete_ent (hv, key, G_DISCARD, HeHASH(entry));
728 XS(XS_Regexp_DESTROY)
733 XS(XS_PerlIO_get_layers)
736 if (items < 1 || items % 2 == 0)
737 Perl_croak(aTHX_ "Usage: PerlIO_get_layers(filehandle[,args])");
744 bool details = FALSE;
749 for (svp = MARK + 2; svp <= SP; svp += 2) {
753 char *key = SvPV(*varp, klen);
757 if (klen == 5 && memEQ(key, "input", 5)) {
758 input = SvTRUE(*valp);
763 if (klen == 6 && memEQ(key, "output", 6)) {
764 input = !SvTRUE(*valp);
769 if (klen == 7 && memEQ(key, "details", 7)) {
770 details = SvTRUE(*valp);
777 "get_layers: unknown argument '%s'",
789 if (SvROK(sv) && isGV(SvRV(sv)))
792 gv = gv_fetchpv(SvPVX(sv), FALSE, SVt_PVIO);
795 if (gv && (io = GvIO(gv))) {
797 AV* av = PerlIO_get_layers(aTHX_ input ?
798 IoIFP(io) : IoOFP(io));
800 I32 last = av_len(av);
803 for (i = last; i >= 0; i -= 3) {
807 bool namok, argok, flgok;
809 namsvp = av_fetch(av, i - 2, FALSE);
810 argsvp = av_fetch(av, i - 1, FALSE);
811 flgsvp = av_fetch(av, i, FALSE);
813 namok = namsvp && *namsvp && SvPOK(*namsvp);
814 argok = argsvp && *argsvp && SvPOK(*argsvp);
815 flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
819 newSVpv(SvPVX(*namsvp), 0) : &PL_sv_undef);
821 newSVpv(SvPVX(*argsvp), 0) : &PL_sv_undef);
823 XPUSHi(SvIVX(*flgsvp));
825 XPUSHs(&PL_sv_undef);
830 XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
833 XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf, *namsvp));
835 XPUSHs(&PL_sv_undef);
838 IV flags = SvIVX(*flgsvp);
840 if (flags & PERLIO_F_UTF8) {
841 XPUSHs(newSVpvn("utf8", 4));