Bug #674
closedFailure: test_aset(TestSDBM)
Description
=begin
- Failure:
test_aset(TestSDBM) [.../trunk/test/sdbm/test_sdbm.rb:174]:
<""> expected but was
<"barbarfoo">.
について調べてみました。
ext/sdbm/init.cのfsdbm_fetchの
return rb_external_str_new(value.dptr, value.dsize);
でvalue = {dptr = "barbarfoo", dsize = 0}となっていて、
lenに0を指定しているのにstring.cのrb_external_str_new_with_encが
if (len == 0 && ptr) len = strlen(ptr);
でlenを無視してstrlenしてしまっているのが原因のようです。
=end
Updated by nobu (Nobuyoshi Nakada) over 15 years ago
=begin
なかだです。
At Wed, 22 Oct 2008 03:16:57 +0900,
Kazuhiro NISHIYAMA wrote in [ruby-dev:36854]:
ext/sdbm/init.cのfsdbm_fetchの
return rb_external_str_new(value.dptr, value.dsize);
でvalue = {dptr = "barbarfoo", dsize = 0}となっていて、
lenに0を指定しているのにstring.cのrb_external_str_new_with_encが
if (len == 0 && ptr) len = strlen(ptr);
でlenを無視してstrlenしてしまっているのが原因のようです。
まだlen==0を指定してrb_external_str_new_with_enc()を呼ぶコードは
ないようですし、rb_{external,locale}_str_new()をそれぞれ二つに分
けたほうがいいんじゃないでしょうか。あるいは、正しい値としてあり
うる0じゃなくて-1あたりにするとか。
Index: include/ruby/intern.h
--- include/ruby/intern.h (revision 19872)
+++ include/ruby/intern.h (working copy)
@@ -549,5 +549,7 @@ VALUE rb_tainted_str_new(const char*, lo
VALUE rb_tainted_str_new2(const char*);
VALUE rb_external_str_new(const char*, long);
+VALUE rb_external_str_new_cstr(const char*);
VALUE rb_locale_str_new(const char*, long);
+VALUE rb_locale_str_new_cstr(const char*);
VALUE rb_str_buf_new(long);
VALUE rb_str_buf_new_cstr(const char*);
@@ -620,4 +622,16 @@ size_t rb_str_capacity(VALUE);
rb_usascii_str_new_cstr(str);
})
+#define rb_external_str_new_cstr(str) extension (
+{ \
- (__builtin_constant_p(str)) ? \
- rb_external_str_new(str, strlen(str)) : \
- rb_external_str_new_cstr(str);
+})
+#define rb_locale_str_new_cstr(str) extension (
+{ \ - (__builtin_constant_p(str)) ? \
- rb_locale_str_new(str, strlen(str)) : \
- rb_locale_str_new_cstr(str);
+})
#define rb_str_buf_new_cstr(str) extension (
{
Index: string.c
===================================================================
--- string.c (revision 19872)
+++ string.c (working copy)
@@ -29,4 +29,6 @@
#undef rb_tainted_str_new_cstr
#undef rb_usascii_str_new_cstr
+#undef rb_external_str_new_cstr
+#undef rb_locale_str_new_cstr
#undef rb_str_new2
#undef rb_str_new3
@@ -529,5 +531,4 @@ rb_external_str_new_with_enc(const char
VALUE str;
- if (len == 0 && !ptr) len = strlen(ptr);
str = rb_tainted_str_new(ptr, len);
rb_enc_associate(str, eenc);
@@ -542,4 +543,11 @@ rb_external_str_new(const char *ptr, lon
VALUE
+rb_external_str_new_cstr(const char *ptr)
+{
- long len = ptr ? strlen(ptr) : 0;
- return rb_external_str_new_with_enc(ptr, len, rb_default_external_encoding());
+}
+VALUE
rb_locale_str_new(const char *ptr, long len)
{
@@ -548,4 +556,11 @@ rb_locale_str_new(const char *ptr, long
VALUE
+rb_locale_str_new_cstr(const char *ptr)
+{
- long len = ptr ? strlen(ptr) : 0;
- return rb_external_str_new_with_enc(ptr, len, rb_locale_encoding());
+}
+VALUE
rb_str_export(VALUE str)
{
--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦
=end
Updated by matz (Yukihiro Matsumoto) over 15 years ago
- Status changed from Open to Closed
- % Done changed from 0 to 100
=begin
Applied in changeset r19885.
=end