summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-11 23:53:21 +0000
committermatz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-08-11 23:53:21 +0000
commitf4344f827925f87b2b57fd28469416445ce2547c (patch)
treef4835c43fed50c9d1e47e0374dce1ddc8cd9ec4f
parent3ccf45d5df944aa274ee5af054bf89b211a6ffa2 (diff)
downloadruby-f4344f827925f87b2b57fd28469416445ce2547c.tar.gz
ruby-f4344f827925f87b2b57fd28469416445ce2547c.tar.xz
ruby-f4344f827925f87b2b57fd28469416445ce2547c.zip
* sprintf.c (rb_str_format): should preserve format encoding
before raising CompatibilityError. [ruby-list:46274] git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@24507 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog5
-rw-r--r--sprintf.c10
2 files changed, 10 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index dcd2bbe11..b2f55e0eb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Aug 12 08:39:15 2009 Yukihiro Matsumoto <matz@ruby-lang.org>
+
+ * sprintf.c (rb_str_format): should preserve format encoding
+ before raising CompatibilityError. [ruby-list:46274]
+
Wed Aug 12 07:41:31 2009 NARUSE, Yui <naruse@ruby-lang.org>
* encoding.c (rb_enc_compatible): If a string is empty and
diff --git a/sprintf.c b/sprintf.c
index 6cb024fdd..4a37ecb8b 100644
--- a/sprintf.c
+++ b/sprintf.c
@@ -482,6 +482,10 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
for (t = p; t < end && *t != '%'; t++) ;
PUSH(p, t - p);
+ if (coderange != ENC_CODERANGE_BROKEN && scanned < blen) {
+ scanned = rb_str_coderange_scan_restartable(buf+scanned, buf+blen, enc, &coderange);
+ ENC_CODERANGE_SET(result, coderange);
+ }
if (t >= end) {
/* end of fmt string */
goto sprint_exit;
@@ -673,7 +677,7 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
(cr == ENC_CODERANGE_UNKNOWN ?
ENC_CODERANGE_BROKEN : (coderange = cr)));
}
- enc = rb_enc_check(result, str);
+ enc = rb_enc_check((RSTRING_LEN(result) == 0 ? fmt : result), str);
if (flags&(FPREC|FWIDTH)) {
slen = rb_enc_strlen(RSTRING_PTR(str),RSTRING_END(str),enc);
if (slen < 0) {
@@ -1055,10 +1059,6 @@ rb_str_format(int argc, const VALUE *argv, VALUE fmt)
if (RTEST(ruby_debug)) rb_raise(rb_eArgError, "%s", mesg);
if (RTEST(ruby_verbose)) rb_warn("%s", mesg);
}
- if (scanned < blen) {
- rb_str_coderange_scan_restartable(buf+scanned, buf+blen, enc, &coderange);
- ENC_CODERANGE_SET(result, coderange);
- }
rb_str_resize(result, blen);
if (tainted) OBJ_TAINT(result);