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 separate XS files which would then be pulled
25 * in by some to-be-written build process.
29 #define PERL_IN_UNIVERSAL_C
32 #if defined(USE_PERLIO)
33 #include "perliol.h" /* For the PERLIO_F_XXX */
37 * Contributed by Graham Barr <Graham.Barr@tiuk.ti.com>
38 * The main guts of traverse_isa was actually copied from gv_fetchmeth
42 S_isa_lookup(pTHX_ HV *stash, const char * const name, STRLEN len, U32 flags)
44 const struct mro_meta *const meta = HvMROMETA(stash);
48 PERL_ARGS_ASSERT_ISA_LOOKUP;
51 (void)mro_get_linear_isa(stash);
55 if (hv_common(isa, NULL, name, len, ( flags & SVf_UTF8 ? HVhek_UTF8 : 0),
56 HV_FETCH_ISEXISTS, NULL, 0)) {
57 /* Direct name lookup worked. */
61 /* A stash/class can go by many names (ie. User == main::User), so
62 we use the HvENAME in the stash itself, which is canonical, falling
63 back to HvNAME if necessary. */
64 our_stash = gv_stashpvn(name, len, flags);
67 HEK *canon_name = HvENAME_HEK(our_stash);
68 if (!canon_name) canon_name = HvNAME_HEK(our_stash);
70 if (hv_common(isa, NULL, HEK_KEY(canon_name), HEK_LEN(canon_name),
71 HEK_FLAGS(canon_name),
72 HV_FETCH_ISEXISTS, NULL, HEK_HASH(canon_name))) {
81 =head1 SV Manipulation Functions
83 =for apidoc sv_derived_from_pvn
85 Returns a boolean indicating whether the SV is derived from the specified class
86 I<at the C level>. To check derivation at the Perl level, call C<isa()> as a
89 Currently, the only significant value for C<flags> is SVf_UTF8.
93 =for apidoc sv_derived_from_sv
95 Exactly like L</sv_derived_from_pvn>, but takes the name string in the form
96 of an SV instead of a string/length pair.
103 Perl_sv_derived_from_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
107 PERL_ARGS_ASSERT_SV_DERIVED_FROM_SV;
108 namepv = SvPV(namesv, namelen);
111 return sv_derived_from_pvn(sv, namepv, namelen, flags);
115 =for apidoc sv_derived_from
117 Exactly like L</sv_derived_from_pv>, but doesn't take a C<flags> parameter.
123 Perl_sv_derived_from(pTHX_ SV *sv, const char *const name)
125 PERL_ARGS_ASSERT_SV_DERIVED_FROM;
126 return sv_derived_from_pvn(sv, name, strlen(name), 0);
130 =for apidoc sv_derived_from_pv
132 Exactly like L</sv_derived_from_pvn>, but takes a nul-terminated string
133 instead of a string/length pair.
140 Perl_sv_derived_from_pv(pTHX_ SV *sv, const char *const name, U32 flags)
142 PERL_ARGS_ASSERT_SV_DERIVED_FROM_PV;
143 return sv_derived_from_pvn(sv, name, strlen(name), flags);
147 Perl_sv_derived_from_pvn(pTHX_ SV *sv, const char *const name, const STRLEN len, U32 flags)
151 PERL_ARGS_ASSERT_SV_DERIVED_FROM_PVN;
158 type = sv_reftype(sv,0);
159 if (type && strEQ(type,name))
166 stash = gv_stashsv(sv, 0);
169 if (stash && isa_lookup(stash, name, len, flags))
172 stash = gv_stashpvs("UNIVERSAL", 0);
173 return stash && isa_lookup(stash, name, len, flags);
177 =for apidoc sv_does_sv
179 Returns a boolean indicating whether the SV performs a specific, named role.
180 The SV can be a Perl object or the name of a Perl class.
187 /* a special string address whose value is "isa", but whicb perl knows
188 * to treat as if it were really "DOES" */
189 char PL_isa_DOES[] = "isa";
192 Perl_sv_does_sv(pTHX_ SV *sv, SV *namesv, U32 flags)
199 PERL_ARGS_ASSERT_SV_DOES_SV;
200 PERL_UNUSED_ARG(flags);
207 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv)))) {
212 if (SvROK(sv) && SvOBJECT(SvRV(sv))) {
213 classname = sv_ref(NULL,SvRV(sv),TRUE);
218 if (sv_eq(classname, namesv)) {
229 /* create a PV with value "isa", but with a special address
230 * so that perl knows were' realling doing "DOES" instead */
231 methodname = newSV_type(SVt_PV);
232 SvLEN(methodname) = 0;
233 SvCUR(methodname) = strlen(PL_isa_DOES);
234 SvPVX(methodname) = PL_isa_DOES;
235 SvPOK_on(methodname);
236 sv_2mortal(methodname);
237 call_sv(methodname, G_SCALAR | G_METHOD);
240 does_it = SvTRUE( TOPs );
250 Like L</sv_does_pv>, but doesn't take a C<flags> parameter.
256 Perl_sv_does(pTHX_ SV *sv, const char *const name)
258 PERL_ARGS_ASSERT_SV_DOES;
259 return sv_does_sv(sv, newSVpvn_flags(name, strlen(name), SVs_TEMP), 0);
263 =for apidoc sv_does_pv
265 Like L</sv_does_sv>, but takes a nul-terminated string instead of an SV.
272 Perl_sv_does_pv(pTHX_ SV *sv, const char *const name, U32 flags)
274 PERL_ARGS_ASSERT_SV_DOES_PV;
275 return sv_does_sv(sv, newSVpvn_flags(name, strlen(name), SVs_TEMP | flags), flags);
279 =for apidoc sv_does_pvn
281 Like L</sv_does_sv>, but takes a string/length pair instead of an SV.
287 Perl_sv_does_pvn(pTHX_ SV *sv, const char *const name, const STRLEN len, U32 flags)
289 PERL_ARGS_ASSERT_SV_DOES_PVN;
291 return sv_does_sv(sv, newSVpvn_flags(name, len, flags | SVs_TEMP), flags);
295 =for apidoc croak_xs_usage
297 A specialised variant of C<croak()> for emitting the usage message for xsubs
299 croak_xs_usage(cv, "eee_yow");
301 works out the package name and subroutine name from C<cv>, and then calls
302 C<croak()>. Hence if C<cv> is C<&ouch::awk>, it would call C<croak> as:
304 Perl_croak(aTHX_ "Usage: %" SVf "::%" SVf "(%s)", "ouch" "awk",
311 Perl_croak_xs_usage(const CV *const cv, const char *const params)
313 /* Avoid CvGV as it requires aTHX. */
314 const GV *gv = CvNAMED(cv) ? NULL : cv->sv_any->xcv_gv_u.xcv_gv;
316 PERL_ARGS_ASSERT_CROAK_XS_USAGE;
319 const HV *const stash = GvSTASH(gv);
321 if (HvNAME_get(stash))
322 /* diag_listed_as: SKIPME */
323 Perl_croak_nocontext("Usage: %" HEKf "::%" HEKf "(%s)",
324 HEKfARG(HvNAME_HEK(stash)),
325 HEKfARG(GvNAME_HEK(gv)),
328 /* diag_listed_as: SKIPME */
329 Perl_croak_nocontext("Usage: %" HEKf "(%s)",
330 HEKfARG(GvNAME_HEK(gv)), params);
333 if ((gv = CvGV(cv))) goto got_gv;
335 /* Pants. I don't think that it should be possible to get here. */
336 /* diag_listed_as: SKIPME */
337 Perl_croak(aTHX_ "Usage: CODE(0x%" UVxf ")(%s)", PTR2UV(cv), params);
341 XS(XS_UNIVERSAL_isa); /* prototype to pass -Wmissing-prototypes */
347 croak_xs_usage(cv, "reference, kind");
349 SV * const sv = ST(0);
353 if (!SvOK(sv) || !(SvROK(sv) || (SvPOK(sv) && SvCUR(sv))))
356 ST(0) = boolSV(sv_derived_from_sv(sv, ST(1), 0));
361 XS(XS_UNIVERSAL_can); /* prototype to pass -Wmissing-prototypes */
371 croak_xs_usage(cv, "object-ref, method");
377 /* Reject undef and empty string. Note that the string form takes
378 precedence here over the numeric form, as (!1)->foo treats the
379 invocant as the empty string, though it is a dualvar. */
380 if (!SvOK(sv) || (SvPOK(sv) && !SvCUR(sv)))
386 sv = MUTABLE_SV(SvRV(sv));
389 else if (isGV_with_GP(sv) && GvIO(sv))
390 pkg = SvSTASH(GvIO(sv));
392 else if (isGV_with_GP(sv) && GvIO(sv))
393 pkg = SvSTASH(GvIO(sv));
394 else if ((iogv = gv_fetchsv_nomg(sv, 0, SVt_PVIO)) && GvIO(iogv))
395 pkg = SvSTASH(GvIO(iogv));
397 pkg = gv_stashsv(sv, 0);
399 pkg = gv_stashpvs("UNIVERSAL", 0);
403 GV * const gv = gv_fetchmethod_sv_flags(pkg, ST(1), 0);
405 rv = sv_2mortal(newRV(MUTABLE_SV(GvCV(gv))));
412 XS(XS_UNIVERSAL_DOES); /* prototype to pass -Wmissing-prototypes */
413 XS(XS_UNIVERSAL_DOES)
419 Perl_croak(aTHX_ "Usage: invocant->DOES(kind)");
421 SV * const sv = ST(0);
422 if (sv_does_sv( sv, ST(1), 0 ))
429 XS(XS_utf8_is_utf8); /* prototype to pass -Wmissing-prototypes */
434 croak_xs_usage(cv, "sv");
436 SV * const sv = ST(0);
446 XS(XS_utf8_valid); /* prototype to pass -Wmissing-prototypes */
451 croak_xs_usage(cv, "sv");
453 SV * const sv = ST(0);
455 const char * const s = SvPV_const(sv,len);
456 if (!SvUTF8(sv) || is_utf8_string((const U8*)s,len))
464 XS(XS_utf8_encode); /* prototype to pass -Wmissing-prototypes */
469 croak_xs_usage(cv, "sv");
470 sv_utf8_encode(ST(0));
475 XS(XS_utf8_decode); /* prototype to pass -Wmissing-prototypes */
480 croak_xs_usage(cv, "sv");
482 SV * const sv = ST(0);
484 SvPV_force_nolen(sv);
485 RETVAL = sv_utf8_decode(sv);
487 ST(0) = boolSV(RETVAL);
492 XS(XS_utf8_upgrade); /* prototype to pass -Wmissing-prototypes */
497 croak_xs_usage(cv, "sv");
499 SV * const sv = ST(0);
503 RETVAL = sv_utf8_upgrade(sv);
504 XSprePUSH; PUSHi((IV)RETVAL);
509 XS(XS_utf8_downgrade); /* prototype to pass -Wmissing-prototypes */
510 XS(XS_utf8_downgrade)
513 if (items < 1 || items > 2)
514 croak_xs_usage(cv, "sv, failok=0");
516 SV * const sv = ST(0);
517 const bool failok = (items < 2) ? 0 : SvTRUE(ST(1)) ? 1 : 0;
518 const bool RETVAL = sv_utf8_downgrade(sv, failok);
520 ST(0) = boolSV(RETVAL);
525 XS(XS_utf8_native_to_unicode); /* prototype to pass -Wmissing-prototypes */
526 XS(XS_utf8_native_to_unicode)
529 const UV uv = SvUV(ST(0));
532 croak_xs_usage(cv, "sv");
534 ST(0) = sv_2mortal(newSVuv(NATIVE_TO_UNI(uv)));
538 XS(XS_utf8_unicode_to_native); /* prototype to pass -Wmissing-prototypes */
539 XS(XS_utf8_unicode_to_native)
542 const UV uv = SvUV(ST(0));
545 croak_xs_usage(cv, "sv");
547 ST(0) = sv_2mortal(newSVuv(UNI_TO_NATIVE(uv)));
551 XS(XS_Internals_SvREADONLY); /* prototype to pass -Wmissing-prototypes */
552 XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
555 SV * const svz = ST(0);
558 /* [perl #77776] - called as &foo() not foo() */
560 croak_xs_usage(cv, "SCALAR[, ON]");
570 else if (items == 2) {
572 SvFLAGS(sv) |= SVf_READONLY;
576 /* I hope you really know what you are doing. */
577 SvFLAGS(sv) &=~ SVf_READONLY;
581 XSRETURN_UNDEF; /* Can't happen. */
584 XS(XS_constant__make_const); /* prototype to pass -Wmissing-prototypes */
585 XS(XS_constant__make_const) /* This is dangerous stuff. */
588 SV * const svz = ST(0);
591 /* [perl #77776] - called as &foo() not foo() */
592 if (!SvROK(svz) || items != 1)
593 croak_xs_usage(cv, "SCALAR");
598 if (SvTYPE(sv) == SVt_PVAV && AvFILLp(sv) != -1) {
599 /* for constant.pm; nobody else should be calling this
602 for (svp = AvARRAY(sv) + AvFILLp(sv)
605 if (*svp) SvPADTMP_on(*svp);
610 XS(XS_Internals_SvREFCNT); /* prototype to pass -Wmissing-prototypes */
611 XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
614 SV * const svz = ST(0);
618 /* [perl #77776] - called as &foo() not foo() */
619 if ((items != 1 && items != 2) || !SvROK(svz))
620 croak_xs_usage(cv, "SCALAR[, REFCOUNT]");
624 /* I hope you really know what you are doing. */
625 /* idea is for SvREFCNT(sv) to be accessed only once */
626 refcnt = items == 2 ?
627 /* we free one ref on exit */
628 (SvREFCNT(sv) = SvUV(ST(1)) + 1)
630 XSRETURN_UV(refcnt - 1); /* Minus the ref created for us. */
634 XS(XS_Internals_hv_clear_placehold); /* prototype to pass -Wmissing-prototypes */
635 XS(XS_Internals_hv_clear_placehold)
639 if (items != 1 || !SvROK(ST(0)))
640 croak_xs_usage(cv, "hv");
642 HV * const hv = MUTABLE_HV(SvRV(ST(0)));
643 hv_clear_placeholders(hv);
648 XS(XS_PerlIO_get_layers); /* prototype to pass -Wmissing-prototypes */
649 XS(XS_PerlIO_get_layers)
652 if (items < 1 || items % 2 == 0)
653 croak_xs_usage(cv, "filehandle[,args]");
654 #if defined(USE_PERLIO)
660 bool details = FALSE;
664 for (svp = MARK + 2; svp <= SP; svp += 2) {
665 SV * const * const varp = svp;
666 SV * const * const valp = svp + 1;
668 const char * const key = SvPV_const(*varp, klen);
672 if (memEQs(key, klen, "input")) {
673 input = SvTRUE(*valp);
678 if (memEQs(key, klen, "output")) {
679 input = !SvTRUE(*valp);
684 if (memEQs(key, klen, "details")) {
685 details = SvTRUE(*valp);
692 "get_layers: unknown argument '%s'",
701 gv = MAYBE_DEREF_GV(sv);
703 if (!gv && !SvROK(sv))
704 gv = gv_fetchsv_nomg(sv, 0, SVt_PVIO);
706 if (gv && (io = GvIO(gv))) {
707 AV* const av = PerlIO_get_layers(aTHX_ input ?
708 IoIFP(io) : IoOFP(io));
710 const SSize_t last = av_tindex(av);
713 for (i = last; i >= 0; i -= 3) {
714 SV * const * const namsvp = av_fetch(av, i - 2, FALSE);
715 SV * const * const argsvp = av_fetch(av, i - 1, FALSE);
716 SV * const * const flgsvp = av_fetch(av, i, FALSE);
718 const bool namok = namsvp && *namsvp && SvPOK(*namsvp);
719 const bool argok = argsvp && *argsvp && SvPOK(*argsvp);
720 const bool flgok = flgsvp && *flgsvp && SvIOK(*flgsvp);
722 EXTEND(SP, 3); /* Three is the max in all branches: better check just once */
724 /* Indents of 5? Yuck. */
725 /* We know that PerlIO_get_layers creates a new SV for
726 the name and flags, so we can just take a reference
727 and "steal" it when we free the AV below. */
729 ? sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp))
732 ? newSVpvn_flags(SvPVX_const(*argsvp),
734 (SvUTF8(*argsvp) ? SVf_UTF8 : 0)
738 ? sv_2mortal(SvREFCNT_inc_simple_NN(*flgsvp))
744 PUSHs(sv_2mortal(Perl_newSVpvf(aTHX_ "%" SVf "(%" SVf ")",
748 PUSHs(sv_2mortal(SvREFCNT_inc_simple_NN(*namsvp)));
753 const IV flags = SvIVX(*flgsvp);
755 if (flags & PERLIO_F_UTF8) {
756 PUSHs(newSVpvs_flags("utf8", SVs_TEMP));
773 XS(XS_re_is_regexp); /* prototype to pass -Wmissing-prototypes */
779 croak_xs_usage(cv, "sv");
788 XS(XS_re_regnames_count); /* prototype to pass -Wmissing-prototypes */
789 XS(XS_re_regnames_count)
791 REGEXP *rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
796 croak_xs_usage(cv, "");
801 ret = CALLREG_NAMED_BUFF_COUNT(rx);
804 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
808 XS(XS_re_regname); /* prototype to pass -Wmissing-prototypes */
816 if (items < 1 || items > 2)
817 croak_xs_usage(cv, "name[, all ]");
822 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
827 if (items == 2 && SvTRUE(ST(1))) {
832 ret = CALLREG_NAMED_BUFF_FETCH(rx, ST(0), (flags | RXapif_REGNAME));
835 PUSHs(ret ? sv_2mortal(ret) : &PL_sv_undef);
840 XS(XS_re_regnames); /* prototype to pass -Wmissing-prototypes */
853 croak_xs_usage(cv, "[all]");
855 rx = PL_curpm ? PM_GETRE(PL_curpm) : NULL;
860 if (items == 1 && SvTRUE(ST(0))) {
869 ret = CALLREG_NAMED_BUFF_ALL(rx, (flags | RXapif_REGNAMES));
876 av = MUTABLE_AV(SvRV(ret));
877 length = av_tindex(av);
879 EXTEND(SP, length+1); /* better extend stack just once */
880 for (i = 0; i <= length; i++) {
881 entry = av_fetch(av, i, FALSE);
884 Perl_croak(aTHX_ "NULL array element in re::regnames()");
886 mPUSHs(SvREFCNT_inc_simple_NN(*entry));
895 XS(XS_re_regexp_pattern); /* prototype to pass -Wmissing-prototypes */
896 XS(XS_re_regexp_pattern)
900 U8 const gimme = GIMME_V;
905 croak_xs_usage(cv, "sv");
908 Checks if a reference is a regex or not. If the parameter is
909 not a ref, or is not the result of a qr// then returns false
910 in scalar context and an empty list in list context.
911 Otherwise in list context it returns the pattern and the
912 modifiers, in scalar context it returns the pattern just as it
913 would if the qr// was stringified normally, regardless as
914 to the class of the variable and any stringification overloads
918 if ((re = SvRX(ST(0)))) /* assign deliberate */
920 /* Houston, we have a regex! */
923 if ( gimme == G_ARRAY ) {
925 char reflags[sizeof(INT_PAT_MODS) + MAX_CHARSET_NAME_LENGTH];
931 we are in list context so stringify
932 the modifiers that apply. We ignore "negative
933 modifiers" in this scenario, and the default character set
936 if (get_regex_charset(RX_EXTFLAGS(re)) != REGEX_DEPENDS_CHARSET) {
938 const char* const name = get_regex_charset_name(RX_EXTFLAGS(re),
940 Copy(name, reflags + left, len, char);
944 match_flags = (U16)((RX_EXTFLAGS(re) & RXf_PMf_COMPILETIME)
945 >> RXf_PMf_STD_PMMOD_SHIFT);
947 while((ch = *fptr++)) {
948 if(match_flags & 1) {
949 reflags[left++] = ch;
954 pattern = newSVpvn_flags(RX_PRECOMP(re),RX_PRELEN(re),
955 (RX_UTF8(re) ? SVf_UTF8 : 0) | SVs_TEMP);
957 /* return the pattern and the modifiers */
959 PUSHs(newSVpvn_flags(reflags, left, SVs_TEMP));
962 /* Scalar, so use the string that Perl would return */
963 /* return the pattern in (?msixn:..) format */
964 pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));
969 /* It ain't a regexp folks */
970 if ( gimme == G_ARRAY ) {
971 /* return the empty list */
974 /* Because of the (?:..) wrapping involved in a
975 stringified pattern it is impossible to get a
976 result for a real regexp that would evaluate to
977 false. Therefore we can return PL_sv_no to signify
978 that the object is not a regex, this means that one
981 if (regex($might_be_a_regex) eq '(?:foo)') { }
983 and not worry about undefined values.
988 NOT_REACHED; /* NOTREACHED */
994 struct xsub_details {
1000 static const struct xsub_details details[] = {
1001 {"UNIVERSAL::isa", XS_UNIVERSAL_isa, NULL},
1002 {"UNIVERSAL::can", XS_UNIVERSAL_can, NULL},
1003 {"UNIVERSAL::DOES", XS_UNIVERSAL_DOES, NULL},
1004 #define VXS_XSUB_DETAILS
1006 #undef VXS_XSUB_DETAILS
1007 {"utf8::is_utf8", XS_utf8_is_utf8, NULL},
1008 {"utf8::valid", XS_utf8_valid, NULL},
1009 {"utf8::encode", XS_utf8_encode, NULL},
1010 {"utf8::decode", XS_utf8_decode, NULL},
1011 {"utf8::upgrade", XS_utf8_upgrade, NULL},
1012 {"utf8::downgrade", XS_utf8_downgrade, NULL},
1013 {"utf8::native_to_unicode", XS_utf8_native_to_unicode, NULL},
1014 {"utf8::unicode_to_native", XS_utf8_unicode_to_native, NULL},
1015 {"Internals::SvREADONLY", XS_Internals_SvREADONLY, "\\[$%@];$"},
1016 {"Internals::SvREFCNT", XS_Internals_SvREFCNT, "\\[$%@];$"},
1017 {"Internals::hv_clear_placeholders", XS_Internals_hv_clear_placehold, "\\%"},
1018 {"constant::_make_const", XS_constant__make_const, "\\[$@]"},
1019 {"PerlIO::get_layers", XS_PerlIO_get_layers, "*;@"},
1020 {"re::is_regexp", XS_re_is_regexp, "$"},
1021 {"re::regname", XS_re_regname, ";$$"},
1022 {"re::regnames", XS_re_regnames, ";$"},
1023 {"re::regnames_count", XS_re_regnames_count, ""},
1024 {"re::regexp_pattern", XS_re_regexp_pattern, "$"},
1028 optimize_out_native_convert_function(pTHX_ OP* entersubop,
1032 /* Optimizes out an identity function, i.e., one that just returns its
1033 * argument. The passed in function is assumed to be an identity function,
1034 * with no checking. This is designed to be called for utf8_to_native()
1035 * and native_to_utf8() on ASCII platforms, as they just return their
1036 * arguments, but it could work on any such function.
1038 * The code is mostly just cargo-culted from Memoize::Lift */
1042 SV* prototype = newSVpvs("$");
1044 PERL_UNUSED_ARG(protosv);
1046 assert(entersubop->op_type == OP_ENTERSUB);
1048 entersubop = ck_entersub_args_proto(entersubop, namegv, prototype);
1049 parent = entersubop;
1051 SvREFCNT_dec(prototype);
1053 pushop = cUNOPx(entersubop)->op_first;
1054 if (! OpHAS_SIBLING(pushop)) {
1056 pushop = cUNOPx(pushop)->op_first;
1058 argop = OpSIBLING(pushop);
1060 /* Carry on without doing the optimization if it is not something we're
1061 * expecting, so continues to work */
1063 || ! OpHAS_SIBLING(argop)
1064 || OpHAS_SIBLING(OpSIBLING(argop))
1069 /* cut argop from the subtree */
1070 (void)op_sibling_splice(parent, pushop, 1, NULL);
1072 op_free(entersubop);
1077 Perl_boot_core_UNIVERSAL(pTHX)
1079 static const char file[] = __FILE__;
1080 const struct xsub_details *xsub = details;
1081 const struct xsub_details *end = C_ARRAY_END(details);
1084 newXS_flags(xsub->name, xsub->xsub, file, xsub->proto, 0);
1085 } while (++xsub < end);
1088 { /* On ASCII platforms these functions just return their argument, so can
1089 be optimized away */
1091 CV* to_native_cv = get_cv("utf8::unicode_to_native", 0);
1092 CV* to_unicode_cv = get_cv("utf8::native_to_unicode", 0);
1094 cv_set_call_checker(to_native_cv,
1095 optimize_out_native_convert_function,
1096 (SV*) to_native_cv);
1097 cv_set_call_checker(to_unicode_cv,
1098 optimize_out_native_convert_function,
1099 (SV*) to_unicode_cv);
1103 /* Providing a Regexp::DESTROY fixes #21347. See test in t/op/ref.t */
1106 newCONSTSUB(get_hv("Regexp::", GV_ADD), "DESTROY", NULL);
1107 char ** cvfile = &CvFILE(cv);
1108 char * oldfile = *cvfile;
1110 *cvfile = (char *)file;
1116 * ex: set ts=8 sts=4 sw=4 et: