summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--ext/stringio/stringio.c16
-rw-r--r--test/stringio/test_stringio.rb16
-rw-r--r--version.h6
4 files changed, 32 insertions, 11 deletions
diff --git a/ChangeLog b/ChangeLog
index 9eb9d30cc4..3c72ecabe3 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed May 28 13:18:21 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * ext/stringio/stringio.c (strio_putc): fix for non-ascii
+ encoding, like as IO#putc. [ruby-dev:48114] [Bug #9765]
+
Tue May 27 13:57:41 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
* lib/fileutils.rb (FileUtils#copy_entry): update rdoc about
diff --git a/ext/stringio/stringio.c b/ext/stringio/stringio.c
index 26872e0978..15ef44aa35 100644
--- a/ext/stringio/stringio.c
+++ b/ext/stringio/stringio.c
@@ -1235,17 +1235,17 @@ static VALUE
strio_putc(VALUE self, VALUE ch)
{
struct StringIO *ptr = writable(self);
- int c = NUM2CHR(ch);
- long olen;
+ VALUE str;
check_modifiable(ptr);
- olen = RSTRING_LEN(ptr->string);
- if (ptr->flags & FMODE_APPEND) {
- ptr->pos = olen;
+ if (RB_TYPE_P(ch, T_STRING)) {
+ str = rb_str_substr(ch, 0, 1);
}
- strio_extend(ptr, ptr->pos, 1);
- RSTRING_PTR(ptr->string)[ptr->pos++] = c;
- OBJ_INFECT(ptr->string, self);
+ else {
+ char c = NUM2CHR(ch);
+ str = rb_str_new(&c, 1);
+ }
+ strio_write(self, str);
return ch;
}
diff --git a/test/stringio/test_stringio.rb b/test/stringio/test_stringio.rb
index 0eceeba894..a2a2365149 100644
--- a/test/stringio/test_stringio.rb
+++ b/test/stringio/test_stringio.rb
@@ -411,6 +411,22 @@ class TestStringIO < Test::Unit::TestCase
assert_equal("foo123", s)
end
+ def test_putc_nonascii
+ s = ""
+ f = StringIO.new(s, "w")
+ f.putc("\u{3042}")
+ f.putc(0x3044)
+ f.close
+ assert_equal("\u{3042}D", s)
+
+ s = "foo"
+ f = StringIO.new(s, "a")
+ f.putc("\u{3042}")
+ f.putc(0x3044)
+ f.close
+ assert_equal("foo\u{3042}D", s)
+ end
+
def test_read
f = StringIO.new("\u3042\u3044")
assert_raise(ArgumentError) { f.read(-1) }
diff --git a/version.h b/version.h
index cb833ffc62..aa057ed6ff 100644
--- a/version.h
+++ b/version.h
@@ -1,10 +1,10 @@
#define RUBY_VERSION "2.0.0"
-#define RUBY_RELEASE_DATE "2014-05-27"
-#define RUBY_PATCHLEVEL 487
+#define RUBY_RELEASE_DATE "2014-05-28"
+#define RUBY_PATCHLEVEL 488
#define RUBY_RELEASE_YEAR 2014
#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 27
+#define RUBY_RELEASE_DAY 28
#include "ruby/version.h"