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;
157 if (SvROK(sv)) { /* hugdo: */
160 type = sv_reftype(sv,0);
161 if (type && strEQ(type,name))
163 stash = SvOBJECT(sv) ? SvSTASH(sv) : NULL;
166 stash = gv_stashsv(sv, 0);
169 return stash ? isa_lookup(stash, name, len, flags) : FALSE;
173 =for apidoc sv_does_sv
175 Returns a boolean indicating whether the SV performs a specific, named role.
176 The SV can be a Perl object or the name of a Perl class.
184 Perl_sv_does_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
191 PERL_ARGS_ASSERT_SV_DOES_SV;
192 PERL_UNUSED_ARG(flags);
199 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
200 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv)))) {
205 if (sv_isobject(sv)) {
206 classname = sv_ref(NULL,SvRV(sv),TRUE);
211 if (sv_eq(classname, namesv)) {
222 methodname = newSVpvs_flags("isa", SVs_TEMP);
223 /* ugly hack: use the SvSCREAM flag so S_method_common
224 * can figure out we're calling DOES() and not isa(),
225 * and report eventual errors correctly. --rgs */
226 SvSCREAM_on(methodname);
227 call_sv(methodname, G_SCALAR | G_METHOD);
230 does_it = SvTRUE( TOPs );
240 Like L</sv_does_pv>, but doesn't take a C<flags> parameter.
246 Perl_sv_does(pTHX_ SV *sv, const char *const name)
248 PERL_ARGS_ASSERT_SV_DOES;
249 return sv_does_sv(sv, newSVpvn_flags(name, strlen(name), SVs_TEMP), 0);
253 =for apidoc sv_does_pv
255 Like L</sv_does_pvn>, but takes a nul-terminated string
256 instead of a string/length pair.
263 Perl_sv_does_pv(pTHX_ SV *sv, const char *const name, U32 flags)
265 PERL_ARGS_ASSERT_SV_DOES_PV;
266 return sv_does_sv(sv, newSVpvn_flags(name, strlen(name), SVs_TEMP | flags), flags);
270 Perl_sv_does_pvn(pTHX_ SV *sv, const char *const name, const STRLEN len, U32 flags)
272 PERL_ARGS_ASSERT_SV_DOES_PVN;
274 return sv_does_sv(sv, newSVpvn_flags(name, len, flags | SVs_TEMP), flags);
278 =for apidoc croak_xs_usage
280 A specialised variant of C<croak()> for emitting the usage message for xsubs
282 croak_xs_usage(cv, "eee_yow");
284 works out the package name and subroutine name from C<cv>, and then calls
285 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
287 Perl_croak(aTHX_ "Usage: %s::%s(%s)", "ouch" "awk", "eee_yow");
293 Perl_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
295 const GV *const gv = CvGV(cv);
297 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
300 const char *const gvname = GvNAME(gv);
301 const HV *const stash = GvSTASH(gv);
302 const char *const hvname = stash ? HvNAME_get(stash) : NULL;
305 Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params);
307 Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params);
309 /* Pants. I don't think that it should be possible to get here. */
310 Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
320 croak_xs_usage(cv, "reference, kind");
322 SV * const sv = ST(0);
326 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
327 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
330 ST(0) = boolSV(sv_derived_from_sv(sv, ST(1), 0));
344 croak_xs_usage(cv, "object-ref, method");
350 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
351 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
357 sv = MUTABLE_SV(SvRV(sv));
362 pkg = gv_stashsv(sv, 0);
366 GV * const gv = gv_fetchmethod_sv_flags(pkg, ST(1), 0);
368 rv = sv_2mortal(newRV(MUTABLE_SV(GvCV(gv))));
375 XS(XS_UNIVERSAL_DOES)
382 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
384 SV * const sv = ST(0);
385 if (sv_does_sv( sv, ST(1), 0 ))
392 XS(XS_UNIVERSAL_VERSION)
405 sv = MUTABLE_SV(SvRV(ST(0)));
407 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
411 pkg = gv_stashsv(ST(0), 0);
414 gvp = pkg ? (GV**)hv_fetchs(pkg, "VERSION", FALSE) : NULL;
416 if (gvp && isGV(gv = *gvp) && (sv = GvSV(gv)) && SvOK(sv)) {
417 ret = sv_newmortal();
422 sv = ret = &PL_sv_undef;
431 const char * const name = HvNAME_get(pkg);
433 "%s does not define $%s::VERSION--version check failed",
437 "%s defines neither package nor VERSION--version check failed",
438 SvPVx_nolen_const(ST(0)) );
442 if ( !sv_derived_from(sv, "version"))
443 upg_version(sv, FALSE);
445 if ( !sv_derived_from(req, "version")) {
446 /* req may very well be R/O, so create a new object */
447 req = sv_2mortal( new_version(req) );
450 if ( vcmp( req, sv ) > 0 ) {
451 if ( hv_exists(MUTABLE_HV(SvRV(req)), "qv", 2 ) ) {
452 Perl_croak(aTHX_ "%s version %"SVf" required--"
453 "this is only version %"SVf"", HvNAME_get(pkg),
454 SVfARG(sv_2mortal(vnormal(req))),
455 SVfARG(sv_2mortal(vnormal(sv))));
457 Perl_croak(aTHX_ "%s version %"SVf" required--"
458 "this is only version %"SVf"", HvNAME_get(pkg),
459 SVfARG(sv_2mortal(vstringify(req))),
460 SVfARG(sv_2mortal(vstringify(sv))));
476 croak_xs_usage(cv, "class, version");
481 const char * const classname =
482 sv_isobject(ST(0)) /* get the class if called as an object method */
483 ? HvNAME(SvSTASH(SvRV(ST(0))))
484 : (char *)SvPV_nolen(ST(0));
486 if ( items == 1 || ! SvOK(vs) ) { /* no param or explicit undef */
487 /* create empty object */
491 else if ( items == 3 ) {
493 Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
496 rv = new_version(vs);
497 if ( strcmp(classname,"version") != 0 ) /* inherited new() */
498 sv_bless(rv, gv_stashpv(classname, GV_ADD));
506 XS(XS_version_stringify)
511 croak_xs_usage(cv, "lobj, ...");
516 if (sv_derived_from(lobj, "version") && SvROK(lobj)) {
520 Perl_croak(aTHX_ "lobj is not of type version");
522 mPUSHs(vstringify(lobj));
529 XS(XS_version_numify)
534 croak_xs_usage(cv, "lobj, ...");
539 if (sv_derived_from(lobj, "version") && SvROK(lobj)) {
543 Perl_croak(aTHX_ "lobj is not of type version");
545 mPUSHs(vnumify(lobj));
552 XS(XS_version_normal)
557 croak_xs_usage(cv, "lobj, ...");
562 if (sv_derived_from(lobj, "version") && SvROK(lobj)) {
566 Perl_croak(aTHX_ "lobj is not of type version");
568 mPUSHs(vnormal(lobj));
580 croak_xs_usage(cv, "lobj, ...");
585 if (sv_derived_from(lobj, "version") && SvROK(lobj)) {
589 Perl_croak(aTHX_ "lobj is not of type version");
595 const IV swap = (IV)SvIV(ST(2));
597 if ( ! sv_derived_from(robj, "version") )
599 robj = new_version(SvOK(robj) ? robj : newSVpvs_flags("0", SVs_TEMP));
606 rs = newSViv(vcmp(rvs,lobj));
610 rs = newSViv(vcmp(lobj,rvs));
621 XS(XS_version_boolean)
626 croak_xs_usage(cv, "lobj, ...");
628 if (sv_derived_from(ST(0), "version") && SvROK(ST(0))) {
629 SV * const lobj = SvRV(ST(0));
630 SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) );
636 Perl_croak(aTHX_ "lobj is not of type version");
644 croak_xs_usage(cv, "lobj, ...");
645 if (sv_derived_from(ST(0), "version") && SvROK(ST(0)))
646 Perl_croak(aTHX_ "operation not supported with version object");
648 Perl_croak(aTHX_ "lobj is not of type version");
649 #ifndef HASATTRIBUTE_NORETURN
654 XS(XS_version_is_alpha)
659 croak_xs_usage(cv, "lobj");
661 if (sv_derived_from(ST(0), "version") && SvROK(ST(0))) {
662 SV * const lobj = ST(0);
663 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "alpha", 5 ) )
671 Perl_croak(aTHX_ "lobj is not of type version");
683 const char * classname = "";
684 if ( items == 2 && SvOK(ST(1)) ) {
685 /* getting called as object or class method */
688 sv_isobject(ST(0)) /* class called as an object method */
689 ? HvNAME_get(SvSTASH(SvRV(ST(0))))
690 : (char *)SvPV_nolen(ST(0));
692 if ( !SvVOK(ver) ) { /* not already a v-string */
694 sv_setsv(rv,ver); /* make a duplicate */
695 upg_version(rv, TRUE);
697 rv = sv_2mortal(new_version(ver));
699 if ( items == 2 && strcmp(classname,"version") ) { /* inherited new() */
700 sv_bless(rv, gv_stashpv(classname, GV_ADD));
713 croak_xs_usage(cv, "lobj");
715 if (sv_derived_from(ST(0), "version") && SvROK(ST(0))) {
716 SV * const lobj = ST(0);
717 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "qv", 2 ) )
725 Perl_croak(aTHX_ "lobj is not of type version");
733 croak_xs_usage(cv, "sv");
735 SV * const sv = ST(0);
750 croak_xs_usage(cv, "sv");
752 SV * const sv = ST(0);
754 const char * const s = SvPV_const(sv,len);
755 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
768 croak_xs_usage(cv, "sv");
769 sv_utf8_encode(ST(0));
778 croak_xs_usage(cv, "sv");
780 SV * const sv = ST(0);
782 if (SvIsCOW(sv)) sv_force_normal(sv);
783 RETVAL = sv_utf8_decode(sv);
784 ST(0) = boolSV(RETVAL);
794 croak_xs_usage(cv, "sv");
796 SV * const sv = ST(0);
800 RETVAL = sv_utf8_upgrade(sv);
801 XSprePUSH; PUSHi((IV)RETVAL);
806 XS(XS_utf8_downgrade)
810 if (items < 1 || items > 2)
811 croak_xs_usage(cv, "sv, failok=0");
813 SV * const sv = ST(0);
814 const bool failok = (items < 2) ? 0 : (int)SvIV(ST(1));
815 const bool RETVAL = sv_utf8_downgrade(sv, failok);
817 ST(0) = boolSV(RETVAL);
822 XS(XS_utf8_native_to_unicode)
826 const UV uv = SvUV(ST(0));
829 croak_xs_usage(cv, "sv");
831 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
835 XS(XS_utf8_unicode_to_native)
839 const UV uv = SvUV(ST(0));
842 croak_xs_usage(cv, "sv");
844 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
848 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
852 SV * const svz = ST(0);
856 /* [perl #77776] - called as &foo() not foo() */
858 croak_xs_usage(cv, "SCALAR[, ON]");
863 if (SvREADONLY(sv) && !SvIsCOW(sv))
868 else if (items == 2) {
870 if (SvIsCOW(sv)) sv_force_normal(sv);
875 /* I hope you really know what you are doing. */
876 if (!SvIsCOW(sv)) SvREADONLY_off(sv);
880 XSRETURN_UNDEF; /* Can't happen. */
883 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
887 SV * const svz = ST(0);
891 /* [perl #77776] - called as &foo() not foo() */
893 croak_xs_usage(cv, "SCALAR[, REFCOUNT]");
898 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
899 else if (items == 2) {
900 /* I hope you really know what you are doing. */
901 SvREFCNT(sv) = SvIV(ST(1));
902 XSRETURN_IV(SvREFCNT(sv));
904 XSRETURN_UNDEF; /* Can't happen. */
907 XS(XS_Internals_hv_clear_placehold)
912 if (items != 1 || !SvROK(ST(0)))
913 croak_xs_usage(cv, "hv");
915 HV * const hv = MUTABLE_HV(SvRV(ST(0)));
916 hv_clear_placeholders(hv);
921 XS(XS_PerlIO_get_layers)
925 if (items < 1 || items % 2 == 0)
926 croak_xs_usage(cv, "filehandle[,args]");
933 bool details = FALSE;
937 for (svp = MARK + 2; svp <= SP; svp += 2) {
938 SV * const * const varp = svp;
939 SV * const * const valp = svp + 1;
941 const char * const key = SvPV_const(*varp, klen);
945 if (klen == 5 && memEQ(key, "input", 5)) {
946 input = SvTRUE(*valp);
951 if (klen == 6 && memEQ(key, "output", 6)) {
952 input = !SvTRUE(*valp);
957 if (klen == 7 && memEQ(key, "details", 7)) {
958 details = SvTRUE(*valp);
965 "get_layers: unknown argument '%s'",
977 if (SvROK(sv) && isGV(SvRV(sv)))
978 gv = MUTABLE_GV(SvRV(sv));
980 gv = gv_fetchsv(sv, 0, SVt_PVIO);
983 if (gv && (io = GvIO(gv))) {
984 AV* const av = PerlIO_get_layers(aTHX_ input ?
985 IoIFP(io) : IoOFP(io));
987 const I32 last = av_len(av);
990 for (i = last; i >= 0; i -= 3) {
991 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
992 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
993 SV * const * const flgsvp = av_fetch(av, i, FALSE);
995 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
996 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
997 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
1000 /* Indents of 5? Yuck. */
1001 /* We know that PerlIO_get_layers creates a new SV for
1002 the name and flags, so we can just take a reference
1003 and "steal" it when we free the AV below. */
1005 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
1008 ? newSVpvn_flags(SvPVX_const(*argsvp),
1010 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
1014 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
1020 XPUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
1024 XPUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
1026 XPUSHs(&PL_sv_undef);
1029 const IV flags = SvIVX(*flgsvp);
1031 if (flags & PERLIO_F_UTF8) {
1032 XPUSHs(newSVpvs_flags("utf8", SVs_TEMP));
1049 XS(XS_Internals_hash_seed)
1052 /* Using dXSARGS would also have dITEM and dSP,
1053 * which define 2 unused local variables. */
1055 PERL_UNUSED_ARG(cv);
1056 PERL_UNUSED_VAR(mark);
1057 XSRETURN_UV(PERL_HASH_SEED);
1060 XS(XS_Internals_rehash_seed)
1063 /* Using dXSARGS would also have dITEM and dSP,
1064 * which define 2 unused local variables. */
1066 PERL_UNUSED_ARG(cv);
1067 PERL_UNUSED_VAR(mark);
1068 XSRETURN_UV(PL_rehash_seed);
1071 XS(XS_Internals_HvREHASH) /* Subject to change */
1075 PERL_UNUSED_ARG(cv);
1077 const HV * const hv = (const HV *) SvRV(ST(0));
1078 if (items == 1 && SvTYPE(hv) == SVt_PVHV) {
1085 Perl_croak(aTHX_ "Internals::HvREHASH $hashref");
1092 PERL_UNUSED_VAR(cv);
1095 croak_xs_usage(cv, "sv");
1097 if (SvRXOK(ST(0))) {
1104 XS(XS_re_regnames_count)
1106 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1112 croak_xs_usage(cv, "");
1120 ret = CALLREG_NAMED_BUFF_COUNT(rx);
1123 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
1135 if (items < 1 || items > 2)
1136 croak_xs_usage(cv, "name[, all ]");
1141 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1146 if (items == 2 && SvTRUE(ST(1))) {
1151 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
1154 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
1172 croak_xs_usage(cv, "[all]");
1174 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1179 if (items == 1 && SvTRUE(ST(0))) {
1188 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
1195 av = MUTABLE_AV(SvRV(ret));
1196 length = av_len(av);
1198 for (i = 0; i <= length; i++) {
1199 entry = av_fetch(av, i, FALSE);
1202 Perl_croak(aTHX_ "NULL array element in re::regnames()");
1204 mXPUSHs(SvREFCNT_inc_simple_NN(*entry));
1213 XS(XS_re_regexp_pattern)
1220 croak_xs_usage(cv, "sv");
1225 Checks if a reference is a regex or not. If the parameter is
1226 not a ref, or is not the result of a qr// then returns false
1227 in scalar context and an empty list in list context.
1228 Otherwise in list context it returns the pattern and the
1229 modifiers, in scalar context it returns the pattern just as it
1230 would if the qr// was stringified normally, regardless as
1231 to the class of the variable and any stringification overloads
1235 if ((re = SvRX(ST(0)))) /* assign deliberate */
1237 /* Houston, we have a regex! */
1240 if ( GIMME_V == G_ARRAY ) {
1242 char reflags[sizeof(INT_PAT_MODS) + MAX_CHARSET_NAME_LENGTH];
1248 we are in list context so stringify
1249 the modifiers that apply. We ignore "negative
1250 modifiers" in this scenario, and the default character set
1253 if (get_regex_charset(RX_EXTFLAGS(re)) != REGEX_DEPENDS_CHARSET) {
1255 const char* const name = get_regex_charset_name(RX_EXTFLAGS(re),
1257 Copy(name, reflags + left, len, char);
1260 fptr = INT_PAT_MODS;
1261 match_flags = (U16)((RX_EXTFLAGS(re) & RXf_PMf_COMPILETIME)
1262 >> RXf_PMf_STD_PMMOD_SHIFT);
1264 while((ch = *fptr++)) {
1265 if(match_flags & 1) {
1266 reflags[left++] = ch;
1271 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
1272 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1274 /* return the pattern and the modifiers */
1276 XPUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
1279 /* Scalar, so use the string that Perl would return */
1280 /* return the pattern in (?msix:..) format */
1281 #if PERL_VERSION >= 11
1282 pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));
1284 pattern = newSVpvn_flags(RX_WRAPPED(re), RX_WRAPLEN(re),
1285 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1291 /* It ain't a regexp folks */
1292 if ( GIMME_V == G_ARRAY ) {
1293 /* return the empty list */
1296 /* Because of the (?:..) wrapping involved in a
1297 stringified pattern it is impossible to get a
1298 result for a real regexp that would evaluate to
1299 false. Therefore we can return PL_sv_no to signify
1300 that the object is not a regex, this means that one
1303 if (regex($might_be_a_regex) eq '(?:foo)') { }
1305 and not worry about undefined values.
1313 struct xsub_details {
1319 struct xsub_details details[] = {
1320 {"UNIVERSAL::isa", XS_UNIVERSAL_isa, NULL},
1321 {"UNIVERSAL::can", XS_UNIVERSAL_can, NULL},
1322 {"UNIVERSAL::DOES", XS_UNIVERSAL_DOES, NULL},
1323 {"UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, NULL},
1324 {"version::()", XS_version_noop, NULL},
1325 {"version::new", XS_version_new, NULL},
1326 {"version::parse", XS_version_new, NULL},
1327 {"version::(\"\"", XS_version_stringify, NULL},
1328 {"version::stringify", XS_version_stringify, NULL},
1329 {"version::(0+", XS_version_numify, NULL},
1330 {"version::numify", XS_version_numify, NULL},
1331 {"version::normal", XS_version_normal, NULL},
1332 {"version::(cmp", XS_version_vcmp, NULL},
1333 {"version::(<=>", XS_version_vcmp, NULL},
1334 {"version::vcmp", XS_version_vcmp, NULL},
1335 {"version::(bool", XS_version_boolean, NULL},
1336 {"version::boolean", XS_version_boolean, NULL},
1337 {"version::(nomethod", XS_version_noop, NULL},
1338 {"version::noop", XS_version_noop, NULL},
1339 {"version::is_alpha", XS_version_is_alpha, NULL},
1340 {"version::qv", XS_version_qv, NULL},
1341 {"version::declare", XS_version_qv, NULL},
1342 {"version::is_qv", XS_version_is_qv, NULL},
1343 {"utf8::is_utf8", XS_utf8_is_utf8, NULL},
1344 {"utf8::valid", XS_utf8_valid, NULL},
1345 {"utf8::encode", XS_utf8_encode, NULL},
1346 {"utf8::decode", XS_utf8_decode, NULL},
1347 {"utf8::upgrade", XS_utf8_upgrade, NULL},
1348 {"utf8::downgrade", XS_utf8_downgrade, NULL},
1349 {"utf8::native_to_unicode", XS_utf8_native_to_unicode, NULL},
1350 {"utf8::unicode_to_native", XS_utf8_unicode_to_native, NULL},
1351 {"Internals::SvREADONLY", XS_Internals_SvREADONLY, "\\[$%@];$"},
1352 {"Internals::SvREFCNT", XS_Internals_SvREFCNT, "\\[$%@];$"},
1353 {"Internals::hv_clear_placeholders", XS_Internals_hv_clear_placehold, "\\%"},
1354 {"PerlIO::get_layers", XS_PerlIO_get_layers, "*;@"},
1355 {"Internals::hash_seed", XS_Internals_hash_seed, ""},
1356 {"Internals::rehash_seed", XS_Internals_rehash_seed, ""},
1357 {"Internals::HvREHASH", XS_Internals_HvREHASH, "\\%"},
1358 {"re::is_regexp", XS_re_is_regexp, "$"},
1359 {"re::regname", XS_re_regname, ";$$"},
1360 {"re::regnames", XS_re_regnames, ";$"},
1361 {"re::regnames_count", XS_re_regnames_count, ""},
1362 {"re::regexp_pattern", XS_re_regexp_pattern, "$"},
1366 Perl_boot_core_UNIVERSAL(pTHX)
1369 static const char file[] = __FILE__;
1370 struct xsub_details *xsub = details;
1371 const struct xsub_details *end
1372 = details + sizeof(details) / sizeof(details[0]);
1375 newXS_flags(xsub->name, xsub->xsub, file, xsub->proto, 0);
1376 } while (++xsub < end);
1378 /* register the overloading (type 'A') magic */
1379 PL_amagic_generation++;
1381 /* Providing a Regexp::DESTROY fixes #21347. See test in t/op/ref.t */
1384 newCONSTSUB(get_hv("Regexp::", GV_ADD), "DESTROY", NULL);
1385 Safefree(CvFILE(cv));
1386 CvFILE(cv) = (char *)file;
1393 * c-indentation-style: bsd
1395 * indent-tabs-mode: t
1398 * ex: set ts=8 sts=4 sw=4 noet: