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))))
178 if (sv_isobject(sv)) {
179 classname = sv_reftype(SvRV(sv),TRUE);
181 classname = SvPV_nolen(sv);
184 if (strEQ(name,classname))
189 mXPUSHs(newSVpv(name, 0));
192 methodname = newSVpvs_flags("isa", SVs_TEMP);
193 /* ugly hack: use the SvSCREAM flag so S_method_common
194 * can figure out we're calling DOES() and not isa(),
195 * and report eventual errors correctly. --rgs */
196 SvSCREAM_on(methodname);
197 call_sv(methodname, G_SCALAR | G_METHOD);
200 does_it = SvTRUE( TOPs );
207 PERL_XS_EXPORT_C void XS_UNIVERSAL_isa(pTHX_ CV *cv);
208 PERL_XS_EXPORT_C void XS_UNIVERSAL_can(pTHX_ CV *cv);
209 PERL_XS_EXPORT_C void XS_UNIVERSAL_DOES(pTHX_ CV *cv);
210 PERL_XS_EXPORT_C void XS_UNIVERSAL_VERSION(pTHX_ CV *cv);
212 XS(XS_version_stringify);
213 XS(XS_version_numify);
214 XS(XS_version_normal);
216 XS(XS_version_boolean);
217 #ifdef HASATTRIBUTE_NORETURN
218 XS(XS_version_noop) __attribute__noreturn__;
222 XS(XS_version_is_alpha);
229 XS(XS_utf8_downgrade);
230 XS(XS_utf8_unicode_to_native);
231 XS(XS_utf8_native_to_unicode);
232 XS(XS_Internals_SvREADONLY);
233 XS(XS_Internals_SvREFCNT);
234 XS(XS_Internals_hv_clear_placehold);
235 XS(XS_PerlIO_get_layers);
236 XS(XS_Regexp_DESTROY);
237 XS(XS_Internals_hash_seed);
238 XS(XS_Internals_rehash_seed);
239 XS(XS_Internals_HvREHASH);
240 XS(XS_Internals_inc_sub_generation);
244 XS(XS_re_regnames_count);
245 XS(XS_re_regexp_pattern);
246 XS(XS_Tie_Hash_NamedCapture_FETCH);
247 XS(XS_Tie_Hash_NamedCapture_STORE);
248 XS(XS_Tie_Hash_NamedCapture_DELETE);
249 XS(XS_Tie_Hash_NamedCapture_CLEAR);
250 XS(XS_Tie_Hash_NamedCapture_EXISTS);
251 XS(XS_Tie_Hash_NamedCapture_FIRSTK);
252 XS(XS_Tie_Hash_NamedCapture_NEXTK);
253 XS(XS_Tie_Hash_NamedCapture_SCALAR);
254 XS(XS_Tie_Hash_NamedCapture_flags);
257 Perl_boot_core_UNIVERSAL(pTHX)
260 static const char file[] = __FILE__;
262 newXS("UNIVERSAL::isa", XS_UNIVERSAL_isa, file);
263 newXS("UNIVERSAL::can", XS_UNIVERSAL_can, file);
264 newXS("UNIVERSAL::DOES", XS_UNIVERSAL_DOES, file);
265 newXS("UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, file);
267 /* register the overloading (type 'A') magic */
268 PL_amagic_generation++;
269 /* Make it findable via fetchmethod */
270 newXS("version::()", XS_version_noop, file);
271 newXS("version::new", XS_version_new, file);
272 newXS("version::(\"\"", XS_version_stringify, file);
273 newXS("version::stringify", XS_version_stringify, file);
274 newXS("version::(0+", XS_version_numify, file);
275 newXS("version::numify", XS_version_numify, file);
276 newXS("version::normal", XS_version_normal, file);
277 newXS("version::(cmp", XS_version_vcmp, file);
278 newXS("version::(<=>", XS_version_vcmp, file);
279 newXS("version::vcmp", XS_version_vcmp, file);
280 newXS("version::(bool", XS_version_boolean, file);
281 newXS("version::boolean", XS_version_boolean, file);
282 newXS("version::(nomethod", XS_version_noop, file);
283 newXS("version::noop", XS_version_noop, file);
284 newXS("version::is_alpha", XS_version_is_alpha, file);
285 newXS("version::qv", XS_version_qv, file);
287 newXS("utf8::is_utf8", XS_utf8_is_utf8, file);
288 newXS("utf8::valid", XS_utf8_valid, file);
289 newXS("utf8::encode", XS_utf8_encode, file);
290 newXS("utf8::decode", XS_utf8_decode, file);
291 newXS("utf8::upgrade", XS_utf8_upgrade, file);
292 newXS("utf8::downgrade", XS_utf8_downgrade, file);
293 newXS("utf8::native_to_unicode", XS_utf8_native_to_unicode, file);
294 newXS("utf8::unicode_to_native", XS_utf8_unicode_to_native, file);
295 newXSproto("Internals::SvREADONLY",XS_Internals_SvREADONLY, file, "\\[$%@];$");
296 newXSproto("Internals::SvREFCNT",XS_Internals_SvREFCNT, file, "\\[$%@];$");
297 newXSproto("Internals::hv_clear_placeholders",
298 XS_Internals_hv_clear_placehold, file, "\\%");
299 newXSproto("PerlIO::get_layers",
300 XS_PerlIO_get_layers, file, "*;@");
301 newXS("Regexp::DESTROY", XS_Regexp_DESTROY, file);
302 newXSproto("Internals::hash_seed",XS_Internals_hash_seed, file, "");
303 newXSproto("Internals::rehash_seed",XS_Internals_rehash_seed, file, "");
304 newXSproto("Internals::HvREHASH", XS_Internals_HvREHASH, file, "\\%");
305 newXSproto("re::is_regexp", XS_re_is_regexp, file, "$");
306 newXSproto("re::regname", XS_re_regname, file, ";$$");
307 newXSproto("re::regnames", XS_re_regnames, file, ";$");
308 newXSproto("re::regnames_count", XS_re_regnames_count, file, "");
309 newXSproto("re::regexp_pattern", XS_re_regexp_pattern, file, "$");
310 newXS("Tie::Hash::NamedCapture::FETCH", XS_Tie_Hash_NamedCapture_FETCH, file);
311 newXS("Tie::Hash::NamedCapture::STORE", XS_Tie_Hash_NamedCapture_STORE, file);
312 newXS("Tie::Hash::NamedCapture::DELETE", XS_Tie_Hash_NamedCapture_DELETE, file);
313 newXS("Tie::Hash::NamedCapture::CLEAR", XS_Tie_Hash_NamedCapture_CLEAR, file);
314 newXS("Tie::Hash::NamedCapture::EXISTS", XS_Tie_Hash_NamedCapture_EXISTS, file);
315 newXS("Tie::Hash::NamedCapture::FIRSTKEY", XS_Tie_Hash_NamedCapture_FIRSTK, file);
316 newXS("Tie::Hash::NamedCapture::NEXTKEY", XS_Tie_Hash_NamedCapture_NEXTK, file);
317 newXS("Tie::Hash::NamedCapture::SCALAR", XS_Tie_Hash_NamedCapture_SCALAR, file);
318 newXS("Tie::Hash::NamedCapture::flags", XS_Tie_Hash_NamedCapture_flags, file);
322 =for apidoc croak_xs_usage
324 A specialised variant of C<croak()> for emitting the usage message for xsubs
326 croak_xs_usage(cv, "eee_yow");
328 works out the package name and subroutine name from C<cv>, and then calls
329 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
331 Perl_croak(aTHX_ "Usage %s::%s(%s)", "ouch" "awk", "eee_yow");
337 Perl_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
339 const GV *const gv = CvGV(cv);
341 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
344 const char *const gvname = GvNAME(gv);
345 const HV *const stash = GvSTASH(gv);
346 const char *const hvname = stash ? HvNAME_get(stash) : NULL;
349 Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params);
351 Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params);
353 /* Pants. I don't think that it should be possible to get here. */
354 Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
364 croak_xs_usage(cv, "reference, kind");
366 SV * const sv = ST(0);
371 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
372 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
375 name = SvPV_nolen_const(ST(1));
377 ST(0) = boolSV(sv_derived_from(sv, name));
392 croak_xs_usage(cv, "object-ref, method");
398 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
399 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
402 name = SvPV_nolen_const(ST(1));
406 sv = MUTABLE_SV(SvRV(sv));
411 pkg = gv_stashsv(sv, 0);
415 GV * const gv = gv_fetchmethod_autoload(pkg, name, FALSE);
417 rv = sv_2mortal(newRV(MUTABLE_SV(GvCV(gv))));
424 XS(XS_UNIVERSAL_DOES)
431 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
433 SV * const sv = ST(0);
436 name = SvPV_nolen_const(ST(1));
437 if (sv_does( sv, name ))
444 XS(XS_UNIVERSAL_VERSION)
456 sv = MUTABLE_SV(SvRV(ST(0)));
458 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
462 pkg = gv_stashsv(ST(0), 0);
465 gvp = pkg ? (GV**)hv_fetchs(pkg, "VERSION", FALSE) : NULL;
467 if (gvp && isGV(gv = *gvp) && (sv = GvSV(gv)) && SvOK(sv)) {
468 SV * const nsv = sv_newmortal();
471 if ( !sv_derived_from(sv, "version"))
472 upg_version(sv, FALSE);
485 const char * const name = HvNAME_get(pkg);
487 "%s does not define $%s::VERSION--version check failed",
491 "%s defines neither package nor VERSION--version check failed",
492 SvPVx_nolen_const(ST(0)) );
496 if ( !sv_derived_from(req, "version")) {
497 /* req may very well be R/O, so create a new object */
498 req = sv_2mortal( new_version(req) );
501 if ( vcmp( req, sv ) > 0 ) {
502 if ( hv_exists(MUTABLE_HV(SvRV(req)), "qv", 2 ) ) {
503 Perl_croak(aTHX_ "%s version %"SVf" required--"
504 "this is only version %"SVf"", HvNAME_get(pkg),
505 SVfARG(vnormal(req)),
506 SVfARG(vnormal(sv)));
508 Perl_croak(aTHX_ "%s version %"SVf" required--"
509 "this is only version %"SVf"", HvNAME_get(pkg),
510 SVfARG(vstringify(req)),
511 SVfARG(vstringify(sv)));
517 if ( SvOK(sv) && sv_derived_from(sv, "version") ) {
518 ST(0) = vstringify(sv);
531 croak_xs_usage(cv, "class, version");
536 const char * const classname =
537 sv_isobject(ST(0)) /* get the class if called as an object method */
538 ? HvNAME(SvSTASH(SvRV(ST(0))))
539 : (char *)SvPV_nolen(ST(0));
541 if ( items == 1 || vs == &PL_sv_undef ) { /* no param or explicit undef */
542 /* create empty object */
546 else if ( items == 3 ) {
548 Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
551 rv = new_version(vs);
552 if ( strcmp(classname,"version") != 0 ) /* inherited new() */
553 sv_bless(rv, gv_stashpv(classname, GV_ADD));
561 XS(XS_version_stringify)
566 croak_xs_usage(cv, "lobj, ...");
571 if (sv_derived_from(ST(0), "version")) {
575 Perl_croak(aTHX_ "lobj is not of type version");
577 mPUSHs(vstringify(lobj));
584 XS(XS_version_numify)
589 croak_xs_usage(cv, "lobj, ...");
594 if (sv_derived_from(ST(0), "version")) {
598 Perl_croak(aTHX_ "lobj is not of type version");
600 mPUSHs(vnumify(lobj));
607 XS(XS_version_normal)
612 croak_xs_usage(cv, "lobj, ...");
617 if (sv_derived_from(ST(0), "version")) {
621 Perl_croak(aTHX_ "lobj is not of type version");
623 mPUSHs(vnormal(lobj));
635 croak_xs_usage(cv, "lobj, ...");
640 if (sv_derived_from(ST(0), "version")) {
644 Perl_croak(aTHX_ "lobj is not of type version");
650 const IV swap = (IV)SvIV(ST(2));
652 if ( ! sv_derived_from(robj, "version") )
654 robj = new_version(robj);
660 rs = newSViv(vcmp(rvs,lobj));
664 rs = newSViv(vcmp(lobj,rvs));
675 XS(XS_version_boolean)
680 croak_xs_usage(cv, "lobj, ...");
682 if (sv_derived_from(ST(0), "version")) {
683 SV * const lobj = SvRV(ST(0));
684 SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) );
690 Perl_croak(aTHX_ "lobj is not of type version");
698 croak_xs_usage(cv, "lobj, ...");
699 if (sv_derived_from(ST(0), "version"))
700 Perl_croak(aTHX_ "operation not supported with version object");
702 Perl_croak(aTHX_ "lobj is not of type version");
703 #ifndef HASATTRIBUTE_NORETURN
708 XS(XS_version_is_alpha)
713 croak_xs_usage(cv, "lobj");
715 if (sv_derived_from(ST(0), "version")) {
716 SV * const lobj = ST(0);
717 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "alpha", 5 ) )
725 Perl_croak(aTHX_ "lobj is not of type version");
733 croak_xs_usage(cv, "ver");
737 if ( !SvVOK(ver) ) { /* only need to do with if not already v-string */
738 SV * const rv = sv_newmortal();
739 sv_setsv(rv,ver); /* make a duplicate */
740 upg_version(rv, TRUE);
745 mPUSHs(new_version(ver));
758 croak_xs_usage(cv, "sv");
760 const SV * const sv = ST(0);
774 croak_xs_usage(cv, "sv");
776 SV * const sv = ST(0);
778 const char * const s = SvPV_const(sv,len);
779 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
792 croak_xs_usage(cv, "sv");
793 sv_utf8_encode(ST(0));
802 croak_xs_usage(cv, "sv");
804 SV * const sv = ST(0);
805 const bool RETVAL = sv_utf8_decode(sv);
806 ST(0) = boolSV(RETVAL);
817 croak_xs_usage(cv, "sv");
819 SV * const sv = ST(0);
823 RETVAL = sv_utf8_upgrade(sv);
824 XSprePUSH; PUSHi((IV)RETVAL);
829 XS(XS_utf8_downgrade)
833 if (items < 1 || items > 2)
834 croak_xs_usage(cv, "sv, failok=0");
836 SV * const sv = ST(0);
837 const bool failok = (items < 2) ? 0 : (int)SvIV(ST(1));
838 const bool RETVAL = sv_utf8_downgrade(sv, failok);
840 ST(0) = boolSV(RETVAL);
846 XS(XS_utf8_native_to_unicode)
850 const UV uv = SvUV(ST(0));
853 croak_xs_usage(cv, "sv");
855 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
859 XS(XS_utf8_unicode_to_native)
863 const UV uv = SvUV(ST(0));
866 croak_xs_usage(cv, "sv");
868 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
872 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
876 SV * const sv = SvRV(ST(0));
885 else if (items == 2) {
891 /* I hope you really know what you are doing. */
896 XSRETURN_UNDEF; /* Can't happen. */
899 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
903 SV * const sv = SvRV(ST(0));
907 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
908 else if (items == 2) {
909 /* I hope you really know what you are doing. */
910 SvREFCNT(sv) = SvIV(ST(1));
911 XSRETURN_IV(SvREFCNT(sv));
913 XSRETURN_UNDEF; /* Can't happen. */
916 XS(XS_Internals_hv_clear_placehold)
922 croak_xs_usage(cv, "hv");
924 HV * const hv = MUTABLE_HV(SvRV(ST(0)));
925 hv_clear_placeholders(hv);
930 XS(XS_Regexp_DESTROY)
936 XS(XS_PerlIO_get_layers)
940 if (items < 1 || items % 2 == 0)
941 croak_xs_usage(cv, "filehandle[,args]");
948 bool details = FALSE;
952 for (svp = MARK + 2; svp <= SP; svp += 2) {
953 SV * const * const varp = svp;
954 SV * const * const valp = svp + 1;
956 const char * const key = SvPV_const(*varp, klen);
960 if (klen == 5 && memEQ(key, "input", 5)) {
961 input = SvTRUE(*valp);
966 if (klen == 6 && memEQ(key, "output", 6)) {
967 input = !SvTRUE(*valp);
972 if (klen == 7 && memEQ(key, "details", 7)) {
973 details = SvTRUE(*valp);
980 "get_layers: unknown argument '%s'",
992 if (SvROK(sv) && isGV(SvRV(sv)))
993 gv = MUTABLE_GV(SvRV(sv));
995 gv = gv_fetchsv(sv, 0, SVt_PVIO);
998 if (gv && (io = GvIO(gv))) {
999 AV* const av = PerlIO_get_layers(aTHX_ input ?
1000 IoIFP(io) : IoOFP(io));
1002 const I32 last = av_len(av);
1005 for (i = last; i >= 0; i -= 3) {
1006 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
1007 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
1008 SV * const * const flgsvp = av_fetch(av, i, FALSE);
1010 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
1011 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
1012 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
1015 /* Indents of 5? Yuck. */
1016 /* We know that PerlIO_get_layers creates a new SV for
1017 the name and flags, so we can just take a reference
1018 and "steal" it when we free the AV below. */
1020 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
1023 ? newSVpvn_flags(SvPVX_const(*argsvp),
1025 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
1029 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
1035 XPUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
1039 XPUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
1041 XPUSHs(&PL_sv_undef);
1044 const IV flags = SvIVX(*flgsvp);
1046 if (flags & PERLIO_F_UTF8) {
1047 XPUSHs(newSVpvs_flags("utf8", SVs_TEMP));
1064 XS(XS_Internals_hash_seed)
1067 /* Using dXSARGS would also have dITEM and dSP,
1068 * which define 2 unused local variables. */
1070 PERL_UNUSED_ARG(cv);
1071 PERL_UNUSED_VAR(mark);
1072 XSRETURN_UV(PERL_HASH_SEED);
1075 XS(XS_Internals_rehash_seed)
1078 /* Using dXSARGS would also have dITEM and dSP,
1079 * which define 2 unused local variables. */
1081 PERL_UNUSED_ARG(cv);
1082 PERL_UNUSED_VAR(mark);
1083 XSRETURN_UV(PL_rehash_seed);
1086 XS(XS_Internals_HvREHASH) /* Subject to change */
1090 PERL_UNUSED_ARG(cv);
1092 const HV * const hv = (const HV *) SvRV(ST(0));
1093 if (items == 1 && SvTYPE(hv) == SVt_PVHV) {
1100 Perl_croak(aTHX_ "Internals::HvREHASH $hashref");
1107 PERL_UNUSED_VAR(cv);
1110 croak_xs_usage(cv, "sv");
1114 if (SvRXOK(ST(0))) {
1121 XS(XS_re_regnames_count)
1123 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1129 croak_xs_usage(cv, "");
1136 ret = CALLREG_NAMED_BUFF_COUNT(rx);
1157 if (items < 1 || items > 2)
1158 croak_xs_usage(cv, "name[, all ]");
1162 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1167 if (items == 2 && SvTRUE(ST(1))) {
1172 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
1195 croak_xs_usage(cv, "[all]");
1197 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1202 if (items == 1 && SvTRUE(ST(0))) {
1210 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
1219 av = MUTABLE_AV(SvRV(ret));
1220 length = av_len(av);
1222 for (i = 0; i <= length; i++) {
1223 entry = av_fetch(av, i, FALSE);
1226 Perl_croak(aTHX_ "NULL array element in re::regnames()");
1228 mXPUSHs(SvREFCNT_inc_simple_NN(*entry));
1237 XS(XS_re_regexp_pattern)
1244 croak_xs_usage(cv, "sv");
1249 Checks if a reference is a regex or not. If the parameter is
1250 not a ref, or is not the result of a qr// then returns false
1251 in scalar context and an empty list in list context.
1252 Otherwise in list context it returns the pattern and the
1253 modifiers, in scalar context it returns the pattern just as it
1254 would if the qr// was stringified normally, regardless as
1255 to the class of the variable and any strigification overloads
1259 if ((re = SvRX(ST(0)))) /* assign deliberate */
1261 /* Housten, we have a regex! */
1266 if ( GIMME_V == G_ARRAY ) {
1268 we are in list context so stringify
1269 the modifiers that apply. We ignore "negative
1270 modifiers" in this scenario.
1273 const char *fptr = INT_PAT_MODS;
1275 U16 match_flags = (U16)((RX_EXTFLAGS(re) & PMf_COMPILETIME)
1276 >> RXf_PMf_STD_PMMOD_SHIFT);
1278 while((ch = *fptr++)) {
1279 if(match_flags & 1) {
1280 reflags[left++] = ch;
1285 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
1286 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1288 /* return the pattern and the modifiers */
1290 XPUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
1293 /* Scalar, so use the string that Perl would return */
1294 /* return the pattern in (?msix:..) format */
1295 #if PERL_VERSION >= 11
1296 pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));
1298 pattern = newSVpvn_flags(RX_WRAPPED(re), RX_WRAPLEN(re),
1299 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1305 /* It ain't a regexp folks */
1306 if ( GIMME_V == G_ARRAY ) {
1307 /* return the empty list */
1310 /* Because of the (?:..) wrapping involved in a
1311 stringified pattern it is impossible to get a
1312 result for a real regexp that would evaluate to
1313 false. Therefore we can return PL_sv_no to signify
1314 that the object is not a regex, this means that one
1317 if (regex($might_be_a_regex) eq '(?:foo)') { }
1319 and not worry about undefined values.
1327 XS(XS_Tie_Hash_NamedCapture_FETCH)
1336 croak_xs_usage(cv, "$key, $flags");
1338 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1345 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1346 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(1), flags);
1358 XS(XS_Tie_Hash_NamedCapture_STORE)
1366 croak_xs_usage(cv, "$key, $value, $flags");
1368 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1372 Perl_croak(aTHX_ "%s", PL_no_modify);
1379 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1380 CALLREG_NAMED_BUFF_STORE(rx,ST(1), ST(2), flags);
1383 XS(XS_Tie_Hash_NamedCapture_DELETE)
1387 REGEXP * rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1391 croak_xs_usage(cv, "$key, $flags");
1394 Perl_croak(aTHX_ "%s", PL_no_modify);
1398 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1399 CALLREG_NAMED_BUFF_DELETE(rx, ST(1), flags);
1402 XS(XS_Tie_Hash_NamedCapture_CLEAR)
1410 croak_xs_usage(cv, "$flags");
1412 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1415 Perl_croak(aTHX_ "%s", PL_no_modify);
1419 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1420 CALLREG_NAMED_BUFF_CLEAR(rx, flags);
1423 XS(XS_Tie_Hash_NamedCapture_EXISTS)
1432 croak_xs_usage(cv, "$key, $flags");
1434 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1441 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1442 ret = CALLREG_NAMED_BUFF_EXISTS(rx, ST(1), flags);
1451 XS(XS_Tie_Hash_NamedCapture_FIRSTK)
1460 croak_xs_usage(cv, "");
1462 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1469 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1470 ret = CALLREG_NAMED_BUFF_FIRSTKEY(rx, flags);
1483 XS(XS_Tie_Hash_NamedCapture_NEXTK)
1492 croak_xs_usage(cv, "$lastkey");
1494 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1501 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1502 ret = CALLREG_NAMED_BUFF_NEXTKEY(rx, ST(1), flags);
1514 XS(XS_Tie_Hash_NamedCapture_SCALAR)
1523 croak_xs_usage(cv, "");
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_SCALAR(rx, flags);
1546 XS(XS_Tie_Hash_NamedCapture_flags)
1552 croak_xs_usage(cv, "");
1554 mXPUSHu(RXapif_ONE);
1555 mXPUSHu(RXapif_ALL);
1563 * c-indentation-style: bsd
1565 * indent-tabs-mode: t
1568 * ex: set ts=8 sts=4 sw=4 noet: