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 seperate 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 S_get_isa_hash(pTHX_ HV *const stash)
40 struct mro_meta *const meta = HvMROMETA(stash);
42 PERL_ARGS_ASSERT_GET_ISA_HASH;
45 AV *const isa = mro_get_linear_isa(stash);
47 HV *const isa_hash = newHV();
48 /* Linearisation didn't build it for us, so do it here. */
49 SV *const *svp = AvARRAY(isa);
50 SV *const *const svp_end = svp + AvFILLp(isa) + 1;
51 const HEK *const canon_name = HvNAME_HEK(stash);
53 while (svp < svp_end) {
54 (void) hv_store_ent(isa_hash, *svp++, &PL_sv_undef, 0);
57 (void) hv_common(isa_hash, NULL, HEK_KEY(canon_name),
58 HEK_LEN(canon_name), HEK_FLAGS(canon_name),
59 HV_FETCH_ISSTORE, &PL_sv_undef,
60 HEK_HASH(canon_name));
61 (void) hv_store(isa_hash, "UNIVERSAL", 9, &PL_sv_undef, 0);
63 SvREADONLY_on(isa_hash);
72 * Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
73 * The main guts of traverse_isa was actually copied from gv_fetchmeth
77 S_isa_lookup(pTHX_ HV *stash, const char * const name)
80 const struct mro_meta *const meta = HvMROMETA(stash);
81 HV *const isa = meta->isa ? meta->isa : S_get_isa_hash(aTHX_ stash);
82 STRLEN len = strlen(name);
85 PERL_ARGS_ASSERT_ISA_LOOKUP;
87 if (hv_common(isa, NULL, name, len, 0 /* No "UTF-8" flag possible with only
89 HV_FETCH_ISEXISTS, NULL, 0)) {
90 /* Direct name lookup worked. */
94 /* A stash/class can go by many names (ie. User == main::User), so
95 we use the name in the stash itself, which is canonical. */
96 our_stash = gv_stashpvn(name, len, 0);
99 HEK *const canon_name = HvNAME_HEK(our_stash);
101 if (hv_common(isa, NULL, HEK_KEY(canon_name), HEK_LEN(canon_name),
102 HEK_FLAGS(canon_name),
103 HV_FETCH_ISEXISTS, NULL, HEK_HASH(canon_name))) {
112 =head1 SV Manipulation Functions
114 =for apidoc sv_derived_from
116 Returns a boolean indicating whether the SV is derived from the specified class
117 I<at the C level>. To check derivation at the Perl level, call C<isa()> as a
124 Perl_sv_derived_from(pTHX_ SV *sv, const char *const name)
129 PERL_ARGS_ASSERT_SV_DERIVED_FROM;
136 type = sv_reftype(sv,0);
137 if (type && strEQ(type,name))
139 stash = SvOBJECT(sv) ? SvSTASH(sv) : NULL;
142 stash = gv_stashsv(sv, 0);
145 return stash ? isa_lookup(stash, name) : FALSE;
151 Returns a boolean indicating whether the SV performs a specific, named role.
152 The SV can be a Perl object or the name of a Perl class.
160 Perl_sv_does(pTHX_ SV *sv, const char *const name)
162 const char *classname;
167 PERL_ARGS_ASSERT_SV_DOES;
174 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
175 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv)))) {
180 if (sv_isobject(sv)) {
181 classname = sv_reftype(SvRV(sv),TRUE);
183 classname = SvPV_nolen(sv);
186 if (strEQ(name,classname)) {
193 mXPUSHs(newSVpv(name, 0));
196 methodname = newSVpvs_flags("isa", SVs_TEMP);
197 /* ugly hack: use the SvSCREAM flag so S_method_common
198 * can figure out we're calling DOES() and not isa(),
199 * and report eventual errors correctly. --rgs */
200 SvSCREAM_on(methodname);
201 call_sv(methodname, G_SCALAR | G_METHOD);
204 does_it = SvTRUE( TOPs );
211 PERL_XS_EXPORT_C void XS_UNIVERSAL_isa(pTHX_ CV *cv);
212 PERL_XS_EXPORT_C void XS_UNIVERSAL_can(pTHX_ CV *cv);
213 PERL_XS_EXPORT_C void XS_UNIVERSAL_DOES(pTHX_ CV *cv);
214 PERL_XS_EXPORT_C void XS_UNIVERSAL_VERSION(pTHX_ CV *cv);
216 XS(XS_version_stringify);
217 XS(XS_version_numify);
218 XS(XS_version_normal);
220 XS(XS_version_boolean);
221 #ifdef HASATTRIBUTE_NORETURN
222 XS(XS_version_noop) __attribute__noreturn__;
226 XS(XS_version_is_alpha);
228 XS(XS_version_is_qv);
234 XS(XS_utf8_downgrade);
235 XS(XS_utf8_unicode_to_native);
236 XS(XS_utf8_native_to_unicode);
237 XS(XS_Internals_SvREADONLY);
238 XS(XS_Internals_SvREFCNT);
239 XS(XS_Internals_hv_clear_placehold);
240 XS(XS_PerlIO_get_layers);
241 XS(XS_Internals_hash_seed);
242 XS(XS_Internals_rehash_seed);
243 XS(XS_Internals_HvREHASH);
247 XS(XS_re_regnames_count);
248 XS(XS_re_regexp_pattern);
249 XS(XS_Tie_Hash_NamedCapture_FETCH);
250 XS(XS_Tie_Hash_NamedCapture_STORE);
251 XS(XS_Tie_Hash_NamedCapture_DELETE);
252 XS(XS_Tie_Hash_NamedCapture_CLEAR);
253 XS(XS_Tie_Hash_NamedCapture_EXISTS);
254 XS(XS_Tie_Hash_NamedCapture_FIRSTK);
255 XS(XS_Tie_Hash_NamedCapture_NEXTK);
256 XS(XS_Tie_Hash_NamedCapture_SCALAR);
257 XS(XS_Tie_Hash_NamedCapture_flags);
260 Perl_boot_core_UNIVERSAL(pTHX)
263 static const char file[] = __FILE__;
265 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
266 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
267 newXS("UNIVERSAL::DOES", XS_UNIVERSAL_DOES, file);
268 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
270 /* register the overloading (type 'A') magic */
271 PL_amagic_generation++;
272 /* Make it findable via fetchmethod */
273 newXS("version::()", XS_version_noop, file);
274 newXS("version::new", XS_version_new, file);
275 newXS("version::parse", XS_version_new, file);
276 newXS("version::(\"\"", XS_version_stringify, file);
277 newXS("version::stringify", XS_version_stringify, file);
278 newXS("version::(0+", XS_version_numify, file);
279 newXS("version::numify", XS_version_numify, file);
280 newXS("version::normal", XS_version_normal, file);
281 newXS("version::(cmp", XS_version_vcmp, file);
282 newXS("version::(<=>", XS_version_vcmp, file);
283 newXS("version::vcmp", XS_version_vcmp, file);
284 newXS("version::(bool", XS_version_boolean, file);
285 newXS("version::boolean", XS_version_boolean, file);
286 newXS("version::(nomethod", XS_version_noop, file);
287 newXS("version::noop", XS_version_noop, file);
288 newXS("version::is_alpha", XS_version_is_alpha, file);
289 newXS("version::qv", XS_version_qv, file);
290 newXS("version::declare", XS_version_qv, file);
291 newXS("version::is_qv", XS_version_is_qv, file);
293 newXS("utf8::is_utf8", XS_utf8_is_utf8, file);
294 newXS("utf8::valid", XS_utf8_valid, file);
295 newXS("utf8::encode", XS_utf8_encode, file);
296 newXS("utf8::decode", XS_utf8_decode, file);
297 newXS("utf8::upgrade", XS_utf8_upgrade, file);
298 newXS("utf8::downgrade", XS_utf8_downgrade, file);
299 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
300 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
301 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
302 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
303 newXSproto("Internals::hv_clear_placeholders",
304 XS_Internals_hv_clear_placehold, file, "\\%");
305 newXSproto("PerlIO::get_layers",
306 XS_PerlIO_get_layers, file, "*;@");
307 /* Providing a Regexp::DESTROY fixes #21347. See test in t/op/ref.t */
308 CvFILE(newCONSTSUB(get_hv("Regexp::", GV_ADD), "DESTROY", NULL))
310 newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
311 newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, "");
312 newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
313 newXSproto("re::is_regexp", XS_re_is_regexp, file, "$");
314 newXSproto("re::regname", XS_re_regname, file, ";$$");
315 newXSproto("re::regnames", XS_re_regnames, file, ";$");
316 newXSproto("re::regnames_count", XS_re_regnames_count, file, "");
317 newXSproto("re::regexp_pattern", XS_re_regexp_pattern, file, "$");
318 newXS("Tie::Hash::NamedCapture::FETCH", XS_Tie_Hash_NamedCapture_FETCH, file);
319 newXS("Tie::Hash::NamedCapture::STORE", XS_Tie_Hash_NamedCapture_STORE, file);
320 newXS("Tie::Hash::NamedCapture::DELETE", XS_Tie_Hash_NamedCapture_DELETE, file);
321 newXS("Tie::Hash::NamedCapture::CLEAR", XS_Tie_Hash_NamedCapture_CLEAR, file);
322 newXS("Tie::Hash::NamedCapture::EXISTS", XS_Tie_Hash_NamedCapture_EXISTS, file);
323 newXS("Tie::Hash::NamedCapture::FIRSTKEY", XS_Tie_Hash_NamedCapture_FIRSTK, file);
324 newXS("Tie::Hash::NamedCapture::NEXTKEY", XS_Tie_Hash_NamedCapture_NEXTK, file);
325 newXS("Tie::Hash::NamedCapture::SCALAR", XS_Tie_Hash_NamedCapture_SCALAR, file);
326 newXS("Tie::Hash::NamedCapture::flags", XS_Tie_Hash_NamedCapture_flags, file);
330 =for apidoc croak_xs_usage
332 A specialised variant of C<croak()> for emitting the usage message for xsubs
334 croak_xs_usage(cv, "eee_yow");
336 works out the package name and subroutine name from C<cv>, and then calls
337 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
339 Perl_croak(aTHX_ "Usage %s::%s(%s)", "ouch" "awk", "eee_yow");
345 Perl_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
347 const GV *const gv = CvGV(cv);
349 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
352 const char *const gvname = GvNAME(gv);
353 const HV *const stash = GvSTASH(gv);
354 const char *const hvname = stash ? HvNAME_get(stash) : NULL;
357 Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params);
359 Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params);
361 /* Pants. I don't think that it should be possible to get here. */
362 Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
372 croak_xs_usage(cv, "reference, kind");
374 SV * const sv = ST(0);
379 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
380 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
383 name = SvPV_nolen_const(ST(1));
385 ST(0) = boolSV(sv_derived_from(sv, name));
400 croak_xs_usage(cv, "object-ref, method");
406 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
407 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
410 name = SvPV_nolen_const(ST(1));
414 sv = MUTABLE_SV(SvRV(sv));
419 pkg = gv_stashsv(sv, 0);
423 GV * const gv = gv_fetchmethod_autoload(pkg, name, FALSE);
425 rv = sv_2mortal(newRV(MUTABLE_SV(GvCV(gv))));
432 XS(XS_UNIVERSAL_DOES)
439 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
441 SV * const sv = ST(0);
444 name = SvPV_nolen_const(ST(1));
445 if (sv_does( sv, name ))
452 XS(XS_UNIVERSAL_VERSION)
464 sv = MUTABLE_SV(SvRV(ST(0)));
466 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
470 pkg = gv_stashsv(ST(0), 0);
473 gvp = pkg ? (GV**)hv_fetchs(pkg, "VERSION", FALSE) : NULL;
475 if (gvp && isGV(gv = *gvp) && (sv = GvSV(gv)) && SvOK(sv)) {
476 SV * const nsv = sv_newmortal();
479 if ( !sv_derived_from(sv, "version"))
480 upg_version(sv, FALSE);
493 const char * const name = HvNAME_get(pkg);
495 "%s does not define $%s::VERSION--version check failed",
499 "%s defines neither package nor VERSION--version check failed",
500 SvPVx_nolen_const(ST(0)) );
504 if ( !sv_derived_from(req, "version")) {
505 /* req may very well be R/O, so create a new object */
506 req = sv_2mortal( new_version(req) );
509 if ( vcmp( req, sv ) > 0 ) {
510 if ( hv_exists(MUTABLE_HV(SvRV(req)), "qv", 2 ) ) {
511 Perl_croak(aTHX_ "%s version %"SVf" required--"
512 "this is only version %"SVf"", HvNAME_get(pkg),
513 SVfARG(vnormal(req)),
514 SVfARG(vnormal(sv)));
516 Perl_croak(aTHX_ "%s version %"SVf" required--"
517 "this is only version %"SVf"", HvNAME_get(pkg),
518 SVfARG(vstringify(req)),
519 SVfARG(vstringify(sv)));
525 if ( SvOK(sv) && sv_derived_from(sv, "version") ) {
526 ST(0) = vstringify(sv);
539 croak_xs_usage(cv, "class, version");
544 const char * const classname =
545 sv_isobject(ST(0)) /* get the class if called as an object method */
546 ? HvNAME(SvSTASH(SvRV(ST(0))))
547 : (char *)SvPV_nolen(ST(0));
549 if ( items == 1 || vs == &PL_sv_undef ) { /* no param or explicit undef */
550 /* create empty object */
554 else if ( items == 3 ) {
556 Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
559 rv = new_version(vs);
560 if ( strcmp(classname,"version") != 0 ) /* inherited new() */
561 sv_bless(rv, gv_stashpv(classname, GV_ADD));
569 XS(XS_version_stringify)
574 croak_xs_usage(cv, "lobj, ...");
579 if (sv_derived_from(ST(0), "version")) {
583 Perl_croak(aTHX_ "lobj is not of type version");
585 mPUSHs(vstringify(lobj));
592 XS(XS_version_numify)
597 croak_xs_usage(cv, "lobj, ...");
602 if (sv_derived_from(ST(0), "version")) {
606 Perl_croak(aTHX_ "lobj is not of type version");
608 mPUSHs(vnumify(lobj));
615 XS(XS_version_normal)
620 croak_xs_usage(cv, "lobj, ...");
625 if (sv_derived_from(ST(0), "version")) {
629 Perl_croak(aTHX_ "lobj is not of type version");
631 mPUSHs(vnormal(lobj));
643 croak_xs_usage(cv, "lobj, ...");
648 if (sv_derived_from(ST(0), "version")) {
652 Perl_croak(aTHX_ "lobj is not of type version");
658 const IV swap = (IV)SvIV(ST(2));
660 if ( ! sv_derived_from(robj, "version") )
662 robj = new_version(robj);
668 rs = newSViv(vcmp(rvs,lobj));
672 rs = newSViv(vcmp(lobj,rvs));
683 XS(XS_version_boolean)
688 croak_xs_usage(cv, "lobj, ...");
690 if (sv_derived_from(ST(0), "version")) {
691 SV * const lobj = SvRV(ST(0));
692 SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) );
698 Perl_croak(aTHX_ "lobj is not of type version");
706 croak_xs_usage(cv, "lobj, ...");
707 if (sv_derived_from(ST(0), "version"))
708 Perl_croak(aTHX_ "operation not supported with version object");
710 Perl_croak(aTHX_ "lobj is not of type version");
711 #ifndef HASATTRIBUTE_NORETURN
716 XS(XS_version_is_alpha)
721 croak_xs_usage(cv, "lobj");
723 if (sv_derived_from(ST(0), "version")) {
724 SV * const lobj = ST(0);
725 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "alpha", 5 ) )
733 Perl_croak(aTHX_ "lobj is not of type version");
745 const char * classname = "";
746 if ( items == 2 && (ST(1)) != &PL_sv_undef ) {
747 /* getting called as object or class method */
750 sv_isobject(ST(0)) /* class called as an object method */
751 ? HvNAME_get(SvSTASH(SvRV(ST(0))))
752 : (char *)SvPV_nolen(ST(0));
754 if ( !SvVOK(ver) ) { /* not already a v-string */
756 sv_setsv(rv,ver); /* make a duplicate */
757 upg_version(rv, TRUE);
759 rv = sv_2mortal(new_version(ver));
761 if ( items == 2 && strcmp(classname,"version") ) { /* inherited new() */
762 sv_bless(rv, gv_stashpv(classname, GV_ADD));
775 croak_xs_usage(cv, "lobj");
777 if (sv_derived_from(ST(0), "version")) {
778 SV * const lobj = ST(0);
779 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "qv", 2 ) )
787 Perl_croak(aTHX_ "lobj is not of type version");
795 croak_xs_usage(cv, "sv");
797 const SV * const sv = ST(0);
811 croak_xs_usage(cv, "sv");
813 SV * const sv = ST(0);
815 const char * const s = SvPV_const(sv,len);
816 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
829 croak_xs_usage(cv, "sv");
830 sv_utf8_encode(ST(0));
839 croak_xs_usage(cv, "sv");
841 SV * const sv = ST(0);
842 const bool RETVAL = sv_utf8_decode(sv);
843 ST(0) = boolSV(RETVAL);
854 croak_xs_usage(cv, "sv");
856 SV * const sv = ST(0);
860 RETVAL = sv_utf8_upgrade(sv);
861 XSprePUSH; PUSHi((IV)RETVAL);
866 XS(XS_utf8_downgrade)
870 if (items < 1 || items > 2)
871 croak_xs_usage(cv, "sv, failok=0");
873 SV * const sv = ST(0);
874 const bool failok = (items < 2) ? 0 : (int)SvIV(ST(1));
875 const bool RETVAL = sv_utf8_downgrade(sv, failok);
877 ST(0) = boolSV(RETVAL);
883 XS(XS_utf8_native_to_unicode)
887 const UV uv = SvUV(ST(0));
890 croak_xs_usage(cv, "sv");
892 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
896 XS(XS_utf8_unicode_to_native)
900 const UV uv = SvUV(ST(0));
903 croak_xs_usage(cv, "sv");
905 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
909 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
913 SV * const sv = SvRV(ST(0));
922 else if (items == 2) {
928 /* I hope you really know what you are doing. */
933 XSRETURN_UNDEF; /* Can't happen. */
936 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
940 SV * const sv = SvRV(ST(0));
944 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
945 else if (items == 2) {
946 /* I hope you really know what you are doing. */
947 SvREFCNT(sv) = SvIV(ST(1));
948 XSRETURN_IV(SvREFCNT(sv));
950 XSRETURN_UNDEF; /* Can't happen. */
953 XS(XS_Internals_hv_clear_placehold)
959 croak_xs_usage(cv, "hv");
961 HV * const hv = MUTABLE_HV(SvRV(ST(0)));
962 hv_clear_placeholders(hv);
967 XS(XS_PerlIO_get_layers)
971 if (items < 1 || items % 2 == 0)
972 croak_xs_usage(cv, "filehandle[,args]");
979 bool details = FALSE;
983 for (svp = MARK + 2; svp <= SP; svp += 2) {
984 SV * const * const varp = svp;
985 SV * const * const valp = svp + 1;
987 const char * const key = SvPV_const(*varp, klen);
991 if (klen == 5 && memEQ(key, "input", 5)) {
992 input = SvTRUE(*valp);
997 if (klen == 6 && memEQ(key, "output", 6)) {
998 input = !SvTRUE(*valp);
1003 if (klen == 7 && memEQ(key, "details", 7)) {
1004 details = SvTRUE(*valp);
1011 "get_layers: unknown argument '%s'",
1020 gv = MUTABLE_GV(sv);
1023 if (SvROK(sv) && isGV(SvRV(sv)))
1024 gv = MUTABLE_GV(SvRV(sv));
1025 else if (SvPOKp(sv))
1026 gv = gv_fetchsv(sv, 0, SVt_PVIO);
1029 if (gv && (io = GvIO(gv))) {
1030 AV* const av = PerlIO_get_layers(aTHX_ input ?
1031 IoIFP(io) : IoOFP(io));
1033 const I32 last = av_len(av);
1036 for (i = last; i >= 0; i -= 3) {
1037 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
1038 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
1039 SV * const * const flgsvp = av_fetch(av, i, FALSE);
1041 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
1042 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
1043 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
1046 /* Indents of 5? Yuck. */
1047 /* We know that PerlIO_get_layers creates a new SV for
1048 the name and flags, so we can just take a reference
1049 and "steal" it when we free the AV below. */
1051 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
1054 ? newSVpvn_flags(SvPVX_const(*argsvp),
1056 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
1060 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
1066 XPUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
1070 XPUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
1072 XPUSHs(&PL_sv_undef);
1075 const IV flags = SvIVX(*flgsvp);
1077 if (flags & PERLIO_F_UTF8) {
1078 XPUSHs(newSVpvs_flags("utf8", SVs_TEMP));
1095 XS(XS_Internals_hash_seed)
1098 /* Using dXSARGS would also have dITEM and dSP,
1099 * which define 2 unused local variables. */
1101 PERL_UNUSED_ARG(cv);
1102 PERL_UNUSED_VAR(mark);
1103 XSRETURN_UV(PERL_HASH_SEED);
1106 XS(XS_Internals_rehash_seed)
1109 /* Using dXSARGS would also have dITEM and dSP,
1110 * which define 2 unused local variables. */
1112 PERL_UNUSED_ARG(cv);
1113 PERL_UNUSED_VAR(mark);
1114 XSRETURN_UV(PL_rehash_seed);
1117 XS(XS_Internals_HvREHASH) /* Subject to change */
1121 PERL_UNUSED_ARG(cv);
1123 const HV * const hv = (const HV *) SvRV(ST(0));
1124 if (items == 1 && SvTYPE(hv) == SVt_PVHV) {
1131 Perl_croak(aTHX_ "Internals::HvREHASH $hashref");
1138 PERL_UNUSED_VAR(cv);
1141 croak_xs_usage(cv, "sv");
1145 if (SvRXOK(ST(0))) {
1152 XS(XS_re_regnames_count)
1154 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1160 croak_xs_usage(cv, "");
1167 ret = CALLREG_NAMED_BUFF_COUNT(rx);
1188 if (items < 1 || items > 2)
1189 croak_xs_usage(cv, "name[, all ]");
1193 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1198 if (items == 2 && SvTRUE(ST(1))) {
1203 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
1226 croak_xs_usage(cv, "[all]");
1228 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1233 if (items == 1 && SvTRUE(ST(0))) {
1241 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
1250 av = MUTABLE_AV(SvRV(ret));
1251 length = av_len(av);
1253 for (i = 0; i <= length; i++) {
1254 entry = av_fetch(av, i, FALSE);
1257 Perl_croak(aTHX_ "NULL array element in re::regnames()");
1259 mXPUSHs(SvREFCNT_inc_simple_NN(*entry));
1268 XS(XS_re_regexp_pattern)
1275 croak_xs_usage(cv, "sv");
1280 Checks if a reference is a regex or not. If the parameter is
1281 not a ref, or is not the result of a qr// then returns false
1282 in scalar context and an empty list in list context.
1283 Otherwise in list context it returns the pattern and the
1284 modifiers, in scalar context it returns the pattern just as it
1285 would if the qr// was stringified normally, regardless as
1286 to the class of the variable and any strigification overloads
1290 if ((re = SvRX(ST(0)))) /* assign deliberate */
1292 /* Housten, we have a regex! */
1297 if ( GIMME_V == G_ARRAY ) {
1299 we are in list context so stringify
1300 the modifiers that apply. We ignore "negative
1301 modifiers" in this scenario.
1304 const char *fptr = INT_PAT_MODS;
1306 U16 match_flags = (U16)((RX_EXTFLAGS(re) & PMf_COMPILETIME)
1307 >> RXf_PMf_STD_PMMOD_SHIFT);
1309 while((ch = *fptr++)) {
1310 if(match_flags & 1) {
1311 reflags[left++] = ch;
1316 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
1317 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1319 /* return the pattern and the modifiers */
1321 XPUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
1324 /* Scalar, so use the string that Perl would return */
1325 /* return the pattern in (?msix:..) format */
1326 #if PERL_VERSION >= 11
1327 pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));
1329 pattern = newSVpvn_flags(RX_WRAPPED(re), RX_WRAPLEN(re),
1330 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1336 /* It ain't a regexp folks */
1337 if ( GIMME_V == G_ARRAY ) {
1338 /* return the empty list */
1341 /* Because of the (?:..) wrapping involved in a
1342 stringified pattern it is impossible to get a
1343 result for a real regexp that would evaluate to
1344 false. Therefore we can return PL_sv_no to signify
1345 that the object is not a regex, this means that one
1348 if (regex($might_be_a_regex) eq '(?:foo)') { }
1350 and not worry about undefined values.
1358 XS(XS_Tie_Hash_NamedCapture_FETCH)
1367 croak_xs_usage(cv, "$key, $flags");
1369 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1376 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1377 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(1), flags);
1389 XS(XS_Tie_Hash_NamedCapture_STORE)
1397 croak_xs_usage(cv, "$key, $value, $flags");
1399 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1403 Perl_croak(aTHX_ "%s", PL_no_modify);
1410 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1411 CALLREG_NAMED_BUFF_STORE(rx,ST(1), ST(2), flags);
1414 XS(XS_Tie_Hash_NamedCapture_DELETE)
1418 REGEXP * rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1422 croak_xs_usage(cv, "$key, $flags");
1425 Perl_croak(aTHX_ "%s", PL_no_modify);
1429 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1430 CALLREG_NAMED_BUFF_DELETE(rx, ST(1), flags);
1433 XS(XS_Tie_Hash_NamedCapture_CLEAR)
1441 croak_xs_usage(cv, "$flags");
1443 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1446 Perl_croak(aTHX_ "%s", PL_no_modify);
1450 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1451 CALLREG_NAMED_BUFF_CLEAR(rx, flags);
1454 XS(XS_Tie_Hash_NamedCapture_EXISTS)
1463 croak_xs_usage(cv, "$key, $flags");
1465 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1472 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1473 ret = CALLREG_NAMED_BUFF_EXISTS(rx, ST(1), flags);
1482 XS(XS_Tie_Hash_NamedCapture_FIRSTK)
1491 croak_xs_usage(cv, "");
1493 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1500 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1501 ret = CALLREG_NAMED_BUFF_FIRSTKEY(rx, flags);
1514 XS(XS_Tie_Hash_NamedCapture_NEXTK)
1523 croak_xs_usage(cv, "$lastkey");
1525 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1532 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1533 ret = CALLREG_NAMED_BUFF_NEXTKEY(rx, ST(1), flags);
1545 XS(XS_Tie_Hash_NamedCapture_SCALAR)
1554 croak_xs_usage(cv, "");
1556 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1563 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1564 ret = CALLREG_NAMED_BUFF_SCALAR(rx, flags);
1577 XS(XS_Tie_Hash_NamedCapture_flags)
1583 croak_xs_usage(cv, "");
1585 mXPUSHu(RXapif_ONE);
1586 mXPUSHu(RXapif_ALL);
1594 * c-indentation-style: bsd
1596 * indent-tabs-mode: t
1599 * ex: set ts=8 sts=4 sw=4 noet: