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 ((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);
70 if(name_stash == basestash || strEQ(name, SvPVX(basename_sv)))
78 =head1 SV Manipulation Functions
80 =for apidoc sv_derived_from
82 Returns a boolean indicating whether the SV is derived from the specified class
83 I<at the C level>. To check derivation at the Perl level, call C<isa()> as a
90 Perl_sv_derived_from(pTHX_ SV *sv, const char *const name)
95 PERL_ARGS_ASSERT_SV_DERIVED_FROM;
102 type = sv_reftype(sv,0);
103 if (type && strEQ(type,name))
105 stash = SvOBJECT(sv) ? SvSTASH(sv) : NULL;
108 stash = gv_stashsv(sv, 0);
111 return stash ? isa_lookup(stash, name) : FALSE;
117 Returns a boolean indicating whether the SV performs a specific, named role.
118 The SV can be a Perl object or the name of a Perl class.
126 Perl_sv_does(pTHX_ SV *sv, const char *const name)
128 const char *classname;
133 PERL_ARGS_ASSERT_SV_DOES;
140 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
141 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
144 if (sv_isobject(sv)) {
145 classname = sv_reftype(SvRV(sv),TRUE);
147 classname = SvPV_nolen(sv);
150 if (strEQ(name,classname))
155 mXPUSHs(newSVpv(name, 0));
158 methodname = newSVpvs_flags("isa", SVs_TEMP);
159 /* ugly hack: use the SvSCREAM flag so S_method_common
160 * can figure out we're calling DOES() and not isa(),
161 * and report eventual errors correctly. --rgs */
162 SvSCREAM_on(methodname);
163 call_sv(methodname, G_SCALAR | G_METHOD);
166 does_it = SvTRUE( TOPs );
173 PERL_XS_EXPORT_C void XS_UNIVERSAL_isa(pTHX_ CV *cv);
174 PERL_XS_EXPORT_C void XS_UNIVERSAL_can(pTHX_ CV *cv);
175 PERL_XS_EXPORT_C void XS_UNIVERSAL_DOES(pTHX_ CV *cv);
176 PERL_XS_EXPORT_C void XS_UNIVERSAL_VERSION(pTHX_ CV *cv);
178 XS(XS_version_stringify);
179 XS(XS_version_numify);
180 XS(XS_version_normal);
182 XS(XS_version_boolean);
183 #ifdef HASATTRIBUTE_NORETURN
184 XS(XS_version_noop) __attribute__noreturn__;
188 XS(XS_version_is_alpha);
195 XS(XS_utf8_downgrade);
196 XS(XS_utf8_unicode_to_native);
197 XS(XS_utf8_native_to_unicode);
198 XS(XS_Internals_SvREADONLY);
199 XS(XS_Internals_SvREFCNT);
200 XS(XS_Internals_hv_clear_placehold);
201 XS(XS_PerlIO_get_layers);
202 XS(XS_Regexp_DESTROY);
203 XS(XS_Internals_hash_seed);
204 XS(XS_Internals_rehash_seed);
205 XS(XS_Internals_HvREHASH);
206 XS(XS_Internals_inc_sub_generation);
210 XS(XS_re_regnames_count);
211 XS(XS_re_regexp_pattern);
212 XS(XS_Tie_Hash_NamedCapture_FETCH);
213 XS(XS_Tie_Hash_NamedCapture_STORE);
214 XS(XS_Tie_Hash_NamedCapture_DELETE);
215 XS(XS_Tie_Hash_NamedCapture_CLEAR);
216 XS(XS_Tie_Hash_NamedCapture_EXISTS);
217 XS(XS_Tie_Hash_NamedCapture_FIRSTK);
218 XS(XS_Tie_Hash_NamedCapture_NEXTK);
219 XS(XS_Tie_Hash_NamedCapture_SCALAR);
220 XS(XS_Tie_Hash_NamedCapture_flags);
223 Perl_boot_core_UNIVERSAL(pTHX)
226 static const char file[] = __FILE__;
228 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
229 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
230 newXS("UNIVERSAL::DOES", XS_UNIVERSAL_DOES, file);
231 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
233 /* register the overloading (type 'A') magic */
234 PL_amagic_generation++;
235 /* Make it findable via fetchmethod */
236 newXS("version::()", XS_version_noop, file);
237 newXS("version::new", XS_version_new, file);
238 newXS("version::(\"\"", XS_version_stringify, file);
239 newXS("version::stringify", XS_version_stringify, file);
240 newXS("version::(0+", XS_version_numify, file);
241 newXS("version::numify", XS_version_numify, file);
242 newXS("version::normal", XS_version_normal, file);
243 newXS("version::(cmp", XS_version_vcmp, file);
244 newXS("version::(<=>", XS_version_vcmp, file);
245 newXS("version::vcmp", XS_version_vcmp, file);
246 newXS("version::(bool", XS_version_boolean, file);
247 newXS("version::boolean", XS_version_boolean, file);
248 newXS("version::(nomethod", XS_version_noop, file);
249 newXS("version::noop", XS_version_noop, file);
250 newXS("version::is_alpha", XS_version_is_alpha, file);
251 newXS("version::qv", XS_version_qv, file);
253 newXS("utf8::is_utf8", XS_utf8_is_utf8, file);
254 newXS("utf8::valid", XS_utf8_valid, file);
255 newXS("utf8::encode", XS_utf8_encode, file);
256 newXS("utf8::decode", XS_utf8_decode, file);
257 newXS("utf8::upgrade", XS_utf8_upgrade, file);
258 newXS("utf8::downgrade", XS_utf8_downgrade, file);
259 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
260 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
261 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
262 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
263 newXSproto("Internals::hv_clear_placeholders",
264 XS_Internals_hv_clear_placehold, file, "\\%");
265 newXSproto("PerlIO::get_layers",
266 XS_PerlIO_get_layers, file, "*;@");
267 newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
268 newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
269 newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, "");
270 newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
271 newXSproto("re::is_regexp", XS_re_is_regexp, file, "$");
272 newXSproto("re::regname", XS_re_regname, file, ";$$");
273 newXSproto("re::regnames", XS_re_regnames, file, ";$");
274 newXSproto("re::regnames_count", XS_re_regnames_count, file, "");
275 newXSproto("re::regexp_pattern", XS_re_regexp_pattern, file, "$");
276 newXS("Tie::Hash::NamedCapture::FETCH", XS_Tie_Hash_NamedCapture_FETCH, file);
277 newXS("Tie::Hash::NamedCapture::STORE", XS_Tie_Hash_NamedCapture_STORE, file);
278 newXS("Tie::Hash::NamedCapture::DELETE", XS_Tie_Hash_NamedCapture_DELETE, file);
279 newXS("Tie::Hash::NamedCapture::CLEAR", XS_Tie_Hash_NamedCapture_CLEAR, file);
280 newXS("Tie::Hash::NamedCapture::EXISTS", XS_Tie_Hash_NamedCapture_EXISTS, file);
281 newXS("Tie::Hash::NamedCapture::FIRSTKEY", XS_Tie_Hash_NamedCapture_FIRSTK, file);
282 newXS("Tie::Hash::NamedCapture::NEXTKEY", XS_Tie_Hash_NamedCapture_NEXTK, file);
283 newXS("Tie::Hash::NamedCapture::SCALAR", XS_Tie_Hash_NamedCapture_SCALAR, file);
284 newXS("Tie::Hash::NamedCapture::flags", XS_Tie_Hash_NamedCapture_flags, file);
288 =for apidoc croak_xs_usage
290 A specialised variant of C<croak()> for emitting the usage message for xsubs
292 croak_xs_usage(cv, "eee_yow");
294 works out the package name and subroutine name from C<cv>, and then calls
295 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
297 Perl_croak(aTHX_ "Usage %s::%s(%s)", "ouch" "awk", "eee_yow");
303 Perl_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
305 const GV *const gv = CvGV(cv);
307 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
310 const char *const gvname = GvNAME(gv);
311 const HV *const stash = GvSTASH(gv);
312 const char *const hvname = stash ? HvNAME_get(stash) : NULL;
315 Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params);
317 Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params);
319 /* Pants. I don't think that it should be possible to get here. */
320 Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
330 croak_xs_usage(cv, "reference, kind");
332 SV * const sv = ST(0);
337 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
338 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
341 name = SvPV_nolen_const(ST(1));
343 ST(0) = boolSV(sv_derived_from(sv, name));
358 croak_xs_usage(cv, "object-ref, method");
364 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
365 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
368 name = SvPV_nolen_const(ST(1));
377 pkg = gv_stashsv(sv, 0);
381 GV * const gv = gv_fetchmethod_autoload(pkg, name, FALSE);
383 rv = sv_2mortal(newRV((SV*)GvCV(gv)));
390 XS(XS_UNIVERSAL_DOES)
397 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
399 SV * const sv = ST(0);
402 name = SvPV_nolen_const(ST(1));
403 if (sv_does( sv, name ))
410 XS(XS_UNIVERSAL_VERSION)
422 sv = (SV*)SvRV(ST(0));
424 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
428 pkg = gv_stashsv(ST(0), 0);
431 gvp = pkg ? (GV**)hv_fetchs(pkg, "VERSION", FALSE) : NULL;
433 if (gvp && isGV(gv = *gvp) && (sv = GvSV(gv)) && SvOK(sv)) {
434 SV * const nsv = sv_newmortal();
437 if ( !sv_derived_from(sv, "version"))
438 upg_version(sv, FALSE);
442 sv = (SV*)&PL_sv_undef;
451 const char * const name = HvNAME_get(pkg);
453 "%s does not define $%s::VERSION--version check failed",
457 "%s defines neither package nor VERSION--version check failed",
458 SvPVx_nolen_const(ST(0)) );
462 if ( !sv_derived_from(req, "version")) {
463 /* req may very well be R/O, so create a new object */
464 req = sv_2mortal( new_version(req) );
467 if ( vcmp( req, sv ) > 0 ) {
468 if ( hv_exists((HV*)SvRV(req), "qv", 2 ) ) {
469 Perl_croak(aTHX_ "%s version %"SVf" required--"
470 "this is only version %"SVf"", HvNAME_get(pkg),
471 SVfARG(vnormal(req)),
472 SVfARG(vnormal(sv)));
474 Perl_croak(aTHX_ "%s version %"SVf" required--"
475 "this is only version %"SVf"", HvNAME_get(pkg),
476 SVfARG(vstringify(req)),
477 SVfARG(vstringify(sv)));
483 if ( SvOK(sv) && sv_derived_from(sv, "version") ) {
484 ST(0) = vstringify(sv);
497 croak_xs_usage(cv, "class, version");
502 const char * const classname =
503 sv_isobject(ST(0)) /* get the class if called as an object method */
504 ? HvNAME(SvSTASH(SvRV(ST(0))))
505 : (char *)SvPV_nolen(ST(0));
507 if ( items == 1 || vs == &PL_sv_undef ) { /* no param or explicit undef */
508 /* create empty object */
512 else if ( items == 3 ) {
514 Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
517 rv = new_version(vs);
518 if ( strcmp(classname,"version") != 0 ) /* inherited new() */
519 sv_bless(rv, gv_stashpv(classname, GV_ADD));
527 XS(XS_version_stringify)
532 croak_xs_usage(cv, "lobj, ...");
537 if (sv_derived_from(ST(0), "version")) {
541 Perl_croak(aTHX_ "lobj is not of type version");
543 mPUSHs(vstringify(lobj));
550 XS(XS_version_numify)
555 croak_xs_usage(cv, "lobj, ...");
560 if (sv_derived_from(ST(0), "version")) {
564 Perl_croak(aTHX_ "lobj is not of type version");
566 mPUSHs(vnumify(lobj));
573 XS(XS_version_normal)
578 croak_xs_usage(cv, "lobj, ...");
583 if (sv_derived_from(ST(0), "version")) {
587 Perl_croak(aTHX_ "lobj is not of type version");
589 mPUSHs(vnormal(lobj));
601 croak_xs_usage(cv, "lobj, ...");
606 if (sv_derived_from(ST(0), "version")) {
610 Perl_croak(aTHX_ "lobj is not of type version");
616 const IV swap = (IV)SvIV(ST(2));
618 if ( ! sv_derived_from(robj, "version") )
620 robj = new_version(robj);
626 rs = newSViv(vcmp(rvs,lobj));
630 rs = newSViv(vcmp(lobj,rvs));
641 XS(XS_version_boolean)
646 croak_xs_usage(cv, "lobj, ...");
648 if (sv_derived_from(ST(0), "version")) {
649 SV * const lobj = SvRV(ST(0));
650 SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) );
656 Perl_croak(aTHX_ "lobj is not of type version");
664 croak_xs_usage(cv, "lobj, ...");
665 if (sv_derived_from(ST(0), "version"))
666 Perl_croak(aTHX_ "operation not supported with version object");
668 Perl_croak(aTHX_ "lobj is not of type version");
669 #ifndef HASATTRIBUTE_NORETURN
674 XS(XS_version_is_alpha)
679 croak_xs_usage(cv, "lobj");
681 if (sv_derived_from(ST(0), "version")) {
682 SV * const lobj = ST(0);
683 if ( hv_exists((HV*)SvRV(lobj), "alpha", 5 ) )
691 Perl_croak(aTHX_ "lobj is not of type version");
699 croak_xs_usage(cv, "ver");
703 if ( !SvVOK(ver) ) { /* only need to do with if not already v-string */
704 SV * const rv = sv_newmortal();
705 sv_setsv(rv,ver); /* make a duplicate */
706 upg_version(rv, TRUE);
711 mPUSHs(new_version(ver));
724 croak_xs_usage(cv, "sv");
726 const SV * const sv = ST(0);
740 croak_xs_usage(cv, "sv");
742 SV * const sv = ST(0);
744 const char * const s = SvPV_const(sv,len);
745 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
758 croak_xs_usage(cv, "sv");
759 sv_utf8_encode(ST(0));
768 croak_xs_usage(cv, "sv");
770 SV * const sv = ST(0);
771 const bool RETVAL = sv_utf8_decode(sv);
772 ST(0) = boolSV(RETVAL);
783 croak_xs_usage(cv, "sv");
785 SV * const sv = ST(0);
789 RETVAL = sv_utf8_upgrade(sv);
790 XSprePUSH; PUSHi((IV)RETVAL);
795 XS(XS_utf8_downgrade)
799 if (items < 1 || items > 2)
800 croak_xs_usage(cv, "sv, failok=0");
802 SV * const sv = ST(0);
803 const bool failok = (items < 2) ? 0 : (int)SvIV(ST(1));
804 const bool RETVAL = sv_utf8_downgrade(sv, failok);
806 ST(0) = boolSV(RETVAL);
812 XS(XS_utf8_native_to_unicode)
816 const UV uv = SvUV(ST(0));
819 croak_xs_usage(cv, "sv");
821 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
825 XS(XS_utf8_unicode_to_native)
829 const UV uv = SvUV(ST(0));
832 croak_xs_usage(cv, "sv");
834 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
838 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
842 SV * const sv = SvRV(ST(0));
851 else if (items == 2) {
857 /* I hope you really know what you are doing. */
862 XSRETURN_UNDEF; /* Can't happen. */
865 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
869 SV * const sv = SvRV(ST(0));
873 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
874 else if (items == 2) {
875 /* I hope you really know what you are doing. */
876 SvREFCNT(sv) = SvIV(ST(1));
877 XSRETURN_IV(SvREFCNT(sv));
879 XSRETURN_UNDEF; /* Can't happen. */
882 XS(XS_Internals_hv_clear_placehold)
888 croak_xs_usage(cv, "hv");
890 HV * const hv = (HV *) SvRV(ST(0));
891 hv_clear_placeholders(hv);
896 XS(XS_Regexp_DESTROY)
902 XS(XS_PerlIO_get_layers)
906 if (items < 1 || items % 2 == 0)
907 croak_xs_usage(cv, "filehandle[,args]");
914 bool details = FALSE;
918 for (svp = MARK + 2; svp <= SP; svp += 2) {
919 SV * const * const varp = svp;
920 SV * const * const valp = svp + 1;
922 const char * const key = SvPV_const(*varp, klen);
926 if (klen == 5 && memEQ(key, "input", 5)) {
927 input = SvTRUE(*valp);
932 if (klen == 6 && memEQ(key, "output", 6)) {
933 input = !SvTRUE(*valp);
938 if (klen == 7 && memEQ(key, "details", 7)) {
939 details = SvTRUE(*valp);
946 "get_layers: unknown argument '%s'",
958 if (SvROK(sv) && isGV(SvRV(sv)))
961 gv = gv_fetchsv(sv, 0, SVt_PVIO);
964 if (gv && (io = GvIO(gv))) {
965 AV* const av = PerlIO_get_layers(aTHX_ input ?
966 IoIFP(io) : IoOFP(io));
968 const I32 last = av_len(av);
971 for (i = last; i >= 0; i -= 3) {
972 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
973 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
974 SV * const * const flgsvp = av_fetch(av, i, FALSE);
976 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
977 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
978 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
981 /* Indents of 5? Yuck. */
982 /* We know that PerlIO_get_layers creates a new SV for
983 the name and flags, so we can just take a reference
984 and "steal" it when we free the AV below. */
986 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
989 ? newSVpvn_flags(SvPVX_const(*argsvp),
991 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
995 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
1001 XPUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
1005 XPUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
1007 XPUSHs(&PL_sv_undef);
1010 const IV flags = SvIVX(*flgsvp);
1012 if (flags & PERLIO_F_UTF8) {
1013 XPUSHs(newSVpvs_flags("utf8", SVs_TEMP));
1030 XS(XS_Internals_hash_seed)
1033 /* Using dXSARGS would also have dITEM and dSP,
1034 * which define 2 unused local variables. */
1036 PERL_UNUSED_ARG(cv);
1037 PERL_UNUSED_VAR(mark);
1038 XSRETURN_UV(PERL_HASH_SEED);
1041 XS(XS_Internals_rehash_seed)
1044 /* Using dXSARGS would also have dITEM and dSP,
1045 * which define 2 unused local variables. */
1047 PERL_UNUSED_ARG(cv);
1048 PERL_UNUSED_VAR(mark);
1049 XSRETURN_UV(PL_rehash_seed);
1052 XS(XS_Internals_HvREHASH) /* Subject to change */
1056 PERL_UNUSED_ARG(cv);
1058 const HV * const hv = (HV *) SvRV(ST(0));
1059 if (items == 1 && SvTYPE(hv) == SVt_PVHV) {
1066 Perl_croak(aTHX_ "Internals::HvREHASH $hashref");
1073 PERL_UNUSED_VAR(cv);
1076 croak_xs_usage(cv, "sv");
1080 if (SvRXOK(ST(0))) {
1087 XS(XS_re_regnames_count)
1089 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1095 croak_xs_usage(cv, "");
1102 ret = CALLREG_NAMED_BUFF_COUNT(rx);
1123 if (items < 1 || items > 2)
1124 croak_xs_usage(cv, "name[, all ]");
1128 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1133 if (items == 2 && SvTRUE(ST(1))) {
1138 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
1161 croak_xs_usage(cv, "[all]");
1163 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1168 if (items == 1 && SvTRUE(ST(0))) {
1176 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
1185 av = (AV*)SvRV(ret);
1186 length = av_len(av);
1188 for (i = 0; i <= length; i++) {
1189 entry = av_fetch(av, i, FALSE);
1192 Perl_croak(aTHX_ "NULL array element in re::regnames()");
1194 mXPUSHs(SvREFCNT_inc_simple_NN(*entry));
1203 XS(XS_re_regexp_pattern)
1210 croak_xs_usage(cv, "sv");
1215 Checks if a reference is a regex or not. If the parameter is
1216 not a ref, or is not the result of a qr// then returns false
1217 in scalar context and an empty list in list context.
1218 Otherwise in list context it returns the pattern and the
1219 modifiers, in scalar context it returns the pattern just as it
1220 would if the qr// was stringified normally, regardless as
1221 to the class of the variable and any strigification overloads
1225 if ((re = SvRX(ST(0)))) /* assign deliberate */
1227 /* Housten, we have a regex! */
1232 if ( GIMME_V == G_ARRAY ) {
1234 we are in list context so stringify
1235 the modifiers that apply. We ignore "negative
1236 modifiers" in this scenario.
1239 const char *fptr = INT_PAT_MODS;
1241 U16 match_flags = (U16)((RX_EXTFLAGS(re) & PMf_COMPILETIME)
1242 >> RXf_PMf_STD_PMMOD_SHIFT);
1244 while((ch = *fptr++)) {
1245 if(match_flags & 1) {
1246 reflags[left++] = ch;
1251 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
1252 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1254 /* return the pattern and the modifiers */
1256 XPUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
1259 /* Scalar, so use the string that Perl would return */
1260 /* return the pattern in (?msix:..) format */
1261 #if PERL_VERSION >= 11
1262 pattern = sv_2mortal(newSVsv((SV*)re));
1264 pattern = newSVpvn_flags(RX_WRAPPED(re), RX_WRAPLEN(re),
1265 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1271 /* It ain't a regexp folks */
1272 if ( GIMME_V == G_ARRAY ) {
1273 /* return the empty list */
1276 /* Because of the (?:..) wrapping involved in a
1277 stringified pattern it is impossible to get a
1278 result for a real regexp that would evaluate to
1279 false. Therefore we can return PL_sv_no to signify
1280 that the object is not a regex, this means that one
1283 if (regex($might_be_a_regex) eq '(?:foo)') { }
1285 and not worry about undefined values.
1293 XS(XS_Tie_Hash_NamedCapture_FETCH)
1302 croak_xs_usage(cv, "$key, $flags");
1304 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1311 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1312 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(1), flags);
1324 XS(XS_Tie_Hash_NamedCapture_STORE)
1332 croak_xs_usage(cv, "$key, $value, $flags");
1334 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1338 Perl_croak(aTHX_ PL_no_modify);
1345 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1346 CALLREG_NAMED_BUFF_STORE(rx,ST(1), ST(2), flags);
1349 XS(XS_Tie_Hash_NamedCapture_DELETE)
1353 REGEXP * rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1357 croak_xs_usage(cv, "$key, $flags");
1360 Perl_croak(aTHX_ PL_no_modify);
1364 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1365 CALLREG_NAMED_BUFF_DELETE(rx, ST(1), flags);
1368 XS(XS_Tie_Hash_NamedCapture_CLEAR)
1376 croak_xs_usage(cv, "$flags");
1378 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1381 Perl_croak(aTHX_ PL_no_modify);
1385 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1386 CALLREG_NAMED_BUFF_CLEAR(rx, flags);
1389 XS(XS_Tie_Hash_NamedCapture_EXISTS)
1398 croak_xs_usage(cv, "$key, $flags");
1400 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1407 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1408 ret = CALLREG_NAMED_BUFF_EXISTS(rx, ST(1), flags);
1417 XS(XS_Tie_Hash_NamedCapture_FIRSTK)
1426 croak_xs_usage(cv, "");
1428 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1435 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1436 ret = CALLREG_NAMED_BUFF_FIRSTKEY(rx, flags);
1449 XS(XS_Tie_Hash_NamedCapture_NEXTK)
1458 croak_xs_usage(cv, "$lastkey");
1460 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1467 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1468 ret = CALLREG_NAMED_BUFF_NEXTKEY(rx, ST(1), flags);
1480 XS(XS_Tie_Hash_NamedCapture_SCALAR)
1489 croak_xs_usage(cv, "");
1491 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1498 flags = (U32)INT2PTR(IV,SvIV(SvRV((SV*)ST(0))));
1499 ret = CALLREG_NAMED_BUFF_SCALAR(rx, flags);
1512 XS(XS_Tie_Hash_NamedCapture_flags)
1518 croak_xs_usage(cv, "");
1520 mXPUSHu(RXapif_ONE);
1521 mXPUSHu(RXapif_ALL);
1529 * c-indentation-style: bsd
1531 * indent-tabs-mode: t
1534 * ex: set ts=8 sts=4 sw=4 noet: