summaryrefslogtreecommitdiff
path: root/universal.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2013-12-25 18:02:57 -0800
committerFather Chrysostomos <sprout@cpan.org>2013-12-26 17:54:26 -0800
commit2c6c1df5c2ddebe97be50ffbfbe1f5a2cf113eb1 (patch)
tree655e3eebb7adbde2f11101723e7fb61f5d5e00dc /universal.c
parent88df5f01a6650d6895e7d3f03d1b340ca2506b05 (diff)
downloadperl-2c6c1df5c2ddebe97be50ffbfbe1f5a2cf113eb1.tar.gz
Remove constant.pm-specific behaviour from Internals::SvREADONLY
Some stuff on CPAN is using this undocumented function, so give constant.pm its own. It is already a core module, depending on functionality provided by the core solely for its sake; so this does not really change its relationship to the core.
Diffstat (limited to 'universal.c')
-rw-r--r--universal.c41
1 files changed, 32 insertions, 9 deletions
diff --git a/universal.c b/universal.c
index 969acbd03a..b217c14280 100644
--- a/universal.c
+++ b/universal.c
@@ -940,15 +940,6 @@ XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
if (SvIsCOW(sv)) sv_force_normal(sv);
#endif
SvREADONLY_on(sv);
- if (SvTYPE(sv) == SVt_PVAV && AvFILLp(sv) != -1) {
- /* for constant.pm; nobody else should be calling this
- on arrays anyway. */
- SV **svp;
- for (svp = AvARRAY(sv) + AvFILLp(sv)
- ; svp >= AvARRAY(sv)
- ; --svp)
- if (*svp) SvPADTMP_on(*svp);
- }
XSRETURN_YES;
}
else {
@@ -959,6 +950,37 @@ XS(XS_Internals_SvREADONLY) /* This is dangerous stuff. */
}
XSRETURN_UNDEF; /* Can't happen. */
}
+
+XS(XS_constant__make_const) /* This is dangerous stuff. */
+{
+ dVAR;
+ dXSARGS;
+ SV * const svz = ST(0);
+ SV * sv;
+ PERL_UNUSED_ARG(cv);
+
+ /* [perl #77776] - called as &foo() not foo() */
+ if (!SvROK(svz) || items != 1)
+ croak_xs_usage(cv, "SCALAR");
+
+ sv = SvRV(svz);
+
+#ifdef PERL_OLD_COPY_ON_WRITE
+ if (SvIsCOW(sv)) sv_force_normal(sv);
+#endif
+ SvREADONLY_on(sv);
+ if (SvTYPE(sv) == SVt_PVAV && AvFILLp(sv) != -1) {
+ /* for constant.pm; nobody else should be calling this
+ on arrays anyway. */
+ SV **svp;
+ for (svp = AvARRAY(sv) + AvFILLp(sv)
+ ; svp >= AvARRAY(sv)
+ ; --svp)
+ if (*svp) SvPADTMP_on(*svp);
+ }
+ XSRETURN(0);
+}
+
XS(XS_Internals_SvREFCNT) /* This is dangerous stuff. */
{
dVAR;
@@ -1398,6 +1420,7 @@ static const struct xsub_details details[] = {
{"utf8::native_to_unicode", XS_utf8_native_to_unicode, NULL},
{"utf8::unicode_to_native", XS_utf8_unicode_to_native, NULL},
{"Internals::SvREADONLY", XS_Internals_SvREADONLY, "\\[$%@];$"},
+ {"constant::_make_const", XS_constant__make_const, "\\[$@]"},
{"Internals::SvREFCNT", XS_Internals_SvREFCNT, "\\[$%@];$"},
{"Internals::hv_clear_placeholders", XS_Internals_hv_clear_placehold, "\\%"},
{"PerlIO::get_layers", XS_PerlIO_get_layers, "*;@"},