/* doop.c
*
- * Copyright (c) 1991-2001, Larry Wall
+ * Copyright (c) 1991-2002, Larry Wall
*
* You may distribute under the terms of either the GNU General Public
* License or the Artistic License, as specified in the README file.
}
STATIC I32
-S_do_trans_count(pTHX_ SV *sv)/* SPC - OK */
+S_do_trans_count(pTHX_ SV *sv)
{
U8 *s;
U8 *send;
}
STATIC I32
-S_do_trans_complex(pTHX_ SV *sv)/* SPC - NOT OK */
+S_do_trans_complex(pTHX_ SV *sv)
{
U8 *s;
U8 *send;
}
STATIC I32
-S_do_trans_simple_utf8(pTHX_ SV *sv)/* SPC - OK */
+S_do_trans_simple_utf8(pTHX_ SV *sv)
{
U8 *s;
U8 *send;
}
SvSETMAGIC(sv);
SvUTF8_on(sv);
- /* Downgrading just 'cos it will is suspect - NI-S */
- if (!isutf8 && !(PL_hints & HINT_UTF8))
- sv_utf8_downgrade(sv, TRUE);
return matches;
}
STATIC I32
-S_do_trans_count_utf8(pTHX_ SV *sv)/* SPC - OK */
+S_do_trans_count_utf8(pTHX_ SV *sv)
{
U8 *s;
U8 *start = 0, *send;
}
STATIC I32
-S_do_trans_complex_utf8(pTHX_ SV *sv) /* SPC - NOT OK */
+S_do_trans_complex_utf8(pTHX_ SV *sv)
{
U8 *s;
U8 *start, *send;
SvCUR_set(sv, d - dstart);
}
SvUTF8_on(sv);
- if (!isutf8 && !(PL_hints & HINT_UTF8))
- sv_utf8_downgrade(sv, TRUE);
SvSETMAGIC(sv);
return matches;
I32 hasutf = (PL_op->op_private &
(OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF));
- if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
- Perl_croak(aTHX_ PL_no_modify);
-
+ if (SvREADONLY(sv)) {
+ if (SvFAKE(sv))
+ sv_force_normal(sv);
+ if (SvREADONLY(sv) && !(PL_op->op_private & OPpTRANS_IDENTICAL))
+ Perl_croak(aTHX_ PL_no_modify);
+ }
(void)SvPV(sv, len);
if (!len)
return 0;
char *pat = SvPV(*sarg, patlen);
bool do_taint = FALSE;
+ SvUTF8_off(sv);
+ if (DO_UTF8(*sarg))
+ SvUTF8_on(sv);
sv_vsetpvfn(sv, pat, patlen, Null(va_list*), sarg + 1, len - 1, &do_taint);
SvSETMAGIC(sv);
if (do_taint)
#ifdef UV_IS_QUAD
else if (size == 64) {
if (ckWARN(WARN_PORTABLE))
- Perl_warner(aTHX_ WARN_PORTABLE,
+ Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
"Bit vector size > 32 non-portable");
if (offset >= srclen)
retnum = 0;
#ifdef UV_IS_QUAD
else if (size == 64) {
if (ckWARN(WARN_PORTABLE))
- Perl_warner(aTHX_ WARN_PORTABLE,
+ Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
"Bit vector size > 32 non-portable");
retnum =
((UV) s[offset ] << 56) +
lval = SvUV(sv);
offset = LvTARGOFF(sv);
if (offset < 0)
- Perl_croak(aTHX_ "Assigning to negative offset in vec");
+ Perl_croak(aTHX_ "Negative offset to vec in lvalue context");
size = LvTARGLEN(sv);
if (size < 1 || (size & (size-1))) /* size < 1 or not a power of two */
Perl_croak(aTHX_ "Illegal number of bits in vec");
#ifdef UV_IS_QUAD
else if (size == 64) {
if (ckWARN(WARN_PORTABLE))
- Perl_warner(aTHX_ WARN_PORTABLE,
+ Perl_warner(aTHX_ packWARN(WARN_PORTABLE),
"Bit vector size > 32 non-portable");
s[offset ] = (lval >> 56) & 0xff;
s[offset+1] = (lval >> 48) & 0xff;
do_chop(astr,hv_iterval(hv,entry));
return;
}
- else if (SvREADONLY(sv))
- Perl_croak(aTHX_ PL_no_modify);
+ else if (SvREADONLY(sv)) {
+ if (SvFAKE(sv)) {
+ /* SV is copy-on-write */
+ sv_force_normal_flags(sv, 0);
+ }
+ if (SvREADONLY(sv))
+ Perl_croak(aTHX_ PL_no_modify);
+ }
s = SvPV(sv, len);
if (len && !SvPOK(sv))
s = SvPV_force(sv, len);
count += do_chomp(hv_iterval(hv,entry));
return count;
}
- else if (SvREADONLY(sv))
- Perl_croak(aTHX_ PL_no_modify);
+ else if (SvREADONLY(sv)) {
+ if (SvFAKE(sv)) {
+ /* SV is copy-on-write */
+ sv_force_normal_flags(sv, 0);
+ }
+ if (SvREADONLY(sv))
+ Perl_croak(aTHX_ PL_no_modify);
+ }
s = SvPV(sv, len);
if (s && len) {
s += --len;
PUTBACK; /* hv_iternext and hv_iterval might clobber stack_sp */
while ((entry = hv_iternext(keys))) {
SPAGAIN;
- if (dokeys)
- XPUSHs(hv_iterkeysv(entry)); /* won't clobber stack_sp */
+ if (dokeys) {
+ SV* sv = hv_iterkeysv(entry);
+ XPUSHs(sv); /* won't clobber stack_sp */
+ }
if (dovalues) {
PUTBACK;
tmpstr = realhv ?