summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2004-07-12 21:36:51 +0000
committerNicholas Clark <nick@ccl4.org>2004-07-12 21:36:51 +0000
commitd6e8a19203a9e1ef15ec2b593c075d7c70ec05da (patch)
tree8194acf827d8aedd139786095fb74d222ba4e078
parent65f55033b37274f1c98d7ded95c208752a2a0d82 (diff)
downloadperl-d6e8a19203a9e1ef15ec2b593c075d7c70ec05da.tar.gz
Integrate:
[ 23076] Perl_mode_from_discipline must update len. (else SEGV) Diagnosis and patch from clkao [ 23083] Perl_is_utf8_string(pTHX_ U8 *s, STRLEN len) Can now handle the case is_utf8_string(NULL,0) again. Why do we have code dup for Perl_is_utf8_string_loc() ? [ 23084] NI-S: IMHO utf8_upgrade is just changing representation not the value so it has no business calling SvSETMAGIC. [ 23085] Bodge to make Tk work - like the UTF8 flag, the READONLY flag has too many meanings. const const vs mutable in this case. p4raw-link: @23085 on //depot/perl: d52b7888e9c3eb0ccb038b7c44075ba28e8fefa6 p4raw-link: @23084 on //depot/perl: 7a5fa8a2cb05d06ee722842024d6960f349f483b p4raw-link: @23083 on //depot/perl: 61468b033262a3098f06f5437d4f3f1f301cacb3 p4raw-link: @23076 on //depot/perl: 18a33fb59fd6afeb2aae93e4a139e231623b401f p4raw-id: //depot/maint-5.8/perl@23087 p4raw-edited: from //depot/perl@23086 'edit in' sv.c (@23084..) p4raw-integrated: from //depot/perl@23086 'copy in' utf8.c (@22764..) 'merge in' doio.c (@22741..)
-rw-r--r--doio.c1
-rw-r--r--sv.c10
-rw-r--r--utf8.c4
3 files changed, 10 insertions, 5 deletions
diff --git a/doio.c b/doio.c
index e452bc3a4e..97a6603869 100644
--- a/doio.c
+++ b/doio.c
@@ -1172,6 +1172,7 @@ fail_discipline:
#ifndef PERLIO_LAYERS
Perl_croak(aTHX_ "IO layers (like '%.*s') unavailable", end-s, s);
#else
+ len -= end-s;
s = end;
#endif
}
diff --git a/sv.c b/sv.c
index 806a838329..5ce1e59e9d 100644
--- a/sv.c
+++ b/sv.c
@@ -3451,11 +3451,16 @@ Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
return 0;
if (!SvPOK(sv)) {
STRLEN len = 0;
- (void) SvPV_force(sv,len);
+ if (SvREADONLY(sv) && (SvPOKp(sv) || SvIOKp(sv) || SvNOKp(sv))) {
+ (void) sv_2pv_flags(sv,&len, flags);
+ if (SvUTF8(sv))
+ return len;
+ } else {
+ (void) SvPV_force(sv,len);
+ }
}
if (SvUTF8(sv)) {
- SvSETMAGIC(sv);
return SvCUR(sv);
}
@@ -3492,7 +3497,6 @@ Perl_sv_utf8_upgrade_flags(pTHX_ register SV *sv, I32 flags)
/* Mark as UTF-8 even if no hibit - saves scanning loop */
SvUTF8_on(sv);
}
- SvSETMAGIC(sv);
return SvCUR(sv);
}
diff --git a/utf8.c b/utf8.c
index 6f201a23f1..6155fabe3c 100644
--- a/utf8.c
+++ b/utf8.c
@@ -232,7 +232,7 @@ Perl_is_utf8_string(pTHX_ U8 *s, STRLEN len)
U8* send;
STRLEN c;
- if (!len)
+ if (!len && s)
len = strlen((char *)s);
send = s + len;
@@ -272,7 +272,7 @@ Perl_is_utf8_string_loc(pTHX_ U8 *s, STRLEN len, U8 **p)
U8* send;
STRLEN c;
- if (!len)
+ if (!len && s)
len = strlen((char *)s);
send = s + len;