4 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
5 * 2005, 2006, 2007, 2008 by Larry Wall and others
7 * You may distribute under the terms of either the GNU General Public
8 * License or the Artistic License, as specified in the README file.
13 * '"The roots of those mountains must be roots indeed; there must be
14 * great secrets buried there which have not been discovered since the
15 * beginning."' --Gandalf, relating Gollum's history
17 * [p.54 of _The Lord of the Rings_, I/ii: "The Shadow of the Past"]
20 /* This file contains the code that implements the functions in Perl's
21 * UNIVERSAL package, such as UNIVERSAL->can().
23 * It is also used to store XS functions that need to be present in
24 * miniperl for a lack of a better place to put them. It might be
25 * clever to move them to separate XS files which would then be pulled
26 * in by some to-be-written build process.
30 #define PERL_IN_UNIVERSAL_C
33 #if defined(USE_PERLIO)
34 #include "perliol.h" /* For the PERLIO_F_XXX */
38 * Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
39 * The main guts of traverse_isa was actually copied from gv_fetchmeth
42 #define PERL_ARGS_ASSERT_ISA_LOOKUP \
44 assert(namesv || name)
48 S_isa_lookup(pTHX_ HV *stash, SV *namesv, const char * name, STRLEN len, U32 flags)
50 const struct mro_meta *const meta = HvMROMETA(stash);
54 PERL_ARGS_ASSERT_ISA_LOOKUP;
57 (void)mro_get_linear_isa(stash);
61 if (hv_common(isa, namesv, name, len, ( flags & SVf_UTF8 ? HVhek_UTF8 : 0),
62 HV_FETCH_ISEXISTS, NULL, 0)) {
63 /* Direct name lookup worked. */
67 /* A stash/class can go by many names (ie. User == main::User), so
68 we use the HvENAME in the stash itself, which is canonical, falling
69 back to HvNAME if necessary. */
70 our_stash = gv_stashsvpvn_cached(namesv, name, len, flags);
73 HEK *canon_name = HvENAME_HEK(our_stash);
74 if (!canon_name) canon_name = HvNAME_HEK(our_stash);
76 if (hv_common(isa, NULL, HEK_KEY(canon_name), HEK_LEN(canon_name),
77 HEK_FLAGS(canon_name),
78 HV_FETCH_ISEXISTS, NULL, HEK_HASH(canon_name))) {
86 #define PERL_ARGS_ASSERT_SV_DERIVED_FROM_SVPVN \
88 assert(namesv || name)
91 S_sv_derived_from_svpvn(pTHX_ SV *sv, SV *namesv, const char * name, const STRLEN len, U32 flags)
95 PERL_ARGS_ASSERT_SV_DERIVED_FROM_SVPVN;
101 type = sv_reftype(sv,0);
104 name = SvPV_nolen(namesv);
105 if (strEQ(name, type))
113 stash = gv_stashsv(sv, 0);
116 if (stash && isa_lookup(stash, namesv, name, len, flags))
119 stash = gv_stashpvs("UNIVERSAL", 0);
120 return stash && isa_lookup(stash, namesv, name, len, flags);
124 =for apidoc_section $SV
126 =for apidoc sv_derived_from_pvn
128 Returns a boolean indicating whether the SV is derived from the specified class
129 I<at the C level>. To check derivation at the Perl level, call C<isa()> as a
132 Currently, the only significant value for C<flags> is SVf_UTF8.
136 =for apidoc sv_derived_from_sv
138 Exactly like L</sv_derived_from_pvn>, but takes the name string in the form
139 of an SV instead of a string/length pair. This is the advised form.
146 Perl_sv_derived_from_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
148 PERL_ARGS_ASSERT_SV_DERIVED_FROM_SV;
149 return sv_derived_from_svpvn(sv, namesv, NULL, 0, flags);
153 =for apidoc sv_derived_from
155 Exactly like L</sv_derived_from_pv>, but doesn't take a C<flags> parameter.
161 Perl_sv_derived_from(pTHX_ SV *sv, const char *const name)
163 PERL_ARGS_ASSERT_SV_DERIVED_FROM;
164 return sv_derived_from_svpvn(sv, NULL, name, strlen(name), 0);
168 =for apidoc sv_derived_from_pv
170 Exactly like L</sv_derived_from_pvn>, but takes a nul-terminated string
171 instead of a string/length pair.
178 Perl_sv_derived_from_pv(pTHX_ SV *sv, const char *const name, U32 flags)
180 PERL_ARGS_ASSERT_SV_DERIVED_FROM_PV;
181 return sv_derived_from_svpvn(sv, NULL, name, strlen(name), flags);
185 Perl_sv_derived_from_pvn(pTHX_ SV *sv, const char *const name, const STRLEN len, U32 flags)
187 PERL_ARGS_ASSERT_SV_DERIVED_FROM_PVN;
188 return sv_derived_from_svpvn(sv, NULL, name, len, flags);
192 =for apidoc sv_derived_from_hv
194 Exactly like L</sv_derived_from_pvn>, but takes the name string as the
195 C<HvNAME> of the given HV (which would presumably represent a stash).
201 Perl_sv_derived_from_hv(pTHX_ SV *sv, HV *hv)
203 PERL_ARGS_ASSERT_SV_DERIVED_FROM_HV;
205 const char *hvname = HvNAME(hv);
209 return sv_derived_from_svpvn(sv, NULL, hvname, HvNAMELEN(hv), HvNAMEUTF8(hv) ? SVf_UTF8 : 0);
213 =for apidoc sv_isa_sv
215 Returns a boolean indicating whether the SV is an object reference and is
216 derived from the specified class, respecting any C<isa()> method overloading
217 it may have. Returns false if C<sv> is not a reference to an object, or is
218 not derived from the specified class.
220 This is the function used to implement the behaviour of the C<isa> operator.
222 Does not invoke magic on C<sv>.
224 Not to be confused with the older C<sv_isa> function, which does not use an
225 overloaded C<isa()> method, nor will check subclassing.
232 Perl_sv_isa_sv(pTHX_ SV *sv, SV *namesv)
236 PERL_ARGS_ASSERT_SV_ISA_SV;
238 if(!SvROK(sv) || !SvOBJECT(SvRV(sv)))
241 isagv = gv_fetchmeth_pvn(SvSTASH(SvRV(sv)), "isa", 3, -1, GV_NOUNIVERSAL);
244 CV *isacv = isGV(isagv) ? GvCV(isagv) : (CV *)isagv;
259 call_sv((SV *)isacv, G_SCALAR);
272 /* TODO: Support namesv being an HV ref to the stash directly? */
274 return sv_derived_from_sv(sv, namesv, 0);
278 =for apidoc sv_does_sv
280 Returns a boolean indicating whether the SV performs a specific, named role.
281 The SV can be a Perl object or the name of a Perl class.
289 Perl_sv_does_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
296 PERL_ARGS_ASSERT_SV_DOES_SV;
297 PERL_UNUSED_ARG(flags);
304 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv)))) {
309 if (SvROK(sv) && SvOBJECT(SvRV(sv))) {
310 classname = sv_ref(NULL,SvRV(sv),TRUE);
315 if (sv_eq(classname, namesv)) {
326 /* create a PV with value "isa", but with a special address
327 * so that perl knows we're really doing "DOES" instead */
328 methodname = newSV_type_mortal(SVt_PV);
329 SvLEN_set(methodname, 0);
330 SvCUR_set(methodname, strlen(PL_isa_DOES));
331 SvPVX(methodname) = (char *)PL_isa_DOES; /* discard 'const' qualifier */
332 SvPOK_on(methodname);
333 call_sv(methodname, G_SCALAR | G_METHOD);
336 does_it = SvTRUE_NN( TOPs );
346 Like L</sv_does_pv>, but doesn't take a C<flags> parameter.
352 Perl_sv_does(pTHX_ SV *sv, const char *const name)
354 PERL_ARGS_ASSERT_SV_DOES;
355 return sv_does_sv(sv, newSVpvn_flags(name, strlen(name), SVs_TEMP), 0);
359 =for apidoc sv_does_pv
361 Like L</sv_does_sv>, but takes a nul-terminated string instead of an SV.
368 Perl_sv_does_pv(pTHX_ SV *sv, const char *const name, U32 flags)
370 PERL_ARGS_ASSERT_SV_DOES_PV;
371 return sv_does_sv(sv, newSVpvn_flags(name, strlen(name), SVs_TEMP | flags), flags);
375 =for apidoc sv_does_pvn
377 Like L</sv_does_sv>, but takes a string/length pair instead of an SV.
383 Perl_sv_does_pvn(pTHX_ SV *sv, const char *const name, const STRLEN len, U32 flags)
385 PERL_ARGS_ASSERT_SV_DOES_PVN;
387 return sv_does_sv(sv, newSVpvn_flags(name, len, flags | SVs_TEMP), flags);
391 =for apidoc croak_xs_usage
393 A specialised variant of C<croak()> for emitting the usage message for xsubs
395 croak_xs_usage(cv, "eee_yow");
397 works out the package name and subroutine name from C<cv>, and then calls
398 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
400 diag_listed_as: SKIPME
401 Perl_croak(aTHX_ "Usage: %" SVf "::%" SVf "(%s)", "ouch" "awk",
408 Perl_croak_xs_usage(const CV *const cv, const char *const params)
410 /* Avoid CvGV as it requires aTHX. */
411 const GV *gv = CvNAMED(cv) ? NULL : cv->sv_any->xcv_gv_u.xcv_gv;
413 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
416 const HV *const stash = GvSTASH(gv);
418 if (HvNAME_get(stash))
419 /* diag_listed_as: SKIPME */
420 Perl_croak_nocontext("Usage: %" HEKf "::%" HEKf "(%s)",
421 HEKfARG(HvNAME_HEK(stash)),
422 HEKfARG(GvNAME_HEK(gv)),
425 /* diag_listed_as: SKIPME */
426 Perl_croak_nocontext("Usage: %" HEKf "(%s)",
427 HEKfARG(GvNAME_HEK(gv)), params);
430 if ((gv = CvGV(cv))) goto got_gv;
432 /* Pants. I don't think that it should be possible to get here. */
433 /* diag_listed_as: SKIPME */
434 Perl_croak(aTHX_ "Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params);
438 XS(XS_UNIVERSAL_isa); /* prototype to pass -Wmissing-prototypes */
444 croak_xs_usage(cv, "reference, kind");
446 SV * const sv = ST(0);
450 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))))
453 ST(0) = boolSV(sv_derived_from_sv(sv, ST(1), 0));
458 XS(XS_UNIVERSAL_import_unimport); /* prototype to pass -Wmissing-prototypes */
459 XS(XS_UNIVERSAL_import_unimport)
465 char *class_pv= SvPV_nolen(ST(0));
466 if (strEQ(class_pv,"UNIVERSAL"))
467 Perl_croak(aTHX_ "UNIVERSAL does not export anything");
468 /* _charnames is special - ignore it for now as the code that
469 * depends on it has its own "no import" logic that produces better
470 * warnings than this does. */
471 if (strNE(class_pv,"_charnames"))
472 Perl_ck_warner_d(aTHX_
473 packWARN(WARN_DEPRECATED__MISSING_IMPORT_CALLED_WITH_ARGS),
474 "Attempt to call undefined %s method with arguments "
475 "(%" SVf_QUOTEDPREFIX "%s) via package "
476 "%" SVf_QUOTEDPREFIX " (Perhaps you forgot to load the package?)",
477 ix ? "unimport" : "import",
479 (items > 2 ? " ..." : ""),
486 XS(XS_UNIVERSAL_can); /* prototype to pass -Wmissing-prototypes */
496 croak_xs_usage(cv, "object-ref, method");
502 /* Reject undef and empty string. Note that the string form takes
503 precedence here over the numeric form, as (!1)->foo treats the
504 invocant as the empty string, though it is a dualvar. */
505 if (!SvOK(sv) || (SvPOK(sv) && !SvCUR(sv)))
511 sv = MUTABLE_SV(SvRV(sv));
514 else if (isGV_with_GP(sv) && GvIO(sv))
515 pkg = SvSTASH(GvIO(sv));
517 else if (isGV_with_GP(sv) && GvIO(sv))
518 pkg = SvSTASH(GvIO(sv));
519 else if ((iogv = gv_fetchsv_nomg(sv, 0, SVt_PVIO)) && GvIO(iogv))
520 pkg = SvSTASH(GvIO(iogv));
522 pkg = gv_stashsv(sv, 0);
524 pkg = gv_stashpvs("UNIVERSAL", 0);
528 GV * const gv = gv_fetchmethod_sv_flags(pkg, ST(1), 0);
530 rv = sv_2mortal(newRV(MUTABLE_SV(GvCV(gv))));
537 XS(XS_UNIVERSAL_DOES); /* prototype to pass -Wmissing-prototypes */
538 XS(XS_UNIVERSAL_DOES)
544 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
546 SV * const sv = ST(0);
547 if (sv_does_sv( sv, ST(1), 0 ))
554 XS(XS_utf8_is_utf8); /* prototype to pass -Wmissing-prototypes */
559 croak_xs_usage(cv, "sv");
561 SV * const sv = ST(0);
571 XS(XS_utf8_valid); /* prototype to pass -Wmissing-prototypes */
576 croak_xs_usage(cv, "sv");
578 SV * const sv = ST(0);
580 const char * const s = SvPV_const(sv,len);
581 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
589 XS(XS_utf8_encode); /* prototype to pass -Wmissing-prototypes */
594 croak_xs_usage(cv, "sv");
595 sv_utf8_encode(ST(0));
600 XS(XS_utf8_decode); /* prototype to pass -Wmissing-prototypes */
605 croak_xs_usage(cv, "sv");
607 SV * const sv = ST(0);
609 SvPV_force_nolen(sv);
610 RETVAL = sv_utf8_decode(sv);
612 ST(0) = boolSV(RETVAL);
617 XS(XS_utf8_upgrade); /* prototype to pass -Wmissing-prototypes */
622 croak_xs_usage(cv, "sv");
624 SV * const sv = ST(0);
629 if (UNLIKELY(! sv)) {
634 if (UNLIKELY(! SvOK(sv))) {
638 RETVAL = sv_utf8_upgrade_nomg(sv);
644 XS(XS_utf8_downgrade); /* prototype to pass -Wmissing-prototypes */
645 XS(XS_utf8_downgrade)
648 if (items < 1 || items > 2)
649 croak_xs_usage(cv, "sv, failok=0");
651 SV * const sv0 = ST(0);
652 SV * const sv1 = ST(1);
653 const bool failok = (items < 2) ? 0 : SvTRUE_NN(sv1) ? 1 : 0;
654 const bool RETVAL = sv_utf8_downgrade(sv0, failok);
656 ST(0) = boolSV(RETVAL);
661 XS(XS_utf8_native_to_unicode); /* prototype to pass -Wmissing-prototypes */
662 XS(XS_utf8_native_to_unicode)
665 const UV uv = SvUV(ST(0));
668 croak_xs_usage(cv, "sv");
670 ST(0) = sv_2mortal(newSVuv(NATIVE_TO_UNI(uv)));
674 XS(XS_utf8_unicode_to_native); /* prototype to pass -Wmissing-prototypes */
675 XS(XS_utf8_unicode_to_native)
678 const UV uv = SvUV(ST(0));
681 croak_xs_usage(cv, "sv");
683 ST(0) = sv_2mortal(newSVuv(UNI_TO_NATIVE(uv)));
687 XS(XS_Internals_SvREADONLY); /* prototype to pass -Wmissing-prototypes */
688 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
691 SV * const svz = ST(0);
694 /* [perl #77776] - called as &foo() not foo() */
696 croak_xs_usage(cv, "SCALAR[, ON]");
706 else if (items == 2) {
708 if (SvTRUE_NN(sv1)) {
709 SvFLAGS(sv) |= SVf_READONLY;
713 /* I hope you really know what you are doing. */
714 SvFLAGS(sv) &=~ SVf_READONLY;
718 XSRETURN_UNDEF; /* Can't happen. */
721 XS(XS_constant__make_const); /* prototype to pass -Wmissing-prototypes */
722 XS(XS_constant__make_const) /* This is dangerous stuff. */
725 SV * const svz = ST(0);
728 /* [perl #77776] - called as &foo() not foo() */
729 if (!SvROK(svz) || items != 1)
730 croak_xs_usage(cv, "SCALAR");
735 if (SvTYPE(sv) == SVt_PVAV && AvFILLp(sv) != -1) {
736 /* for constant.pm; nobody else should be calling this
739 for (svp = AvARRAY(sv) + AvFILLp(sv)
742 if (*svp) SvPADTMP_on(*svp);
747 XS(XS_Internals_SvREFCNT); /* prototype to pass -Wmissing-prototypes */
748 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
751 SV * const svz = ST(0);
755 /* [perl #77776] - called as &foo() not foo() */
756 if ((items != 1 && items != 2) || !SvROK(svz))
757 croak_xs_usage(cv, "SCALAR[, REFCOUNT]");
761 /* I hope you really know what you are doing. */
762 /* idea is for SvREFCNT(sv) to be accessed only once */
763 refcnt = items == 2 ?
764 /* we free one ref on exit */
765 (SvREFCNT(sv) = SvUV(ST(1)) + 1)
767 XSRETURN_UV(refcnt - 1); /* Minus the ref created for us. */
771 XS(XS_Internals_hv_clear_placehold); /* prototype to pass -Wmissing-prototypes */
772 XS(XS_Internals_hv_clear_placehold)
776 if (items != 1 || !SvROK(ST(0)))
777 croak_xs_usage(cv, "hv");
779 HV * const hv = MUTABLE_HV(SvRV(ST(0)));
780 hv_clear_placeholders(hv);
785 XS(XS_Internals_stack_refcounted); /* prototype to pass -Wmissing-prototypes */
786 XS(XS_Internals_stack_refcounted)
792 croak_xs_usage(cv, "");
799 XS(XS_PerlIO_get_layers); /* prototype to pass -Wmissing-prototypes */
800 XS(XS_PerlIO_get_layers)
803 if (items < 1 || items % 2 == 0)
804 croak_xs_usage(cv, "filehandle[,args]");
805 #if defined(USE_PERLIO)
811 bool details = FALSE;
815 for (svp = MARK + 2; svp <= SP; svp += 2) {
816 SV * const * const varp = svp;
817 SV * const * const valp = svp + 1;
819 const char * const key = SvPV_const(*varp, klen);
823 if (memEQs(key, klen, "input")) {
824 input = SvTRUE(*valp);
829 if (memEQs(key, klen, "output")) {
830 input = !SvTRUE(*valp);
835 if (memEQs(key, klen, "details")) {
836 details = SvTRUE(*valp);
843 "get_layers: unknown argument '%s'",
853 /* MAYBE_DEREF_GV will call get magic */
854 if ((gv = MAYBE_DEREF_GV(sv)))
856 else if (SvROK(sv) && SvTYPE(SvRV(sv)) == SVt_PVIO)
858 else if (!SvROK(sv) && (gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO)))
862 AV* const av = PerlIO_get_layers(aTHX_ input ?
863 IoIFP(io) : IoOFP(io));
865 const SSize_t last = av_top_index(av);
868 for (i = last; i >= 0; i -= 3) {
869 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
870 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
871 SV * const * const flgsvp = av_fetch(av, i, FALSE);
873 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
874 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
875 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
877 EXTEND(SP, 3); /* Three is the max in all branches: better check just once */
879 /* Indents of 5? Yuck. */
880 /* We know that PerlIO_get_layers creates a new SV for
881 the name and flags, so we can just take a reference
882 and "steal" it when we free the AV below. */
884 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
887 ? newSVpvn_flags(SvPVX_const(*argsvp),
889 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
893 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
899 PUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%" SVf "(%" SVf ")",
903 PUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
908 const IV flags = SvIVX(*flgsvp);
910 if (flags & PERLIO_F_UTF8) {
911 PUSHs(newSVpvs_flags("utf8", SVs_TEMP));
928 XS(XS_re_is_regexp); /* prototype to pass -Wmissing-prototypes */
934 croak_xs_usage(cv, "sv");
943 XS(XS_re_regnames_count); /* prototype to pass -Wmissing-prototypes */
944 XS(XS_re_regnames_count)
946 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
951 croak_xs_usage(cv, "");
956 ret = CALLREG_NAMED_BUFF_COUNT(rx);
959 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
963 XS(XS_re_regname); /* prototype to pass -Wmissing-prototypes */
971 if (items < 1 || items > 2)
972 croak_xs_usage(cv, "name[, all ]");
977 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
982 if (items == 2 && SvTRUE_NN(ST(1))) {
987 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
990 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
995 XS(XS_re_regnames); /* prototype to pass -Wmissing-prototypes */
1008 croak_xs_usage(cv, "[all]");
1010 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1015 if (items == 1 && SvTRUE_NN(ST(0))) {
1024 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
1031 av = MUTABLE_AV(SvRV(ret));
1032 length = av_count(av);
1034 EXTEND(SP, length); /* better extend stack just once */
1035 for (i = 0; i < length; i++) {
1036 entry = av_fetch(av, i, FALSE);
1039 /* diag_listed_as: SKIPME */
1040 Perl_croak(aTHX_ "NULL array element in re::regnames()");
1042 mPUSHs(SvREFCNT_inc_simple_NN(*entry));
1051 XS(XS_re_regexp_pattern); /* prototype to pass -Wmissing-prototypes */
1052 XS(XS_re_regexp_pattern)
1056 U8 const gimme = GIMME_V;
1061 croak_xs_usage(cv, "sv");
1064 Checks if a reference is a regex or not. If the parameter is
1065 not a ref, or is not the result of a qr// then returns false
1066 in scalar context and an empty list in list context.
1067 Otherwise in list context it returns the pattern and the
1068 modifiers, in scalar context it returns the pattern just as it
1069 would if the qr// was stringified normally, regardless as
1070 to the class of the variable and any stringification overloads
1074 if ((re = SvRX(ST(0)))) /* assign deliberate */
1076 /* Houston, we have a regex! */
1079 if ( gimme == G_LIST ) {
1081 char reflags[sizeof(INT_PAT_MODS) + MAX_CHARSET_NAME_LENGTH];
1087 we are in list context so stringify
1088 the modifiers that apply. We ignore "negative
1089 modifiers" in this scenario, and the default character set
1092 if (get_regex_charset(RX_EXTFLAGS(re)) != REGEX_DEPENDS_CHARSET) {
1094 const char* const name = get_regex_charset_name(RX_EXTFLAGS(re),
1096 Copy(name, reflags + left, len, char);
1099 fptr = INT_PAT_MODS;
1100 match_flags = (U16)((RX_EXTFLAGS(re) & RXf_PMf_COMPILETIME)
1101 >> RXf_PMf_STD_PMMOD_SHIFT);
1103 while((ch = *fptr++)) {
1104 if(match_flags & 1) {
1105 reflags[left++] = ch;
1110 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
1111 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1113 /* return the pattern and the modifiers */
1115 PUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
1118 /* Scalar, so use the string that Perl would return */
1119 /* return the pattern in (?msixn:..) format */
1120 pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));
1125 /* It ain't a regexp folks */
1126 if ( gimme == G_LIST ) {
1127 /* return the empty list */
1130 /* Because of the (?:..) wrapping involved in a
1131 stringified pattern it is impossible to get a
1132 result for a real regexp that would evaluate to
1133 false. Therefore we can return PL_sv_no to signify
1134 that the object is not a regex, this means that one
1137 if (regex($might_be_a_regex) eq '(?:foo)') { }
1139 and not worry about undefined values.
1144 NOT_REACHED; /* NOTREACHED */
1147 #if defined(HAS_GETCWD) && defined(PERL_IS_MINIPERL)
1149 XS(XS_Internals_getcwd)
1152 SV *sv = sv_newmortal();
1155 croak_xs_usage(cv, "");
1157 (void)getcwd_sv(sv);
1166 XS(XS_NamedCapture_tie_it)
1171 croak_xs_usage(cv, "sv");
1174 GV * const gv = (GV *)sv;
1175 HV * const hv = GvHVn(gv);
1176 SV *rv = newSV_type(SVt_IV);
1177 const char *gv_name = GvNAME(gv);
1179 sv_setrv_noinc(rv, newSVuv(
1180 strEQ(gv_name, "-") || strEQ(gv_name, "\003APTURE_ALL")
1181 ? RXapif_ALL : RXapif_ONE));
1182 sv_bless(rv, GvSTASH(CvGV(cv)));
1184 sv_unmagic((SV *)hv, PERL_MAGIC_tied);
1185 sv_magic((SV *)hv, rv, PERL_MAGIC_tied, NULL, 0);
1186 SvREFCNT_dec(rv); /* As sv_magic increased it by one. */
1191 XS(XS_NamedCapture_TIEHASH)
1195 croak_xs_usage(cv, "package, ...");
1197 const char * package = (const char *)SvPV_nolen(ST(0));
1198 UV flag = RXapif_ONE;
1202 const char *p = SvPV_const(*mark, len);
1203 if(memEQs(p, len, "all"))
1204 flag = SvTRUE(mark[1]) ? RXapif_ALL : RXapif_ONE;
1207 ST(0) = newSV_type_mortal(SVt_IV);
1208 sv_setuv(newSVrv(ST(0), package), flag);
1213 /* These are tightly coupled to the RXapif_* flags defined in regexp.h */
1214 #define UNDEF_FATAL 0x80000
1215 #define DISCARD 0x40000
1216 #define EXPECT_SHIFT 24
1217 #define ACTION_MASK 0x000FF
1219 #define FETCH_ALIAS (RXapif_FETCH | (2 << EXPECT_SHIFT))
1220 #define STORE_ALIAS (RXapif_STORE | (3 << EXPECT_SHIFT) | UNDEF_FATAL | DISCARD)
1221 #define DELETE_ALIAS (RXapif_DELETE | (2 << EXPECT_SHIFT) | UNDEF_FATAL)
1222 #define CLEAR_ALIAS (RXapif_CLEAR | (1 << EXPECT_SHIFT) | UNDEF_FATAL | DISCARD)
1223 #define EXISTS_ALIAS (RXapif_EXISTS | (2 << EXPECT_SHIFT))
1224 #define SCALAR_ALIAS (RXapif_SCALAR | (1 << EXPECT_SHIFT))
1226 XS(XS_NamedCapture_FETCH)
1230 PERL_UNUSED_VAR(cv); /* -W */
1231 PERL_UNUSED_VAR(ax); /* -Wall */
1234 REGEXP *const rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1237 const U32 action = ix & ACTION_MASK;
1238 const int expect = ix >> EXPECT_SHIFT;
1239 if (items != expect)
1240 croak_xs_usage(cv, expect == 2 ? "$key"
1241 : (expect == 3 ? "$key, $value"
1244 if (!rx || !SvROK(ST(0))) {
1245 if (ix & UNDEF_FATAL)
1246 Perl_croak_no_modify();
1251 flags = (U32)SvUV(SvRV(MUTABLE_SV(ST(0))));
1254 ret = RX_ENGINE(rx)->named_buff(aTHX_ (rx), expect >= 2 ? ST(1) : NULL,
1255 expect >= 3 ? ST(2) : NULL, flags | action);
1259 /* Called with G_DISCARD, so our return stack state is thrown away.
1260 Hence if we were returned anything, free it immediately. */
1263 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
1271 XS(XS_NamedCapture_FIRSTKEY)
1275 PERL_UNUSED_VAR(cv); /* -W */
1276 PERL_UNUSED_VAR(ax); /* -Wall */
1279 REGEXP *const rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1282 const int expect = ix ? 2 : 1;
1283 const U32 action = ix ? RXapif_NEXTKEY : RXapif_FIRSTKEY;
1284 if (items != expect)
1285 croak_xs_usage(cv, expect == 2 ? "$lastkey" : "");
1287 if (!rx || !SvROK(ST(0)))
1290 flags = (U32)SvUV(SvRV(MUTABLE_SV(ST(0))));
1293 ret = RX_ENGINE(rx)->named_buff_iter(aTHX_ (rx),
1294 expect >= 2 ? ST(1) : NULL,
1298 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
1304 /* is this still needed? */
1305 XS(XS_NamedCapture_flags)
1308 PERL_UNUSED_VAR(cv); /* -W */
1309 PERL_UNUSED_VAR(ax); /* -Wall */
1323 struct xsub_details {
1330 static const struct xsub_details these_details[] = {
1331 {"UNIVERSAL::isa", XS_UNIVERSAL_isa, NULL, 0 },
1332 {"UNIVERSAL::can", XS_UNIVERSAL_can, NULL, 0 },
1333 {"UNIVERSAL::DOES", XS_UNIVERSAL_DOES, NULL, 0 },
1334 {"UNIVERSAL::import", XS_UNIVERSAL_import_unimport, NULL, 0},
1335 {"UNIVERSAL::unimport", XS_UNIVERSAL_import_unimport, NULL, 1},
1336 #define VXS_XSUB_DETAILS
1338 #undef VXS_XSUB_DETAILS
1339 {"utf8::is_utf8", XS_utf8_is_utf8, NULL, 0 },
1340 {"utf8::valid", XS_utf8_valid, NULL, 0 },
1341 {"utf8::encode", XS_utf8_encode, NULL, 0 },
1342 {"utf8::decode", XS_utf8_decode, NULL, 0 },
1343 {"utf8::upgrade", XS_utf8_upgrade, NULL, 0 },
1344 {"utf8::downgrade", XS_utf8_downgrade, NULL, 0 },
1345 {"utf8::native_to_unicode", XS_utf8_native_to_unicode, NULL, 0 },
1346 {"utf8::unicode_to_native", XS_utf8_unicode_to_native, NULL, 0 },
1347 {"Internals::SvREADONLY", XS_Internals_SvREADONLY, "\\[$%@];$", 0 },
1348 {"Internals::SvREFCNT", XS_Internals_SvREFCNT, "\\[$%@];$", 0 },
1349 {"Internals::hv_clear_placeholders", XS_Internals_hv_clear_placehold, "\\%", 0 },
1350 {"Internals::stack_refcounted", XS_Internals_stack_refcounted, NULL, 0 },
1351 {"constant::_make_const", XS_constant__make_const, "\\[$@]", 0 },
1352 {"PerlIO::get_layers", XS_PerlIO_get_layers, "*;@", 0 },
1353 {"re::is_regexp", XS_re_is_regexp, "$", 0 },
1354 {"re::regname", XS_re_regname, ";$$", 0 },
1355 {"re::regnames", XS_re_regnames, ";$", 0 },
1356 {"re::regnames_count", XS_re_regnames_count, "", 0 },
1357 {"re::regexp_pattern", XS_re_regexp_pattern, "$", 0 },
1358 #if defined(HAS_GETCWD) && defined(PERL_IS_MINIPERL)
1359 {"Internals::getcwd", XS_Internals_getcwd, "", 0 },
1361 {"Tie::Hash::NamedCapture::_tie_it", XS_NamedCapture_tie_it, NULL, 0 },
1362 {"Tie::Hash::NamedCapture::TIEHASH", XS_NamedCapture_TIEHASH, NULL, 0 },
1363 {"Tie::Hash::NamedCapture::FETCH", XS_NamedCapture_FETCH, NULL, FETCH_ALIAS },
1364 {"Tie::Hash::NamedCapture::STORE", XS_NamedCapture_FETCH, NULL, STORE_ALIAS },
1365 {"Tie::Hash::NamedCapture::DELETE", XS_NamedCapture_FETCH, NULL, DELETE_ALIAS },
1366 {"Tie::Hash::NamedCapture::CLEAR", XS_NamedCapture_FETCH, NULL, CLEAR_ALIAS },
1367 {"Tie::Hash::NamedCapture::EXISTS", XS_NamedCapture_FETCH, NULL, EXISTS_ALIAS },
1368 {"Tie::Hash::NamedCapture::SCALAR", XS_NamedCapture_FETCH, NULL, SCALAR_ALIAS },
1369 {"Tie::Hash::NamedCapture::FIRSTKEY", XS_NamedCapture_FIRSTKEY, NULL, 0 },
1370 {"Tie::Hash::NamedCapture::NEXTKEY", XS_NamedCapture_FIRSTKEY, NULL, 1 },
1371 {"Tie::Hash::NamedCapture::flags", XS_NamedCapture_flags, NULL, 0 },
1375 optimize_out_native_convert_function(pTHX_ OP* entersubop,
1379 /* Optimizes out an identity function, i.e., one that just returns its
1380 * argument. The passed in function is assumed to be an identity function,
1381 * with no checking. This is designed to be called for utf8_to_native()
1382 * and native_to_utf8() on ASCII platforms, as they just return their
1383 * arguments, but it could work on any such function.
1385 * The code is mostly just cargo-culted from Memoize::Lift */
1389 SV* prototype = newSVpvs("$");
1391 PERL_UNUSED_ARG(protosv);
1393 assert(entersubop->op_type == OP_ENTERSUB);
1395 entersubop = ck_entersub_args_proto(entersubop, namegv, prototype);
1396 parent = entersubop;
1398 SvREFCNT_dec(prototype);
1400 pushop = cUNOPx(entersubop)->op_first;
1401 if (! OpHAS_SIBLING(pushop)) {
1403 pushop = cUNOPx(pushop)->op_first;
1405 argop = OpSIBLING(pushop);
1407 /* Carry on without doing the optimization if it is not something we're
1408 * expecting, so continues to work */
1410 || ! OpHAS_SIBLING(argop)
1411 || OpHAS_SIBLING(OpSIBLING(argop))
1416 /* cut argop from the subtree */
1417 (void)op_sibling_splice(parent, pushop, 1, NULL);
1419 op_free(entersubop);
1424 Perl_boot_core_UNIVERSAL(pTHX)
1426 static const char file[] = __FILE__;
1427 const struct xsub_details *xsub = these_details;
1428 const struct xsub_details *end = C_ARRAY_END(these_details);
1431 CV *cv = newXS_flags(xsub->name, xsub->xsub, file, xsub->proto, 0);
1432 XSANY.any_i32 = xsub->ix;
1433 } while (++xsub < end);
1436 { /* On ASCII platforms these functions just return their argument, so can
1437 be optimized away */
1439 CV* to_native_cv = get_cv("utf8::unicode_to_native", 0);
1440 CV* to_unicode_cv = get_cv("utf8::native_to_unicode", 0);
1442 cv_set_call_checker_flags(to_native_cv,
1443 optimize_out_native_convert_function,
1444 (SV*) to_native_cv, 0);
1445 cv_set_call_checker_flags(to_unicode_cv,
1446 optimize_out_native_convert_function,
1447 (SV*) to_unicode_cv, 0);
1451 /* Providing a Regexp::DESTROY fixes #21347. See test in t/op/ref.t */
1454 newCONSTSUB(get_hv("Regexp::", GV_ADD), "DESTROY", NULL);
1455 char ** cvfile = &CvFILE(cv);
1456 char * oldfile = *cvfile;
1458 *cvfile = (char *)file;
1464 * ex: set ts=8 sts=4 sw=4 et: