3 * Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 * 2005, 2006, 2007 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
17 /* This file contains the code that implements the functions in Perl's
18 * UNIVERSAL package, such as UNIVERSAL->can().
20 * It is also used to store XS functions that need to be present in
21 * miniperl for a lack of a better place to put them. It might be
22 * clever to move them to seperate XS files which would then be pulled
23 * in by some to-be-written build process.
27 #define PERL_IN_UNIVERSAL_C
31 #include "perliol.h" /* For the PERLIO_F_XXX */
35 * Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
36 * The main guts of traverse_isa was actually copied from gv_fetchmeth
40 S_isa_lookup(pTHX_ HV *stash, const char * const name)
47 const HV *const name_stash = gv_stashpv(name, 0);
49 PERL_ARGS_ASSERT_ISA_LOOKUP;
51 /* A stash/class can go by many names (ie. User == main::User), so
52 we compare the stash itself just in case */
53 if (name_stash && ((const HV *)stash == name_stash))
56 hvname = HvNAME_get(stash);
58 if (strEQ(hvname, name))
61 if (strEQ(name, "UNIVERSAL"))
64 stash_linear_isa = mro_get_linear_isa(stash);
65 svp = AvARRAY(stash_linear_isa) + 1;
66 items = AvFILLp(stash_linear_isa);
68 SV* const basename_sv = *svp++;
69 HV* const basestash = gv_stashsv(basename_sv, 0);
71 /* We have no test coverage for this block, as of 2008/08. */
72 if (ckWARN(WARN_SYNTAX))
73 Perl_warner(aTHX_ packWARN(WARN_SYNTAX),
74 "Can't locate package %"SVf" for the parents of %s",
75 SVfARG(basename_sv), hvname);
78 if(name_stash == basestash || strEQ(name, SvPVX(basename_sv)))
86 =head1 SV Manipulation Functions
88 =for apidoc sv_derived_from
90 Returns a boolean indicating whether the SV is derived from the specified class
91 I<at the C level>. To check derivation at the Perl level, call C<isa()> as a
98 Perl_sv_derived_from(pTHX_ SV *sv, const char *const name)
103 PERL_ARGS_ASSERT_SV_DERIVED_FROM;
110 type = sv_reftype(sv,0);
111 if (type && strEQ(type,name))
113 stash = SvOBJECT(sv) ? SvSTASH(sv) : NULL;
116 stash = gv_stashsv(sv, 0);
119 return stash ? isa_lookup(stash, name) : FALSE;
125 Returns a boolean indicating whether the SV performs a specific, named role.
126 The SV can be a Perl object or the name of a Perl class.
134 Perl_sv_does(pTHX_ SV *sv, const char *const name)
136 const char *classname;
141 PERL_ARGS_ASSERT_SV_DOES;
148 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
149 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
152 if (sv_isobject(sv)) {
153 classname = sv_reftype(SvRV(sv),TRUE);
155 classname = SvPV_nolen(sv);
158 if (strEQ(name,classname))
163 mXPUSHs(newSVpv(name, 0));
166 methodname = newSVpvs_flags("isa", SVs_TEMP);
167 /* ugly hack: use the SvSCREAM flag so S_method_common
168 * can figure out we're calling DOES() and not isa(),
169 * and report eventual errors correctly. --rgs */
170 SvSCREAM_on(methodname);
171 call_sv(methodname, G_SCALAR | G_METHOD);
174 does_it = SvTRUE( TOPs );
181 PERL_XS_EXPORT_C void XS_UNIVERSAL_isa(pTHX_ CV *cv);
182 PERL_XS_EXPORT_C void XS_UNIVERSAL_can(pTHX_ CV *cv);
183 PERL_XS_EXPORT_C void XS_UNIVERSAL_DOES(pTHX_ CV *cv);
184 PERL_XS_EXPORT_C void XS_UNIVERSAL_VERSION(pTHX_ CV *cv);
186 XS(XS_version_stringify);
187 XS(XS_version_numify);
188 XS(XS_version_normal);
190 XS(XS_version_boolean);
191 #ifdef HASATTRIBUTE_NORETURN
192 XS(XS_version_noop) __attribute__noreturn__;
196 XS(XS_version_is_alpha);
203 XS(XS_utf8_downgrade);
204 XS(XS_utf8_unicode_to_native);
205 XS(XS_utf8_native_to_unicode);
206 XS(XS_Internals_SvREADONLY);
207 XS(XS_Internals_SvREFCNT);
208 XS(XS_Internals_hv_clear_placehold);
209 XS(XS_PerlIO_get_layers);
210 XS(XS_Regexp_DESTROY);
211 XS(XS_Internals_hash_seed);
212 XS(XS_Internals_rehash_seed);
213 XS(XS_Internals_HvREHASH);
214 XS(XS_Internals_inc_sub_generation);
218 XS(XS_re_regnames_count);
219 XS(XS_re_regexp_pattern);
220 XS(XS_Tie_Hash_NamedCapture_FETCH);
221 XS(XS_Tie_Hash_NamedCapture_STORE);
222 XS(XS_Tie_Hash_NamedCapture_DELETE);
223 XS(XS_Tie_Hash_NamedCapture_CLEAR);
224 XS(XS_Tie_Hash_NamedCapture_EXISTS);
225 XS(XS_Tie_Hash_NamedCapture_FIRSTK);
226 XS(XS_Tie_Hash_NamedCapture_NEXTK);
227 XS(XS_Tie_Hash_NamedCapture_SCALAR);
228 XS(XS_Tie_Hash_NamedCapture_flags);
231 Perl_boot_core_UNIVERSAL(pTHX)
234 static const char file[] = __FILE__;
236 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
237 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
238 newXS("UNIVERSAL::DOES", XS_UNIVERSAL_DOES, file);
239 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
241 /* register the overloading (type 'A') magic */
242 PL_amagic_generation++;
243 /* Make it findable via fetchmethod */
244 newXS("version::()", XS_version_noop, file);
245 newXS("version::new", XS_version_new, file);
246 newXS("version::(\"\"", XS_version_stringify, file);
247 newXS("version::stringify", XS_version_stringify, file);
248 newXS("version::(0+", XS_version_numify, file);
249 newXS("version::numify", XS_version_numify, file);
250 newXS("version::normal", XS_version_normal, file);
251 newXS("version::(cmp", XS_version_vcmp, file);
252 newXS("version::(<=>", XS_version_vcmp, file);
253 newXS("version::vcmp", XS_version_vcmp, file);
254 newXS("version::(bool", XS_version_boolean, file);
255 newXS("version::boolean", XS_version_boolean, file);
256 newXS("version::(nomethod", XS_version_noop, file);
257 newXS("version::noop", XS_version_noop, file);
258 newXS("version::is_alpha", XS_version_is_alpha, file);
259 newXS("version::qv", XS_version_qv, file);
261 newXS("utf8::is_utf8", XS_utf8_is_utf8, file);
262 newXS("utf8::valid", XS_utf8_valid, file);
263 newXS("utf8::encode", XS_utf8_encode, file);
264 newXS("utf8::decode", XS_utf8_decode, file);
265 newXS("utf8::upgrade", XS_utf8_upgrade, file);
266 newXS("utf8::downgrade", XS_utf8_downgrade, file);
267 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
268 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
269 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
270 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
271 newXSproto("Internals::hv_clear_placeholders",
272 XS_Internals_hv_clear_placehold, file, "\\%");
273 newXSproto("PerlIO::get_layers",
274 XS_PerlIO_get_layers, file, "*;@");
275 newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
276 newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
277 newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, "");
278 newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
279 newXSproto("re::is_regexp", XS_re_is_regexp, file, "$");
280 newXSproto("re::regname", XS_re_regname, file, ";$$");
281 newXSproto("re::regnames", XS_re_regnames, file, ";$");
282 newXSproto("re::regnames_count", XS_re_regnames_count, file, "");
283 newXSproto("re::regexp_pattern", XS_re_regexp_pattern, file, "$");
284 newXS("Tie::Hash::NamedCapture::FETCH", XS_Tie_Hash_NamedCapture_FETCH, file);
285 newXS("Tie::Hash::NamedCapture::STORE", XS_Tie_Hash_NamedCapture_STORE, file);
286 newXS("Tie::Hash::NamedCapture::DELETE", XS_Tie_Hash_NamedCapture_DELETE, file);
287 newXS("Tie::Hash::NamedCapture::CLEAR", XS_Tie_Hash_NamedCapture_CLEAR, file);
288 newXS("Tie::Hash::NamedCapture::EXISTS", XS_Tie_Hash_NamedCapture_EXISTS, file);
289 newXS("Tie::Hash::NamedCapture::FIRSTKEY", XS_Tie_Hash_NamedCapture_FIRSTK, file);
290 newXS("Tie::Hash::NamedCapture::NEXTKEY", XS_Tie_Hash_NamedCapture_NEXTK, file);
291 newXS("Tie::Hash::NamedCapture::SCALAR", XS_Tie_Hash_NamedCapture_SCALAR, file);
292 newXS("Tie::Hash::NamedCapture::flags", XS_Tie_Hash_NamedCapture_flags, file);
296 =for apidoc croak_xs_usage
298 A specialised variant of C<croak()> for emitting the usage message for xsubs
300 croak_xs_usage(cv, "eee_yow");
302 works out the package name and subroutine name from C<cv>, and then calls
303 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
305 Perl_croak(aTHX_ "Usage %s::%s(%s)", "ouch" "awk", "eee_yow");
311 Perl_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
313 const GV *const gv = CvGV(cv);
315 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
318 const char *const gvname = GvNAME(gv);
319 const HV *const stash = GvSTASH(gv);
320 const char *const hvname = stash ? HvNAME_get(stash) : NULL;
323 Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params);
325 Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params);
327 /* Pants. I don't think that it should be possible to get here. */
328 Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
338 croak_xs_usage(cv, "reference, kind");
340 SV * const sv = ST(0);
345 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
346 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
349 name = SvPV_nolen_const(ST(1));
351 ST(0) = boolSV(sv_derived_from(sv, name));
366 croak_xs_usage(cv, "object-ref, method");
372 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
373 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
376 name = SvPV_nolen_const(ST(1));
385 pkg = gv_stashsv(sv, 0);
389 GV * const gv = gv_fetchmethod_autoload(pkg, name, FALSE);
391 rv = sv_2mortal(newRV((SV*)GvCV(gv)));
398 XS(XS_UNIVERSAL_DOES)
405 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
407 SV * const sv = ST(0);
410 name = SvPV_nolen_const(ST(1));
411 if (sv_does( sv, name ))
418 XS(XS_UNIVERSAL_VERSION)
430 sv = (SV*)SvRV(ST(0));
432 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
436 pkg = gv_stashsv(ST(0), 0);
439 gvp = pkg ? (GV**)hv_fetchs(pkg, "VERSION", FALSE) : NULL;
441 if (gvp && isGV(gv = *gvp) && (sv = GvSV(gv)) && SvOK(sv)) {
442 SV * const nsv = sv_newmortal();
445 if ( !sv_derived_from(sv, "version"))
446 upg_version(sv, FALSE);
450 sv = (SV*)&PL_sv_undef;
459 const char * const name = HvNAME_get(pkg);
461 "%s does not define $%s::VERSION--version check failed",
465 "%s defines neither package nor VERSION--version check failed",
466 SvPVx_nolen_const(ST(0)) );
470 if ( !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((HV*)SvRV(req), "qv", 2 ) ) {
477 Perl_croak(aTHX_ "%s version %"SVf" required--"
478 "this is only version %"SVf"", HvNAME_get(pkg),
479 SVfARG(vnormal(req)),
480 SVfARG(vnormal(sv)));
482 Perl_croak(aTHX_ "%s version %"SVf" required--"
483 "this is only version %"SVf"", HvNAME_get(pkg),
484 SVfARG(vstringify(req)),
485 SVfARG(vstringify(sv)));
491 if ( SvOK(sv) && sv_derived_from(sv, "version") ) {
492 ST(0) = vstringify(sv);
505 croak_xs_usage(cv, "class, version");
510 const char * const classname =
511 sv_isobject(ST(0)) /* get the class if called as an object method */
512 ? HvNAME(SvSTASH(SvRV(ST(0))))
513 : (char *)SvPV_nolen(ST(0));
515 if ( items == 1 || vs == &PL_sv_undef ) { /* no param or explicit undef */
516 /* create empty object */
520 else if ( items == 3 ) {
522 Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
525 rv = new_version(vs);
526 if ( strcmp(classname,"version") != 0 ) /* inherited new() */
527 sv_bless(rv, gv_stashpv(classname, GV_ADD));
535 XS(XS_version_stringify)
540 croak_xs_usage(cv, "lobj, ...");
545 if (sv_derived_from(ST(0), "version")) {
549 Perl_croak(aTHX_ "lobj is not of type version");
551 mPUSHs(vstringify(lobj));
558 XS(XS_version_numify)
563 croak_xs_usage(cv, "lobj, ...");
568 if (sv_derived_from(ST(0), "version")) {
572 Perl_croak(aTHX_ "lobj is not of type version");
574 mPUSHs(vnumify(lobj));
581 XS(XS_version_normal)
586 croak_xs_usage(cv, "lobj, ...");
591 if (sv_derived_from(ST(0), "version")) {
595 Perl_croak(aTHX_ "lobj is not of type version");
597 mPUSHs(vnormal(lobj));
609 croak_xs_usage(cv, "lobj, ...");
614 if (sv_derived_from(ST(0), "version")) {
618 Perl_croak(aTHX_ "lobj is not of type version");
624 const IV swap = (IV)SvIV(ST(2));
626 if ( ! sv_derived_from(robj, "version") )
628 robj = new_version(robj);
634 rs = newSViv(vcmp(rvs,lobj));
638 rs = newSViv(vcmp(lobj,rvs));
649 XS(XS_version_boolean)
654 croak_xs_usage(cv, "lobj, ...");
656 if (sv_derived_from(ST(0), "version")) {
657 SV * const lobj = SvRV(ST(0));
658 SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) );
664 Perl_croak(aTHX_ "lobj is not of type version");
672 croak_xs_usage(cv, "lobj, ...");
673 if (sv_derived_from(ST(0), "version"))
674 Perl_croak(aTHX_ "operation not supported with version object");
676 Perl_croak(aTHX_ "lobj is not of type version");
677 #ifndef HASATTRIBUTE_NORETURN
682 XS(XS_version_is_alpha)
687 croak_xs_usage(cv, "lobj");
689 if (sv_derived_from(ST(0), "version")) {
690 SV * const lobj = ST(0);
691 if ( hv_exists((HV*)SvRV(lobj), "alpha", 5 ) )
699 Perl_croak(aTHX_ "lobj is not of type version");
707 croak_xs_usage(cv, "ver");
711 if ( !SvVOK(ver) ) { /* only need to do with if not already v-string */
712 SV * const rv = sv_newmortal();
713 sv_setsv(rv,ver); /* make a duplicate */
714 upg_version(rv, TRUE);
719 mPUSHs(new_version(ver));
732 croak_xs_usage(cv, "sv");
734 const SV * const sv = ST(0);
748 croak_xs_usage(cv, "sv");
750 SV * const sv = ST(0);
752 const char * const s = SvPV_const(sv,len);
753 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
766 croak_xs_usage(cv, "sv");
767 sv_utf8_encode(ST(0));
776 croak_xs_usage(cv, "sv");
778 SV * const sv = ST(0);
779 const bool RETVAL = sv_utf8_decode(sv);
780 ST(0) = boolSV(RETVAL);
791 croak_xs_usage(cv, "sv");
793 SV * const sv = ST(0);
797 RETVAL = sv_utf8_upgrade(sv);
798 XSprePUSH; PUSHi((IV)RETVAL);
803 XS(XS_utf8_downgrade)
807 if (items < 1 || items > 2)
808 croak_xs_usage(cv, "sv, failok=0");
810 SV * const sv = ST(0);
811 const bool failok = (items < 2) ? 0 : (int)SvIV(ST(1));
812 const bool RETVAL = sv_utf8_downgrade(sv, failok);
814 ST(0) = boolSV(RETVAL);
820 XS(XS_utf8_native_to_unicode)
824 const UV uv = SvUV(ST(0));
827 croak_xs_usage(cv, "sv");
829 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
833 XS(XS_utf8_unicode_to_native)
837 const UV uv = SvUV(ST(0));
840 croak_xs_usage(cv, "sv");
842 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
846 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
850 SV * const sv = SvRV(ST(0));
859 else if (items == 2) {
865 /* I hope you really know what you are doing. */
870 XSRETURN_UNDEF; /* Can't happen. */
873 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
877 SV * const sv = SvRV(ST(0));
881 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
882 else if (items == 2) {
883 /* I hope you really know what you are doing. */
884 SvREFCNT(sv) = SvIV(ST(1));
885 XSRETURN_IV(SvREFCNT(sv));
887 XSRETURN_UNDEF; /* Can't happen. */
890 XS(XS_Internals_hv_clear_placehold)
896 croak_xs_usage(cv, "hv");
898 HV * const hv = (HV *) SvRV(ST(0));
899 hv_clear_placeholders(hv);
904 XS(XS_Regexp_DESTROY)
910 XS(XS_PerlIO_get_layers)
914 if (items < 1 || items % 2 == 0)
915 croak_xs_usage(cv, "filehandle[,args]");
922 bool details = FALSE;
926 for (svp = MARK + 2; svp <= SP; svp += 2) {
927 SV * const * const varp = svp;
928 SV * const * const valp = svp + 1;
930 const char * const key = SvPV_const(*varp, klen);
934 if (klen == 5 && memEQ(key, "input", 5)) {
935 input = SvTRUE(*valp);
940 if (klen == 6 && memEQ(key, "output", 6)) {
941 input = !SvTRUE(*valp);
946 if (klen == 7 && memEQ(key, "details", 7)) {
947 details = SvTRUE(*valp);
954 "get_layers: unknown argument '%s'",
966 if (SvROK(sv) && isGV(SvRV(sv)))
969 gv = gv_fetchsv(sv, 0, SVt_PVIO);
972 if (gv && (io = GvIO(gv))) {
973 AV* const av = PerlIO_get_layers(aTHX_ input ?
974 IoIFP(io) : IoOFP(io));
976 const I32 last = av_len(av);
979 for (i = last; i >= 0; i -= 3) {
980 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
981 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
982 SV * const * const flgsvp = av_fetch(av, i, FALSE);
984 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
985 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
986 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
989 /* Indents of 5? Yuck. */
990 /* We know that PerlIO_get_layers creates a new SV for
991 the name and flags, so we can just take a reference
992 and "steal" it when we free the AV below. */
994 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
997 ? newSVpvn_flags(SvPVX_const(*argsvp),
999 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
1003 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
1009 XPUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
1013 XPUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
1015 XPUSHs(&PL_sv_undef);
1018 const IV flags = SvIVX(*flgsvp);
1020 if (flags & PERLIO_F_UTF8) {
1021 XPUSHs(newSVpvs_flags("utf8", SVs_TEMP));
1038 XS(XS_Internals_hash_seed)
1041 /* Using dXSARGS would also have dITEM and dSP,
1042 * which define 2 unused local variables. */
1044 PERL_UNUSED_ARG(cv);
1045 PERL_UNUSED_VAR(mark);
1046 XSRETURN_UV(PERL_HASH_SEED);
1049 XS(XS_Internals_rehash_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(PL_rehash_seed);
1060 XS(XS_Internals_HvREHASH) /* Subject to change */
1064 PERL_UNUSED_ARG(cv);
1066 const HV * const hv = (HV *) SvRV(ST(0));
1067 if (items == 1 && SvTYPE(hv) == SVt_PVHV) {
1074 Perl_croak(aTHX_ "Internals::HvREHASH $hashref");
1081 PERL_UNUSED_VAR(cv);
1084 croak_xs_usage(cv, "sv");
1088 if (SvRXOK(ST(0))) {
1095 XS(XS_re_regnames_count)
1097 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1103 croak_xs_usage(cv, "");
1110 ret = CALLREG_NAMED_BUFF_COUNT(rx);
1131 if (items < 1 || items > 2)
1132 croak_xs_usage(cv, "name[, all ]");
1136 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1141 if (items == 2 && SvTRUE(ST(1))) {
1146 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
1169 croak_xs_usage(cv, "[all]");
1171 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1176 if (items == 1 && SvTRUE(ST(0))) {
1184 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
1193 av = (AV*)SvRV(ret);
1194 length = av_len(av);
1196 for (i = 0; i <= length; i++) {
1197 entry = av_fetch(av, i, FALSE);
1200 Perl_croak(aTHX_ "NULL array element in re::regnames()");
1202 mXPUSHs(SvREFCNT_inc_simple_NN(*entry));
1211 XS(XS_re_regexp_pattern)
1218 croak_xs_usage(cv, "sv");
1223 Checks if a reference is a regex or not. If the parameter is
1224 not a ref, or is not the result of a qr// then returns false
1225 in scalar context and an empty list in list context.
1226 Otherwise in list context it returns the pattern and the
1227 modifiers, in scalar context it returns the pattern just as it
1228 would if the qr// was stringified normally, regardless as
1229 to the class of the variable and any strigification overloads
1233 if ((re = SvRX(ST(0)))) /* assign deliberate */
1235 /* Housten, we have a regex! */
1240 if ( GIMME_V == G_ARRAY ) {
1242 we are in list context so stringify
1243 the modifiers that apply. We ignore "negative
1244 modifiers" in this scenario.
1247 const char *fptr = INT_PAT_MODS;
1249 U16 match_flags = (U16)((RX_EXTFLAGS(re) & PMf_COMPILETIME)
1250 >> RXf_PMf_STD_PMMOD_SHIFT);
1252 while((ch = *fptr++)) {
1253 if(match_flags & 1) {
1254 reflags[left++] = ch;
1259 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
1260 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1262 /* return the pattern and the modifiers */
1264 XPUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
1267 /* Scalar, so use the string that Perl would return */
1268 /* return the pattern in (?msix:..) format */
1269 #if PERL_VERSION >= 11
1270 pattern = sv_2mortal(newSVsv((SV*)re));
1272 pattern = newSVpvn_flags(RX_WRAPPED(re), RX_WRAPLEN(re),
1273 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1279 /* It ain't a regexp folks */
1280 if ( GIMME_V == G_ARRAY ) {
1281 /* return the empty list */
1284 /* Because of the (?:..) wrapping involved in a
1285 stringified pattern it is impossible to get a
1286 result for a real regexp that would evaluate to
1287 false. Therefore we can return PL_sv_no to signify
1288 that the object is not a regex, this means that one
1291 if (regex($might_be_a_regex) eq '(?:foo)') { }
1293 and not worry about undefined values.
1301 XS(XS_Tie_Hash_NamedCapture_FETCH)
1310 croak_xs_usage(cv, "$key, $flags");
1312 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1319 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1320 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(1), flags);
1332 XS(XS_Tie_Hash_NamedCapture_STORE)
1340 croak_xs_usage(cv, "$key, $value, $flags");
1342 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1346 Perl_croak(aTHX_ PL_no_modify);
1353 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1354 CALLREG_NAMED_BUFF_STORE(rx,ST(1), ST(2), flags);
1357 XS(XS_Tie_Hash_NamedCapture_DELETE)
1361 REGEXP * rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1365 croak_xs_usage(cv, "$key, $flags");
1368 Perl_croak(aTHX_ PL_no_modify);
1372 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1373 CALLREG_NAMED_BUFF_DELETE(rx, ST(1), flags);
1376 XS(XS_Tie_Hash_NamedCapture_CLEAR)
1384 croak_xs_usage(cv, "$flags");
1386 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1389 Perl_croak(aTHX_ PL_no_modify);
1393 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1394 CALLREG_NAMED_BUFF_CLEAR(rx, flags);
1397 XS(XS_Tie_Hash_NamedCapture_EXISTS)
1406 croak_xs_usage(cv, "$key, $flags");
1408 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1415 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1416 ret = CALLREG_NAMED_BUFF_EXISTS(rx, ST(1), flags);
1425 XS(XS_Tie_Hash_NamedCapture_FIRSTK)
1434 croak_xs_usage(cv, "");
1436 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1443 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1444 ret = CALLREG_NAMED_BUFF_FIRSTKEY(rx, flags);
1457 XS(XS_Tie_Hash_NamedCapture_NEXTK)
1466 croak_xs_usage(cv, "$lastkey");
1468 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1475 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1476 ret = CALLREG_NAMED_BUFF_NEXTKEY(rx, ST(1), flags);
1488 XS(XS_Tie_Hash_NamedCapture_SCALAR)
1497 croak_xs_usage(cv, "");
1499 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1506 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1507 ret = CALLREG_NAMED_BUFF_SCALAR(rx, flags);
1520 XS(XS_Tie_Hash_NamedCapture_flags)
1526 croak_xs_usage(cv, "");
1528 mXPUSHu(RXapif_ONE);
1529 mXPUSHu(RXapif_ALL);
1537 * c-indentation-style: bsd
1539 * indent-tabs-mode: t
1542 * ex: set ts=8 sts=4 sw=4 noet: