3 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 * 2005, 2006, 2007, 2008 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 history
16 * [p.54 of _The Lord of the Rings_, I/ii: "The Shadow of the Past"]
19 /* This file contains the code that implements the functions in Perl's
20 * UNIVERSAL package, such as UNIVERSAL->can().
22 * It is also used to store XS functions that need to be present in
23 * miniperl for a lack of a better place to put them. It might be
24 * clever to move them to separate XS files which would then be pulled
25 * in by some to-be-written build process.
29 #define PERL_IN_UNIVERSAL_C
33 #include "perliol.h" /* For the PERLIO_F_XXX */
37 * Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
38 * The main guts of traverse_isa was actually copied from gv_fetchmeth
42 S_isa_lookup(pTHX_ HV *stash, const char * const name, STRLEN len, U32 flags)
45 const struct mro_meta *const meta = HvMROMETA(stash);
49 PERL_ARGS_ASSERT_ISA_LOOKUP;
52 (void)mro_get_linear_isa(stash);
56 if (hv_common(isa, NULL, name, len, ( flags & SVf_UTF8 ? HVhek_UTF8 : 0),
57 HV_FETCH_ISEXISTS, NULL, 0)) {
58 /* Direct name lookup worked. */
62 /* A stash/class can go by many names (ie. User == main::User), so
63 we use the HvENAME in the stash itself, which is canonical, falling
64 back to HvNAME if necessary. */
65 our_stash = gv_stashpvn(name, len, flags);
68 HEK *canon_name = HvENAME_HEK(our_stash);
69 if (!canon_name) canon_name = HvNAME_HEK(our_stash);
71 if (hv_common(isa, NULL, HEK_KEY(canon_name), HEK_LEN(canon_name),
72 HEK_FLAGS(canon_name),
73 HV_FETCH_ISEXISTS, NULL, HEK_HASH(canon_name))) {
82 =head1 SV Manipulation Functions
84 =for apidoc sv_derived_from_pvn
86 Returns a boolean indicating whether the SV is derived from the specified class
87 I<at the C level>. To check derivation at the Perl level, call C<isa()> as a
90 Currently, the only significant value for C<flags> is SVf_UTF8.
94 =for apidoc sv_derived_from_sv
96 Exactly like L</sv_derived_from_pvn>, but takes the name string in the form
97 of an SV instead of a string/length pair.
104 Perl_sv_derived_from_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
108 PERL_ARGS_ASSERT_SV_DERIVED_FROM_SV;
109 namepv = SvPV(namesv, namelen);
112 return sv_derived_from_pvn(sv, namepv, namelen, flags);
116 =for apidoc sv_derived_from
118 Exactly like L</sv_derived_from_pv>, but doesn't take a C<flags> parameter.
124 Perl_sv_derived_from(pTHX_ SV *sv, const char *const name)
126 PERL_ARGS_ASSERT_SV_DERIVED_FROM;
127 return sv_derived_from_pvn(sv, name, strlen(name), 0);
131 =for apidoc sv_derived_from_pv
133 Exactly like L</sv_derived_from_pvn>, but takes a nul-terminated string
134 instead of a string/length pair.
141 Perl_sv_derived_from_pv(pTHX_ SV *sv, const char *const name, U32 flags)
143 PERL_ARGS_ASSERT_SV_DERIVED_FROM_PV;
144 return sv_derived_from_pvn(sv, name, strlen(name), flags);
148 Perl_sv_derived_from_pvn(pTHX_ SV *sv, const char *const name, const STRLEN len, U32 flags)
153 PERL_ARGS_ASSERT_SV_DERIVED_FROM_PVN;
160 type = sv_reftype(sv,0);
161 if (type && strEQ(type,name))
168 stash = gv_stashsv(sv, 0);
171 if (stash && isa_lookup(stash, name, len, flags))
174 stash = gv_stashpvs("UNIVERSAL", 0);
175 return stash && isa_lookup(stash, name, len, flags);
179 =for apidoc sv_does_sv
181 Returns a boolean indicating whether the SV performs a specific, named role.
182 The SV can be a Perl object or the name of a Perl class.
190 Perl_sv_does_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
197 PERL_ARGS_ASSERT_SV_DOES_SV;
198 PERL_UNUSED_ARG(flags);
205 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv)))) {
210 if (sv_isobject(sv)) {
211 classname = sv_ref(NULL,SvRV(sv),TRUE);
216 if (sv_eq(classname, namesv)) {
227 methodname = newSVpvs_flags("isa", SVs_TEMP);
228 /* ugly hack: use the SvSCREAM flag so S_method_common
229 * can figure out we're calling DOES() and not isa(),
230 * and report eventual errors correctly. --rgs */
231 SvSCREAM_on(methodname);
232 call_sv(methodname, G_SCALAR | G_METHOD);
235 does_it = SvTRUE( TOPs );
245 Like L</sv_does_pv>, but doesn't take a C<flags> parameter.
251 Perl_sv_does(pTHX_ SV *sv, const char *const name)
253 PERL_ARGS_ASSERT_SV_DOES;
254 return sv_does_sv(sv, newSVpvn_flags(name, strlen(name), SVs_TEMP), 0);
258 =for apidoc sv_does_pv
260 Like L</sv_does_sv>, but takes a nul-terminated string instead of an SV.
267 Perl_sv_does_pv(pTHX_ SV *sv, const char *const name, U32 flags)
269 PERL_ARGS_ASSERT_SV_DOES_PV;
270 return sv_does_sv(sv, newSVpvn_flags(name, strlen(name), SVs_TEMP | flags), flags);
274 =for apidoc sv_does_pvn
276 Like L</sv_does_sv>, but takes a string/length pair instead of an SV.
282 Perl_sv_does_pvn(pTHX_ SV *sv, const char *const name, const STRLEN len, U32 flags)
284 PERL_ARGS_ASSERT_SV_DOES_PVN;
286 return sv_does_sv(sv, newSVpvn_flags(name, len, flags | SVs_TEMP), flags);
290 =for apidoc croak_xs_usage
292 A specialised variant of C<croak()> for emitting the usage message for xsubs
294 croak_xs_usage(cv, "eee_yow");
296 works out the package name and subroutine name from C<cv>, and then calls
297 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
299 Perl_croak(aTHX_ "Usage: %"SVf"::%"SVf"(%s)", "ouch" "awk", "eee_yow");
305 Perl_croak_xs_usage(const CV *const cv, const char *const params)
307 const GV *const gv = CvGV(cv);
309 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
312 const HV *const stash = GvSTASH(gv);
314 if (HvNAME_get(stash))
315 Perl_croak_nocontext("Usage: %"HEKf"::%"HEKf"(%s)",
316 HEKfARG(HvNAME_HEK(stash)),
317 HEKfARG(GvNAME_HEK(gv)),
320 Perl_croak_nocontext("Usage: %"HEKf"(%s)",
321 HEKfARG(GvNAME_HEK(gv)), params);
323 /* Pants. I don't think that it should be possible to get here. */
324 Perl_croak_nocontext("Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
334 croak_xs_usage(cv, "reference, kind");
336 SV * const sv = ST(0);
340 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))))
343 ST(0) = boolSV(sv_derived_from_sv(sv, ST(1), 0));
358 croak_xs_usage(cv, "object-ref, method");
364 /* Reject undef and empty string. Note that the string form takes
365 precedence here over the numeric form, as (!1)->foo treats the
366 invocant as the empty string, though it is a dualvar. */
367 if (!SvOK(sv) || (SvPOK(sv) && !SvCUR(sv)))
373 sv = MUTABLE_SV(SvRV(sv));
376 else if (isGV_with_GP(sv) && GvIO(sv))
377 pkg = SvSTASH(GvIO(sv));
379 else if (isGV_with_GP(sv) && GvIO(sv))
380 pkg = SvSTASH(GvIO(sv));
381 else if ((iogv = gv_fetchsv_nomg(sv, 0, SVt_PVIO)) && GvIO(iogv))
382 pkg = SvSTASH(GvIO(iogv));
384 pkg = gv_stashsv(sv, 0);
386 pkg = gv_stashpv("UNIVERSAL", 0);
390 GV * const gv = gv_fetchmethod_sv_flags(pkg, ST(1), 0);
392 rv = sv_2mortal(newRV(MUTABLE_SV(GvCV(gv))));
399 XS(XS_UNIVERSAL_DOES)
406 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
408 SV * const sv = ST(0);
409 if (sv_does_sv( sv, ST(1), 0 ))
416 XS(XS_UNIVERSAL_VERSION)
428 sv = MUTABLE_SV(SvRV(ST(0)));
430 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
434 pkg = gv_stashsv(ST(0), 0);
437 gvp = pkg ? (GV**)hv_fetchs(pkg, "VERSION", FALSE) : NULL;
439 if (gvp && isGV(gv = *gvp) && (sv = GvSV(gv)) && SvOK(sv)) {
440 SV * const nsv = sv_newmortal();
443 if ( !sv_isobject(sv) || !sv_derived_from(sv, "version"))
444 upg_version(sv, FALSE);
458 const HEK * const name = HvNAME_HEK(pkg);
460 "%"HEKf" does not define $%"HEKf
461 "::VERSION--version check failed",
462 HEKfARG(name), HEKfARG(name));
465 "%"SVf" defines neither package nor VERSION--version check failed",
470 if ( !sv_isobject(req) || !sv_derived_from(req, "version")) {
471 /* req may very well be R/O, so create a new object */
472 req = sv_2mortal( new_version(req) );
475 if ( vcmp( req, sv ) > 0 ) {
476 if ( hv_exists(MUTABLE_HV(SvRV(req)), "qv", 2 ) ) {
477 Perl_croak(aTHX_ "%"HEKf" version %"SVf" required--"
478 "this is only version %"SVf"",
479 HEKfARG(HvNAME_HEK(pkg)),
480 SVfARG(sv_2mortal(vnormal(req))),
481 SVfARG(sv_2mortal(vnormal(sv))));
483 Perl_croak(aTHX_ "%"HEKf" version %"SVf" required--"
484 "this is only version %"SVf,
485 HEKfARG(HvNAME_HEK(pkg)),
486 SVfARG(sv_2mortal(vstringify(req))),
487 SVfARG(sv_2mortal(vstringify(sv))));
493 if ( SvOK(sv) && sv_derived_from(sv, "version") ) {
494 ST(0) = sv_2mortal(vstringify(sv));
506 if (items > 3 || items < 1)
507 croak_xs_usage(cv, "class, version");
513 const char *classname;
516 /* Just in case this is something like a tied hash */
519 if ( sv_isobject(ST(0)) ) { /* get the class if called as an object method */
520 const HV * stash = SvSTASH(SvRV(ST(0)));
521 classname = HvNAME(stash);
522 len = HvNAMELEN(stash);
523 flags = HvNAMEUTF8(stash) ? SVf_UTF8 : 0;
526 classname = SvPV(ST(0), len);
527 flags = SvUTF8(ST(0));
530 if ( items == 1 || ! SvOK(vs) ) { /* no param or explicit undef */
531 /* create empty object */
535 else if ( items == 3 ) {
537 Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
540 rv = new_version(vs);
541 if ( strnNE(classname,"version", len) ) /* inherited new() */
542 sv_bless(rv, gv_stashpvn(classname, len, GV_ADD | flags));
550 XS(XS_version_stringify)
555 croak_xs_usage(cv, "lobj, ...");
560 if (sv_isobject(lobj) && sv_derived_from(lobj, "version")) {
564 Perl_croak(aTHX_ "lobj is not of type version");
566 mPUSHs(vstringify(lobj));
573 XS(XS_version_numify)
578 croak_xs_usage(cv, "lobj, ...");
583 if (sv_isobject(lobj) && sv_derived_from(lobj, "version")) {
587 Perl_croak(aTHX_ "lobj is not of type version");
589 mPUSHs(vnumify(lobj));
596 XS(XS_version_normal)
601 croak_xs_usage(cv, "lobj, ...");
606 if (sv_isobject(lobj) && sv_derived_from(lobj, "version")) {
610 Perl_croak(aTHX_ "lobj is not of type version");
612 mPUSHs(vnormal(lobj));
624 croak_xs_usage(cv, "lobj, ...");
629 if (sv_isobject(lobj) && sv_derived_from(lobj, "version")) {
633 Perl_croak(aTHX_ "lobj is not of type version");
639 const IV swap = (IV)SvIV(ST(2));
641 if ( !sv_isobject(robj) || !sv_derived_from(robj, "version") )
643 robj = new_version(SvOK(robj) ? robj : newSVpvs_flags("0", SVs_TEMP));
650 rs = newSViv(vcmp(rvs,lobj));
654 rs = newSViv(vcmp(lobj,rvs));
665 XS(XS_version_boolean)
670 croak_xs_usage(cv, "lobj, ...");
672 if (sv_isobject(ST(0)) && sv_derived_from(ST(0), "version")) {
673 SV * const lobj = SvRV(ST(0));
676 sv_2mortal(new_version(
677 sv_2mortal(newSVpvs("0"))
686 Perl_croak(aTHX_ "lobj is not of type version");
694 croak_xs_usage(cv, "lobj, ...");
695 if (sv_isobject(ST(0)) && sv_derived_from(ST(0), "version"))
696 Perl_croak(aTHX_ "operation not supported with version object");
698 Perl_croak(aTHX_ "lobj is not of type version");
699 #ifndef HASATTRIBUTE_NORETURN
704 XS(XS_version_is_alpha)
709 croak_xs_usage(cv, "lobj");
711 if (sv_isobject(ST(0)) && sv_derived_from(ST(0), "version")) {
712 SV * const lobj = ST(0);
713 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "alpha", 5 ) )
721 Perl_croak(aTHX_ "lobj is not of type version");
734 const char * classname = "";
742 Perl_croak(aTHX_ "Invalid version format (version required)");
744 if ( sv_isobject(ST(0)) ) { /* class called as an object method */
745 const HV * stash = SvSTASH(SvRV(ST(0)));
746 classname = HvNAME(stash);
747 len = HvNAMELEN(stash);
748 flags = HvNAMEUTF8(stash) ? SVf_UTF8 : 0;
751 classname = SvPV(ST(0), len);
752 flags = SvUTF8(ST(0));
755 if ( !SvVOK(ver) ) { /* not already a v-string */
757 sv_setsv(rv,ver); /* make a duplicate */
758 upg_version(rv, TRUE);
760 rv = sv_2mortal(new_version(ver));
763 && strnNE(classname,"version", len) ) { /* inherited new() */
764 sv_bless(rv, gv_stashpvn(classname, len, GV_ADD | flags));
777 croak_xs_usage(cv, "lobj");
779 if (sv_isobject(ST(0)) && sv_derived_from(ST(0), "version")) {
780 SV * const lobj = ST(0);
781 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "qv", 2 ) )
789 Perl_croak(aTHX_ "lobj is not of type version");
797 croak_xs_usage(cv, "sv");
799 SV * const sv = ST(0);
814 croak_xs_usage(cv, "sv");
816 SV * const sv = ST(0);
818 const char * const s = SvPV_const(sv,len);
819 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
832 croak_xs_usage(cv, "sv");
833 sv_utf8_encode(ST(0));
843 croak_xs_usage(cv, "sv");
845 SV * const sv = ST(0);
847 SvPV_force_nolen(sv);
848 RETVAL = sv_utf8_decode(sv);
850 ST(0) = boolSV(RETVAL);
860 croak_xs_usage(cv, "sv");
862 SV * const sv = ST(0);
866 RETVAL = sv_utf8_upgrade(sv);
867 XSprePUSH; PUSHi((IV)RETVAL);
872 XS(XS_utf8_downgrade)
876 if (items < 1 || items > 2)
877 croak_xs_usage(cv, "sv, failok=0");
879 SV * const sv = ST(0);
880 const bool failok = (items < 2) ? 0 : (int)SvIV(ST(1));
881 const bool RETVAL = sv_utf8_downgrade(sv, failok);
883 ST(0) = boolSV(RETVAL);
888 XS(XS_utf8_native_to_unicode)
892 const UV uv = SvUV(ST(0));
895 croak_xs_usage(cv, "sv");
897 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
901 XS(XS_utf8_unicode_to_native)
905 const UV uv = SvUV(ST(0));
908 croak_xs_usage(cv, "sv");
910 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
914 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
918 SV * const svz = ST(0);
922 /* [perl #77776] - called as &foo() not foo() */
924 croak_xs_usage(cv, "SCALAR[, ON]");
934 else if (items == 2) {
936 #ifdef PERL_OLD_COPY_ON_WRITE
937 if (SvIsCOW(sv)) sv_force_normal(sv);
940 if (SvTYPE(sv) == SVt_PVAV && AvFILLp(sv) != -1) {
941 /* for constant.pm; nobody else should be calling this
944 for (svp = AvARRAY(sv) + AvFILLp(sv)
947 if (*svp) SvPADTMP_on(*svp);
952 /* I hope you really know what you are doing. */
957 XSRETURN_UNDEF; /* Can't happen. */
959 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
963 SV * const svz = ST(0);
968 /* [perl #77776] - called as &foo() not foo() */
969 if ((items != 1 && items != 2) || !SvROK(svz))
970 croak_xs_usage(cv, "SCALAR[, REFCOUNT]");
974 /* I hope you really know what you are doing. */
975 /* idea is for SvREFCNT(sv) to be accessed only once */
976 refcnt = items == 2 ?
977 /* we free one ref on exit */
978 (SvREFCNT(sv) = SvUV(ST(1)) + 1)
980 XSRETURN_UV(refcnt - 1); /* Minus the ref created for us. */
984 XS(XS_Internals_hv_clear_placehold)
989 if (items != 1 || !SvROK(ST(0)))
990 croak_xs_usage(cv, "hv");
992 HV * const hv = MUTABLE_HV(SvRV(ST(0)));
993 hv_clear_placeholders(hv);
998 XS(XS_PerlIO_get_layers)
1002 if (items < 1 || items % 2 == 0)
1003 croak_xs_usage(cv, "filehandle[,args]");
1010 bool details = FALSE;
1014 for (svp = MARK + 2; svp <= SP; svp += 2) {
1015 SV * const * const varp = svp;
1016 SV * const * const valp = svp + 1;
1018 const char * const key = SvPV_const(*varp, klen);
1022 if (klen == 5 && memEQ(key, "input", 5)) {
1023 input = SvTRUE(*valp);
1028 if (klen == 6 && memEQ(key, "output", 6)) {
1029 input = !SvTRUE(*valp);
1034 if (klen == 7 && memEQ(key, "details", 7)) {
1035 details = SvTRUE(*valp);
1042 "get_layers: unknown argument '%s'",
1051 gv = MAYBE_DEREF_GV(sv);
1053 if (!gv && !SvROK(sv))
1054 gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO);
1056 if (gv && (io = GvIO(gv))) {
1057 AV* const av = PerlIO_get_layers(aTHX_ input ?
1058 IoIFP(io) : IoOFP(io));
1060 const SSize_t last = av_len(av);
1063 for (i = last; i >= 0; i -= 3) {
1064 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
1065 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
1066 SV * const * const flgsvp = av_fetch(av, i, FALSE);
1068 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
1069 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
1070 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
1072 EXTEND(SP, 3); /* Three is the max in all branches: better check just once */
1074 /* Indents of 5? Yuck. */
1075 /* We know that PerlIO_get_layers creates a new SV for
1076 the name and flags, so we can just take a reference
1077 and "steal" it when we free the AV below. */
1079 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
1082 ? newSVpvn_flags(SvPVX_const(*argsvp),
1084 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
1088 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
1094 PUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
1098 PUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
1100 PUSHs(&PL_sv_undef);
1103 const IV flags = SvIVX(*flgsvp);
1105 if (flags & PERLIO_F_UTF8) {
1106 PUSHs(newSVpvs_flags("utf8", SVs_TEMP));
1128 PERL_UNUSED_VAR(cv);
1131 croak_xs_usage(cv, "sv");
1133 if (SvRXOK(ST(0))) {
1140 XS(XS_re_regnames_count)
1142 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1148 croak_xs_usage(cv, "");
1156 ret = CALLREG_NAMED_BUFF_COUNT(rx);
1159 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
1171 if (items < 1 || items > 2)
1172 croak_xs_usage(cv, "name[, all ]");
1177 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1182 if (items == 2 && SvTRUE(ST(1))) {
1187 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
1190 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
1208 croak_xs_usage(cv, "[all]");
1210 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1215 if (items == 1 && SvTRUE(ST(0))) {
1224 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
1231 av = MUTABLE_AV(SvRV(ret));
1232 length = av_len(av);
1234 EXTEND(SP, length+1); /* better extend stack just once */
1235 for (i = 0; i <= length; i++) {
1236 entry = av_fetch(av, i, FALSE);
1239 Perl_croak(aTHX_ "NULL array element in re::regnames()");
1241 mPUSHs(SvREFCNT_inc_simple_NN(*entry));
1250 XS(XS_re_regexp_pattern)
1259 croak_xs_usage(cv, "sv");
1262 Checks if a reference is a regex or not. If the parameter is
1263 not a ref, or is not the result of a qr// then returns false
1264 in scalar context and an empty list in list context.
1265 Otherwise in list context it returns the pattern and the
1266 modifiers, in scalar context it returns the pattern just as it
1267 would if the qr// was stringified normally, regardless as
1268 to the class of the variable and any stringification overloads
1272 if ((re = SvRX(ST(0)))) /* assign deliberate */
1274 /* Houston, we have a regex! */
1277 if ( GIMME_V == G_ARRAY ) {
1279 char reflags[sizeof(INT_PAT_MODS) + MAX_CHARSET_NAME_LENGTH];
1285 we are in list context so stringify
1286 the modifiers that apply. We ignore "negative
1287 modifiers" in this scenario, and the default character set
1290 if (get_regex_charset(RX_EXTFLAGS(re)) != REGEX_DEPENDS_CHARSET) {
1292 const char* const name = get_regex_charset_name(RX_EXTFLAGS(re),
1294 Copy(name, reflags + left, len, char);
1297 fptr = INT_PAT_MODS;
1298 match_flags = (U16)((RX_EXTFLAGS(re) & RXf_PMf_COMPILETIME)
1299 >> RXf_PMf_STD_PMMOD_SHIFT);
1301 while((ch = *fptr++)) {
1302 if(match_flags & 1) {
1303 reflags[left++] = ch;
1308 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
1309 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1311 /* return the pattern and the modifiers */
1313 PUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
1316 /* Scalar, so use the string that Perl would return */
1317 /* return the pattern in (?msix:..) format */
1318 #if PERL_VERSION >= 11
1319 pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));
1321 pattern = newSVpvn_flags(RX_WRAPPED(re), RX_WRAPLEN(re),
1322 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1328 /* It ain't a regexp folks */
1329 if ( GIMME_V == G_ARRAY ) {
1330 /* return the empty list */
1333 /* Because of the (?:..) wrapping involved in a
1334 stringified pattern it is impossible to get a
1335 result for a real regexp that would evaluate to
1336 false. Therefore we can return PL_sv_no to signify
1337 that the object is not a regex, this means that one
1340 if (regex($might_be_a_regex) eq '(?:foo)') { }
1342 and not worry about undefined values.
1350 struct xsub_details {
1356 const struct xsub_details details[] = {
1357 {"UNIVERSAL::isa", XS_UNIVERSAL_isa, NULL},
1358 {"UNIVERSAL::can", XS_UNIVERSAL_can, NULL},
1359 {"UNIVERSAL::DOES", XS_UNIVERSAL_DOES, NULL},
1360 {"UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, NULL},
1361 {"version::()", XS_version_noop, NULL},
1362 {"version::new", XS_version_new, NULL},
1363 {"version::parse", XS_version_new, NULL},
1364 {"version::(\"\"", XS_version_stringify, NULL},
1365 {"version::stringify", XS_version_stringify, NULL},
1366 {"version::(0+", XS_version_numify, NULL},
1367 {"version::numify", XS_version_numify, NULL},
1368 {"version::normal", XS_version_normal, NULL},
1369 {"version::(cmp", XS_version_vcmp, NULL},
1370 {"version::(<=>", XS_version_vcmp, NULL},
1371 {"version::vcmp", XS_version_vcmp, NULL},
1372 {"version::(bool", XS_version_boolean, NULL},
1373 {"version::boolean", XS_version_boolean, NULL},
1374 {"version::(+", XS_version_noop, NULL},
1375 {"version::(-", XS_version_noop, NULL},
1376 {"version::(*", XS_version_noop, NULL},
1377 {"version::(/", XS_version_noop, NULL},
1378 {"version::(+=", XS_version_noop, NULL},
1379 {"version::(-=", XS_version_noop, NULL},
1380 {"version::(*=", XS_version_noop, NULL},
1381 {"version::(/=", XS_version_noop, NULL},
1382 {"version::(abs", XS_version_noop, NULL},
1383 {"version::(nomethod", XS_version_noop, NULL},
1384 {"version::noop", XS_version_noop, NULL},
1385 {"version::is_alpha", XS_version_is_alpha, NULL},
1386 {"version::qv", XS_version_qv, NULL},
1387 {"version::declare", XS_version_qv, NULL},
1388 {"version::is_qv", XS_version_is_qv, NULL},
1389 {"utf8::is_utf8", XS_utf8_is_utf8, NULL},
1390 {"utf8::valid", XS_utf8_valid, NULL},
1391 {"utf8::encode", XS_utf8_encode, NULL},
1392 {"utf8::decode", XS_utf8_decode, NULL},
1393 {"utf8::upgrade", XS_utf8_upgrade, NULL},
1394 {"utf8::downgrade", XS_utf8_downgrade, NULL},
1395 {"utf8::native_to_unicode", XS_utf8_native_to_unicode, NULL},
1396 {"utf8::unicode_to_native", XS_utf8_unicode_to_native, NULL},
1397 {"Internals::SvREADONLY", XS_Internals_SvREADONLY, "\\[$%@];$"},
1398 {"Internals::SvREFCNT", XS_Internals_SvREFCNT, "\\[$%@];$"},
1399 {"Internals::hv_clear_placeholders", XS_Internals_hv_clear_placehold, "\\%"},
1400 {"PerlIO::get_layers", XS_PerlIO_get_layers, "*;@"},
1401 {"re::is_regexp", XS_re_is_regexp, "$"},
1402 {"re::regname", XS_re_regname, ";$$"},
1403 {"re::regnames", XS_re_regnames, ";$"},
1404 {"re::regnames_count", XS_re_regnames_count, ""},
1405 {"re::regexp_pattern", XS_re_regexp_pattern, "$"},
1409 Perl_boot_core_UNIVERSAL(pTHX)
1412 static const char file[] = __FILE__;
1413 const struct xsub_details *xsub = details;
1414 const struct xsub_details *end
1415 = details + sizeof(details) / sizeof(details[0]);
1418 newXS_flags(xsub->name, xsub->xsub, file, xsub->proto, 0);
1419 } while (++xsub < end);
1421 /* Providing a Regexp::DESTROY fixes #21347. See test in t/op/ref.t */
1424 newCONSTSUB(get_hv("Regexp::", GV_ADD), "DESTROY", NULL);
1425 Safefree(CvFILE(cv));
1426 CvFILE(cv) = (char *)file;
1433 * c-indentation-style: bsd
1435 * indent-tabs-mode: nil
1438 * ex: set ts=8 sts=4 sw=4 et: