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 );
212 =for apidoc croak_xs_usage
214 A specialised variant of C<croak()> for emitting the usage message for xsubs
216 croak_xs_usage(cv, "eee_yow");
218 works out the package name and subroutine name from C<cv>, and then calls
219 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
221 Perl_croak(aTHX_ "Usage %s::%s(%s)", "ouch" "awk", "eee_yow");
227 Perl_croak_xs_usage(pTHX_ const CV *const cv, const char *const params)
229 const GV *const gv = CvGV(cv);
231 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
234 const char *const gvname = GvNAME(gv);
235 const HV *const stash = GvSTASH(gv);
236 const char *const hvname = stash ? HvNAME_get(stash) : NULL;
239 Perl_croak(aTHX_ "Usage: %s::%s(%s)", hvname, gvname, params);
241 Perl_croak(aTHX_ "Usage: %s(%s)", gvname, params);
243 /* Pants. I don't think that it should be possible to get here. */
244 Perl_croak(aTHX_ "Usage: CODE(0x%"UVxf")(%s)", PTR2UV(cv), params);
254 croak_xs_usage(cv, "reference, kind");
256 SV * const sv = ST(0);
261 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
262 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
265 name = SvPV_nolen_const(ST(1));
267 ST(0) = boolSV(sv_derived_from(sv, name));
282 croak_xs_usage(cv, "object-ref, method");
288 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))
289 || (SvGMAGICAL(sv) && SvPOKp(sv) && SvCUR(sv))))
292 name = SvPV_nolen_const(ST(1));
296 sv = MUTABLE_SV(SvRV(sv));
301 pkg = gv_stashsv(sv, 0);
305 GV * const gv = gv_fetchmethod_autoload(pkg, name, FALSE);
307 rv = sv_2mortal(newRV(MUTABLE_SV(GvCV(gv))));
314 XS(XS_UNIVERSAL_DOES)
321 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
323 SV * const sv = ST(0);
326 name = SvPV_nolen_const(ST(1));
327 if (sv_does( sv, name ))
334 XS(XS_UNIVERSAL_VERSION)
346 sv = MUTABLE_SV(SvRV(ST(0)));
348 Perl_croak(aTHX_ "Cannot find version of an unblessed reference");
352 pkg = gv_stashsv(ST(0), 0);
355 gvp = pkg ? (GV**)hv_fetchs(pkg, "VERSION", FALSE) : NULL;
357 if (gvp && isGV(gv = *gvp) && (sv = GvSV(gv)) && SvOK(sv)) {
358 SV * const nsv = sv_newmortal();
361 if ( !sv_derived_from(sv, "version"))
362 upg_version(sv, FALSE);
375 const char * const name = HvNAME_get(pkg);
377 "%s does not define $%s::VERSION--version check failed",
381 "%s defines neither package nor VERSION--version check failed",
382 SvPVx_nolen_const(ST(0)) );
386 if ( !sv_derived_from(req, "version")) {
387 /* req may very well be R/O, so create a new object */
388 req = sv_2mortal( new_version(req) );
391 if ( vcmp( req, sv ) > 0 ) {
392 if ( hv_exists(MUTABLE_HV(SvRV(req)), "qv", 2 ) ) {
393 Perl_croak(aTHX_ "%s version %"SVf" required--"
394 "this is only version %"SVf"", HvNAME_get(pkg),
395 SVfARG(vnormal(req)),
396 SVfARG(vnormal(sv)));
398 Perl_croak(aTHX_ "%s version %"SVf" required--"
399 "this is only version %"SVf"", HvNAME_get(pkg),
400 SVfARG(vstringify(req)),
401 SVfARG(vstringify(sv)));
407 if ( SvOK(sv) && sv_derived_from(sv, "version") ) {
408 ST(0) = vstringify(sv);
421 croak_xs_usage(cv, "class, version");
426 const char * const classname =
427 sv_isobject(ST(0)) /* get the class if called as an object method */
428 ? HvNAME(SvSTASH(SvRV(ST(0))))
429 : (char *)SvPV_nolen(ST(0));
431 if ( items == 1 || ! SvOK(vs) ) { /* no param or explicit undef */
432 /* create empty object */
436 else if ( items == 3 ) {
438 Perl_sv_setpvf(aTHX_ vs,"v%s",SvPV_nolen_const(ST(2)));
441 rv = new_version(vs);
442 if ( strcmp(classname,"version") != 0 ) /* inherited new() */
443 sv_bless(rv, gv_stashpv(classname, GV_ADD));
451 XS(XS_version_stringify)
456 croak_xs_usage(cv, "lobj, ...");
461 if (sv_derived_from(ST(0), "version")) {
465 Perl_croak(aTHX_ "lobj is not of type version");
467 mPUSHs(vstringify(lobj));
474 XS(XS_version_numify)
479 croak_xs_usage(cv, "lobj, ...");
484 if (sv_derived_from(ST(0), "version")) {
488 Perl_croak(aTHX_ "lobj is not of type version");
490 mPUSHs(vnumify(lobj));
497 XS(XS_version_normal)
502 croak_xs_usage(cv, "lobj, ...");
507 if (sv_derived_from(ST(0), "version")) {
511 Perl_croak(aTHX_ "lobj is not of type version");
513 mPUSHs(vnormal(lobj));
525 croak_xs_usage(cv, "lobj, ...");
530 if (sv_derived_from(ST(0), "version")) {
534 Perl_croak(aTHX_ "lobj is not of type version");
540 const IV swap = (IV)SvIV(ST(2));
542 if ( ! sv_derived_from(robj, "version") )
544 robj = new_version(SvOK(robj) ? robj : newSVpvs("0"));
550 rs = newSViv(vcmp(rvs,lobj));
554 rs = newSViv(vcmp(lobj,rvs));
565 XS(XS_version_boolean)
570 croak_xs_usage(cv, "lobj, ...");
572 if (sv_derived_from(ST(0), "version")) {
573 SV * const lobj = SvRV(ST(0));
574 SV * const rs = newSViv( vcmp(lobj,new_version(newSVpvs("0"))) );
580 Perl_croak(aTHX_ "lobj is not of type version");
588 croak_xs_usage(cv, "lobj, ...");
589 if (sv_derived_from(ST(0), "version"))
590 Perl_croak(aTHX_ "operation not supported with version object");
592 Perl_croak(aTHX_ "lobj is not of type version");
593 #ifndef HASATTRIBUTE_NORETURN
598 XS(XS_version_is_alpha)
603 croak_xs_usage(cv, "lobj");
605 if (sv_derived_from(ST(0), "version")) {
606 SV * const lobj = ST(0);
607 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "alpha", 5 ) )
615 Perl_croak(aTHX_ "lobj is not of type version");
627 const char * classname = "";
628 if ( items == 2 && SvOK(ST(1)) ) {
629 /* getting called as object or class method */
632 sv_isobject(ST(0)) /* class called as an object method */
633 ? HvNAME_get(SvSTASH(SvRV(ST(0))))
634 : (char *)SvPV_nolen(ST(0));
636 if ( !SvVOK(ver) ) { /* not already a v-string */
638 sv_setsv(rv,ver); /* make a duplicate */
639 upg_version(rv, TRUE);
641 rv = sv_2mortal(new_version(ver));
643 if ( items == 2 && strcmp(classname,"version") ) { /* inherited new() */
644 sv_bless(rv, gv_stashpv(classname, GV_ADD));
657 croak_xs_usage(cv, "lobj");
659 if (sv_derived_from(ST(0), "version")) {
660 SV * const lobj = ST(0);
661 if ( hv_exists(MUTABLE_HV(SvRV(lobj)), "qv", 2 ) )
669 Perl_croak(aTHX_ "lobj is not of type version");
677 croak_xs_usage(cv, "sv");
679 SV * const sv = ST(0);
694 croak_xs_usage(cv, "sv");
696 SV * const sv = ST(0);
698 const char * const s = SvPV_const(sv,len);
699 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
712 croak_xs_usage(cv, "sv");
713 sv_utf8_encode(ST(0));
722 croak_xs_usage(cv, "sv");
724 SV * const sv = ST(0);
725 const bool RETVAL = sv_utf8_decode(sv);
726 ST(0) = boolSV(RETVAL);
737 croak_xs_usage(cv, "sv");
739 SV * const sv = ST(0);
743 RETVAL = sv_utf8_upgrade(sv);
744 XSprePUSH; PUSHi((IV)RETVAL);
749 XS(XS_utf8_downgrade)
753 if (items < 1 || items > 2)
754 croak_xs_usage(cv, "sv, failok=0");
756 SV * const sv = ST(0);
757 const bool failok = (items < 2) ? 0 : (int)SvIV(ST(1));
758 const bool RETVAL = sv_utf8_downgrade(sv, failok);
760 ST(0) = boolSV(RETVAL);
766 XS(XS_utf8_native_to_unicode)
770 const UV uv = SvUV(ST(0));
773 croak_xs_usage(cv, "sv");
775 ST(0) = sv_2mortal(newSViv(NATIVE_TO_UNI(uv)));
779 XS(XS_utf8_unicode_to_native)
783 const UV uv = SvUV(ST(0));
786 croak_xs_usage(cv, "sv");
788 ST(0) = sv_2mortal(newSViv(UNI_TO_NATIVE(uv)));
792 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
796 SV * const sv = SvRV(ST(0));
805 else if (items == 2) {
811 /* I hope you really know what you are doing. */
816 XSRETURN_UNDEF; /* Can't happen. */
819 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
823 SV * const sv = SvRV(ST(0));
827 XSRETURN_IV(SvREFCNT(sv) - 1); /* Minus the ref created for us. */
828 else if (items == 2) {
829 /* I hope you really know what you are doing. */
830 SvREFCNT(sv) = SvIV(ST(1));
831 XSRETURN_IV(SvREFCNT(sv));
833 XSRETURN_UNDEF; /* Can't happen. */
836 XS(XS_Internals_hv_clear_placehold)
842 croak_xs_usage(cv, "hv");
844 HV * const hv = MUTABLE_HV(SvRV(ST(0)));
845 hv_clear_placeholders(hv);
850 XS(XS_PerlIO_get_layers)
854 if (items < 1 || items % 2 == 0)
855 croak_xs_usage(cv, "filehandle[,args]");
862 bool details = FALSE;
866 for (svp = MARK + 2; svp <= SP; svp += 2) {
867 SV * const * const varp = svp;
868 SV * const * const valp = svp + 1;
870 const char * const key = SvPV_const(*varp, klen);
874 if (klen == 5 && memEQ(key, "input", 5)) {
875 input = SvTRUE(*valp);
880 if (klen == 6 && memEQ(key, "output", 6)) {
881 input = !SvTRUE(*valp);
886 if (klen == 7 && memEQ(key, "details", 7)) {
887 details = SvTRUE(*valp);
894 "get_layers: unknown argument '%s'",
906 if (SvROK(sv) && isGV(SvRV(sv)))
907 gv = MUTABLE_GV(SvRV(sv));
909 gv = gv_fetchsv(sv, 0, SVt_PVIO);
912 if (gv && (io = GvIO(gv))) {
913 AV* const av = PerlIO_get_layers(aTHX_ input ?
914 IoIFP(io) : IoOFP(io));
916 const I32 last = av_len(av);
919 for (i = last; i >= 0; i -= 3) {
920 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
921 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
922 SV * const * const flgsvp = av_fetch(av, i, FALSE);
924 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
925 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
926 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
929 /* Indents of 5? Yuck. */
930 /* We know that PerlIO_get_layers creates a new SV for
931 the name and flags, so we can just take a reference
932 and "steal" it when we free the AV below. */
934 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
937 ? newSVpvn_flags(SvPVX_const(*argsvp),
939 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
943 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
949 XPUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%"SVf"(%"SVf")",
953 XPUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
955 XPUSHs(&PL_sv_undef);
958 const IV flags = SvIVX(*flgsvp);
960 if (flags & PERLIO_F_UTF8) {
961 XPUSHs(newSVpvs_flags("utf8", SVs_TEMP));
978 XS(XS_Internals_hash_seed)
981 /* Using dXSARGS would also have dITEM and dSP,
982 * which define 2 unused local variables. */
985 PERL_UNUSED_VAR(mark);
986 XSRETURN_UV(PERL_HASH_SEED);
989 XS(XS_Internals_rehash_seed)
992 /* Using dXSARGS would also have dITEM and dSP,
993 * which define 2 unused local variables. */
996 PERL_UNUSED_VAR(mark);
997 XSRETURN_UV(PL_rehash_seed);
1000 XS(XS_Internals_HvREHASH) /* Subject to change */
1004 PERL_UNUSED_ARG(cv);
1006 const HV * const hv = (const HV *) SvRV(ST(0));
1007 if (items == 1 && SvTYPE(hv) == SVt_PVHV) {
1014 Perl_croak(aTHX_ "Internals::HvREHASH $hashref");
1021 PERL_UNUSED_VAR(cv);
1024 croak_xs_usage(cv, "sv");
1028 if (SvRXOK(ST(0))) {
1035 XS(XS_re_regnames_count)
1037 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1043 croak_xs_usage(cv, "");
1050 ret = CALLREG_NAMED_BUFF_COUNT(rx);
1071 if (items < 1 || items > 2)
1072 croak_xs_usage(cv, "name[, all ]");
1076 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1081 if (items == 2 && SvTRUE(ST(1))) {
1086 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
1109 croak_xs_usage(cv, "[all]");
1111 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1116 if (items == 1 && SvTRUE(ST(0))) {
1124 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
1133 av = MUTABLE_AV(SvRV(ret));
1134 length = av_len(av);
1136 for (i = 0; i <= length; i++) {
1137 entry = av_fetch(av, i, FALSE);
1140 Perl_croak(aTHX_ "NULL array element in re::regnames()");
1142 mXPUSHs(SvREFCNT_inc_simple_NN(*entry));
1151 XS(XS_re_regexp_pattern)
1158 croak_xs_usage(cv, "sv");
1163 Checks if a reference is a regex or not. If the parameter is
1164 not a ref, or is not the result of a qr// then returns false
1165 in scalar context and an empty list in list context.
1166 Otherwise in list context it returns the pattern and the
1167 modifiers, in scalar context it returns the pattern just as it
1168 would if the qr// was stringified normally, regardless as
1169 to the class of the variable and any strigification overloads
1173 if ((re = SvRX(ST(0)))) /* assign deliberate */
1175 /* Housten, we have a regex! */
1180 if ( GIMME_V == G_ARRAY ) {
1182 we are in list context so stringify
1183 the modifiers that apply. We ignore "negative
1184 modifiers" in this scenario.
1187 const char *fptr = INT_PAT_MODS;
1189 U16 match_flags = (U16)((RX_EXTFLAGS(re) & PMf_COMPILETIME)
1190 >> RXf_PMf_STD_PMMOD_SHIFT);
1192 while((ch = *fptr++)) {
1193 if(match_flags & 1) {
1194 reflags[left++] = ch;
1199 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
1200 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1202 /* return the pattern and the modifiers */
1204 XPUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
1207 /* Scalar, so use the string that Perl would return */
1208 /* return the pattern in (?msix:..) format */
1209 #if PERL_VERSION >= 11
1210 pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));
1212 pattern = newSVpvn_flags(RX_WRAPPED(re), RX_WRAPLEN(re),
1213 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
1219 /* It ain't a regexp folks */
1220 if ( GIMME_V == G_ARRAY ) {
1221 /* return the empty list */
1224 /* Because of the (?:..) wrapping involved in a
1225 stringified pattern it is impossible to get a
1226 result for a real regexp that would evaluate to
1227 false. Therefore we can return PL_sv_no to signify
1228 that the object is not a regex, this means that one
1231 if (regex($might_be_a_regex) eq '(?:foo)') { }
1233 and not worry about undefined values.
1241 XS(XS_Tie_Hash_NamedCapture_FETCH)
1250 croak_xs_usage(cv, "$key, $flags");
1252 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1254 if (!rx || !SvROK(ST(0)))
1259 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1260 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(1), flags);
1272 XS(XS_Tie_Hash_NamedCapture_STORE)
1280 croak_xs_usage(cv, "$key, $value, $flags");
1282 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1284 if (!rx || !SvROK(ST(0))) {
1286 Perl_croak(aTHX_ "%s", PL_no_modify);
1293 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1294 CALLREG_NAMED_BUFF_STORE(rx,ST(1), ST(2), flags);
1297 XS(XS_Tie_Hash_NamedCapture_DELETE)
1301 REGEXP * rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1305 croak_xs_usage(cv, "$key, $flags");
1307 if (!rx || !SvROK(ST(0)))
1308 Perl_croak(aTHX_ "%s", PL_no_modify);
1312 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1313 CALLREG_NAMED_BUFF_DELETE(rx, ST(1), flags);
1316 XS(XS_Tie_Hash_NamedCapture_CLEAR)
1324 croak_xs_usage(cv, "$flags");
1326 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1328 if (!rx || !SvROK(ST(0)))
1329 Perl_croak(aTHX_ "%s", PL_no_modify);
1333 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1334 CALLREG_NAMED_BUFF_CLEAR(rx, flags);
1337 XS(XS_Tie_Hash_NamedCapture_EXISTS)
1346 croak_xs_usage(cv, "$key, $flags");
1348 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1350 if (!rx || !SvROK(ST(0)))
1355 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1356 ret = CALLREG_NAMED_BUFF_EXISTS(rx, ST(1), flags);
1365 XS(XS_Tie_Hash_NamedCapture_FIRSTK)
1374 croak_xs_usage(cv, "");
1376 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1378 if (!rx || !SvROK(ST(0)))
1383 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1384 ret = CALLREG_NAMED_BUFF_FIRSTKEY(rx, flags);
1397 XS(XS_Tie_Hash_NamedCapture_NEXTK)
1406 croak_xs_usage(cv, "$lastkey");
1408 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1410 if (!rx || !SvROK(ST(0)))
1415 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1416 ret = CALLREG_NAMED_BUFF_NEXTKEY(rx, ST(1), flags);
1428 XS(XS_Tie_Hash_NamedCapture_SCALAR)
1437 croak_xs_usage(cv, "");
1439 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
1441 if (!rx || !SvROK(ST(0)))
1446 flags = (U32)INT2PTR(IV,SvIV(SvRV(MUTABLE_SV(ST(0)))));
1447 ret = CALLREG_NAMED_BUFF_SCALAR(rx, flags);
1460 XS(XS_Tie_Hash_NamedCapture_flags)
1466 croak_xs_usage(cv, "");
1468 mXPUSHu(RXapif_ONE);
1469 mXPUSHu(RXapif_ALL);
1474 struct xsub_details {
1480 struct xsub_details details[] = {
1481 {"UNIVERSAL::isa", XS_UNIVERSAL_isa, NULL},
1482 {"UNIVERSAL::can", XS_UNIVERSAL_can, NULL},
1483 {"UNIVERSAL::DOES", XS_UNIVERSAL_DOES, NULL},
1484 {"UNIVERSAL::VERSION", XS_UNIVERSAL_VERSION, NULL},
1485 {"version::()", XS_version_noop, NULL},
1486 {"version::new", XS_version_new, NULL},
1487 {"version::parse", XS_version_new, NULL},
1488 {"version::(\"\"", XS_version_stringify, NULL},
1489 {"version::stringify", XS_version_stringify, NULL},
1490 {"version::(0+", XS_version_numify, NULL},
1491 {"version::numify", XS_version_numify, NULL},
1492 {"version::normal", XS_version_normal, NULL},
1493 {"version::(cmp", XS_version_vcmp, NULL},
1494 {"version::(<=>", XS_version_vcmp, NULL},
1495 {"version::vcmp", XS_version_vcmp, NULL},
1496 {"version::(bool", XS_version_boolean, NULL},
1497 {"version::boolean", XS_version_boolean, NULL},
1498 {"version::(nomethod", XS_version_noop, NULL},
1499 {"version::noop", XS_version_noop, NULL},
1500 {"version::is_alpha", XS_version_is_alpha, NULL},
1501 {"version::qv", XS_version_qv, NULL},
1502 {"version::declare", XS_version_qv, NULL},
1503 {"version::is_qv", XS_version_is_qv, NULL},
1504 {"utf8::is_utf8", XS_utf8_is_utf8, NULL},
1505 {"utf8::valid", XS_utf8_valid, NULL},
1506 {"utf8::encode", XS_utf8_encode, NULL},
1507 {"utf8::decode", XS_utf8_decode, NULL},
1508 {"utf8::upgrade", XS_utf8_upgrade, NULL},
1509 {"utf8::downgrade", XS_utf8_downgrade, NULL},
1510 {"utf8::native_to_unicode", XS_utf8_native_to_unicode, NULL},
1511 {"utf8::unicode_to_native", XS_utf8_unicode_to_native, NULL},
1512 {"Internals::SvREADONLY", XS_Internals_SvREADONLY, "\\[$%@];$"},
1513 {"Internals::SvREFCNT", XS_Internals_SvREFCNT, "\\[$%@];$"},
1514 {"Internals::hv_clear_placeholders", XS_Internals_hv_clear_placehold, "\\%"},
1515 {"PerlIO::get_layers", XS_PerlIO_get_layers, "*;@"},
1516 {"Internals::hash_seed", XS_Internals_hash_seed, ""},
1517 {"Internals::rehash_seed", XS_Internals_rehash_seed, ""},
1518 {"Internals::HvREHASH", XS_Internals_HvREHASH, "\\%"},
1519 {"re::is_regexp", XS_re_is_regexp, "$"},
1520 {"re::regname", XS_re_regname, ";$$"},
1521 {"re::regnames", XS_re_regnames, ";$"},
1522 {"re::regnames_count", XS_re_regnames_count, ""},
1523 {"re::regexp_pattern", XS_re_regexp_pattern, "$"},
1524 {"Tie::Hash::NamedCapture::FETCH", XS_Tie_Hash_NamedCapture_FETCH, NULL},
1525 {"Tie::Hash::NamedCapture::STORE", XS_Tie_Hash_NamedCapture_STORE, NULL},
1526 {"Tie::Hash::NamedCapture::DELETE", XS_Tie_Hash_NamedCapture_DELETE, NULL},
1527 {"Tie::Hash::NamedCapture::CLEAR", XS_Tie_Hash_NamedCapture_CLEAR, NULL},
1528 {"Tie::Hash::NamedCapture::EXISTS", XS_Tie_Hash_NamedCapture_EXISTS, NULL},
1529 {"Tie::Hash::NamedCapture::FIRSTKEY", XS_Tie_Hash_NamedCapture_FIRSTK, NULL},
1530 {"Tie::Hash::NamedCapture::NEXTKEY", XS_Tie_Hash_NamedCapture_NEXTK, NULL},
1531 {"Tie::Hash::NamedCapture::SCALAR", XS_Tie_Hash_NamedCapture_SCALAR, NULL},
1532 {"Tie::Hash::NamedCapture::flags", XS_Tie_Hash_NamedCapture_flags, NULL}
1536 Perl_boot_core_UNIVERSAL(pTHX)
1539 static const char file[] = __FILE__;
1540 struct xsub_details *xsub = details;
1541 const struct xsub_details *end
1542 = details + sizeof(details) / sizeof(details[0]);
1545 newXS_flags(xsub->name, xsub->xsub, file, xsub->proto, 0);
1546 } while (++xsub < end);
1548 /* register the overloading (type 'A') magic */
1549 PL_amagic_generation++;
1551 /* Providing a Regexp::DESTROY fixes #21347. See test in t/op/ref.t */
1552 CvFILE(newCONSTSUB(get_hv("Regexp::", GV_ADD), "DESTROY", NULL))
1558 * c-indentation-style: bsd
1560 * indent-tabs-mode: t
1563 * ex: set ts=8 sts=4 sw=4 noet: