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);
173 XS(XS_utf8_downgrade);
174 XS(XS_utf8_unicode_to_native);
175 XS(XS_utf8_native_to_unicode);
176 XS(XS_Internals_SvREADONLY);
177 XS(XS_Internals_SvREFCNT);
178 XS(XS_Internals_hv_clear_placehold);
179 XS(XS_PerlIO_get_layers);
182 Perl_boot_core_UNIVERSAL(pTHX)
184 char *file = __FILE__;
186 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
187 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
188 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
189 newXS("utf8::is_utf8", XS_utf8_is_utf8, file);
190 newXS("utf8::valid", XS_utf8_valid, file);
191 newXS("utf8::encode", XS_utf8_encode, file);
192 newXS("utf8::decode", XS_utf8_decode, file);
193 newXS("utf8::upgrade", XS_utf8_upgrade, file);
194 newXS("utf8::downgrade", XS_utf8_downgrade, file);
195 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
196 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
197 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
198 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
199 newXSproto("Internals::hv_clear_placeholders",
200 XS_Internals_hv_clear_placehold, file, "\\%");
201 newXSproto("PerlIO::get_layers",
202 XS_PerlIO_get_layers, file, "*;@");
214 Perl_croak(aTHX_ "Usage: UNIVERSAL::isa(reference, kind)");
221 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
222 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
225 name = (char *)SvPV(ST(1),n_a);
227 ST(0) = boolSV(sv_derived_from(sv, name));
241 Perl_croak(aTHX_ "Usage: UNIVERSAL::can(object-ref, method)");
248 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
249 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
252 name = (char *)SvPV(ST(1),n_a);
261 pkg = gv_stashsv(sv, FALSE);
265 GV *gv = gv_fetchmethod_autoload(pkg, name, FALSE);
267 rv = sv_2mortal(newRV((SV*)GvCV(gv)));
274 XS(XS_UNIVERSAL_VERSION)
284 sv = (SV*)SvRV(ST(0));
286 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
290 pkg = gv_stashsv(ST(0), FALSE);
293 gvp = pkg ? (GV**)hv_fetch(pkg,"VERSION",7,FALSE) : Null(GV**);
295 if (gvp && isGV(gv = *gvp) && SvOK(sv = GvSV(gv))) {
296 SV *nsv = sv_newmortal();
302 sv = (SV*)&PL_sv_undef;
313 "%s does not define $%s::VERSION--version check failed",
314 HvNAME(pkg), HvNAME(pkg));
316 char *str = SvPVx(ST(0), len);
319 "%s defines neither package nor VERSION--version check failed", str);
322 if (!SvNIOK(sv) && SvPOK(sv)) {
323 char *str = SvPVx(sv,len);
326 /* XXX could DWIM "1.2.3" here */
327 if (!isDIGIT(str[len]) && str[len] != '.' && str[len] != '_')
331 if (SvNOK(req) && SvPOK(req)) {
332 /* they said C<use Foo v1.2.3> and $Foo::VERSION
333 * doesn't look like a float: do string compare */
334 if (sv_cmp(req,sv) == 1) {
335 Perl_croak(aTHX_ "%s v%"VDf" required--"
336 "this is only v%"VDf,
337 HvNAME(pkg), req, sv);
341 /* they said C<use Foo 1.002_003> and $Foo::VERSION
342 * doesn't look like a float: force numeric compare */
343 (void)SvUPGRADE(sv, SVt_PVNV);
344 SvNVX(sv) = str_to_version(sv);
349 /* if we get here, we're looking for a numeric comparison,
350 * so force the required version into a float, even if they
351 * said C<use Foo v1.2.3> */
352 if (SvNOK(req) && SvPOK(req)) {
354 req = sv_newmortal();
358 if (SvNV(req) > SvNV(sv))
359 Perl_croak(aTHX_ "%s version %s required--this is only version %s",
360 HvNAME(pkg), SvPV_nolen(req), SvPV_nolen(sv));
373 Perl_croak(aTHX_ "Usage: utf8::is_utf8(sv)");
390 Perl_croak(aTHX_ "Usage: utf8::valid(sv)");
395 char *s = SvPV(sv,len);
396 if (!SvUTF8(sv) || is_utf8_string((U8*)s,len))
409 Perl_croak(aTHX_ "Usage: utf8::encode(sv)");
422 Perl_croak(aTHX_ "Usage: utf8::decode(sv)");
427 RETVAL = sv_utf8_decode(sv);
428 ST(0) = boolSV(RETVAL);
438 Perl_croak(aTHX_ "Usage: utf8::upgrade(sv)");
444 RETVAL = sv_utf8_upgrade(sv);
445 XSprePUSH; PUSHi((IV)RETVAL);
450 XS(XS_utf8_downgrade)
453 if (items < 1 || items > 2)
454 Perl_croak(aTHX_ "Usage: utf8::downgrade(sv, failok=0)");
463 failok = (int)SvIV(ST(1));
466 RETVAL = sv_utf8_downgrade(sv, failok);
467 ST(0) = boolSV(RETVAL);
473 XS(XS_utf8_native_to_unicode)
479 Perl_croak(aTHX_ "Usage: utf8::native_to_unicode(sv)");
481 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
485 XS(XS_utf8_unicode_to_native)
491 Perl_croak(aTHX_ "Usage: utf8::unicode_to_native(sv)");
493 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
497 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
500 SV *sv = SvRV(ST(0));
507 else if (items == 2) {
513 /* I hope you really know what you are doing. */
518 XSRETURN_UNDEF; /* Can't happen. */
521 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
524 SV *sv = SvRV(ST(0));
526 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
527 else if (items == 2) {
528 /* I hope you really know what you are doing. */
529 SvREFCNT(sv) = SvIV(ST(1));
530 XSRETURN_IV(SvREFCNT(sv));
532 XSRETURN_UNDEF; /* Can't happen. */
535 /* Maybe this should return the number of placeholders found in scalar context,
536 and a list of them in list context. */
537 XS(XS_Internals_hv_clear_placehold)
540 HV *hv = (HV *) SvRV(ST(0));
542 /* I don't care how many parameters were passed in, but I want to avoid
543 the unused variable warning. */
545 items = (I32)HvPLACEHOLDERS(hv);
549 I32 riter = HvRITER(hv);
550 HE *eiter = HvEITER(hv);
552 /* This may look suboptimal with the items *after* the iternext, but
553 it's quite deliberate. We only get here with items==0 if we've
554 just deleted the last placeholder in the hash. If we've just done
555 that then it means that the hash is in lazy delete mode, and the
556 HE is now only referenced in our iterator. If we just quit the loop
557 and discarded our iterator then the HE leaks. So we do the && the
558 other way to ensure iternext is called just one more time, which
559 has the side effect of triggering the lazy delete. */
560 while ((entry = hv_iternext_flags(hv, HV_ITERNEXT_WANTPLACEHOLDERS))
562 SV *val = hv_iterval(hv, entry);
564 if (val == &PL_sv_undef) {
566 /* It seems that I have to go back in the front of the hash
567 API to delete a hash, even though I have a HE structure
568 pointing to the very entry I want to delete, and could hold
569 onto the previous HE that points to it. And it's easier to
570 go in with SVs as I can then specify the precomputed hash,
571 and don't have fun and games with utf8 keys. */
572 SV *key = hv_iterkeysv(entry);
574 hv_delete_ent (hv, key, G_DISCARD, HeHASH(entry));
585 XS(XS_PerlIO_get_layers)
588 if (items < 1 || items % 2 == 0)
589 Perl_croak(aTHX_ "Usage: PerlIO_get_layers(filehandle[,args])");
596 bool details = FALSE;
601 for (svp = MARK + 2; svp <= SP; svp += 2) {
605 char *key = SvPV(*varp, klen);
609 if (klen == 5 && memEQ(key, "input", 5)) {
610 input = SvTRUE(*valp);
615 if (klen == 6 && memEQ(key, "output", 6)) {
616 input = !SvTRUE(*valp);
621 if (klen == 7 && memEQ(key, "details", 7)) {
622 details = SvTRUE(*valp);
629 "get_layers: unknown argument '%s'",
641 if (SvROK(sv) && isGV(SvRV(sv)))
644 gv = gv_fetchpv(SvPVX(sv), FALSE, SVt_PVIO);
647 if (gv && (io = GvIO(gv))) {
649 AV* av = PerlIO_get_layers(aTHX_ input ?
650 IoIFP(io) : IoOFP(io));
652 I32 last = av_len(av);
655 for (i = last; i >= 0; i -= 3) {
659 bool namok, argok, flgok;
661 namsvp = av_fetch(av, i - 2, FALSE);
662 argsvp = av_fetch(av, i - 1, FALSE);
663 flgsvp = av_fetch(av, i, FALSE);
665 namok = namsvp && *namsvp && SvPOK(*namsvp);
666 argok = argsvp && *argsvp && SvPOK(*argsvp);
667 flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
671 newSVpv(SvPVX(*namsvp), 0) : &PL_sv_undef);
673 newSVpv(SvPVX(*argsvp), 0) : &PL_sv_undef);
675 XPUSHi(SvIVX(*flgsvp));
677 XPUSHs(&PL_sv_undef);
682 XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
685 XPUSHs(Perl_newSVpvf(aTHX_ "%"SVf, *namsvp));
687 XPUSHs(&PL_sv_undef);
690 IV flags = SvIVX(*flgsvp);
692 if (flags & PERLIO_F_UTF8) {
693 XPUSHs(newSVpvn("utf8", 4));