https://bugs.ruby-lang.org/
https://bugs.ruby-lang.org/favicon.ico?1711330511
2008-10-22T12:14:41Z
Ruby Issue Tracking System
Ruby master - Bug #674: Failure: test_aset(TestSDBM)
https://bugs.ruby-lang.org/issues/674?journal_id=1414
2008-10-22T12:14:41Z
nobu (Nobuyoshi Nakada)
nobu@ruby-lang.org
<ul></ul><p>=begin<br>
なかだです。</p>
<p>At Wed, 22 Oct 2008 03:16:57 +0900,<br>
Kazuhiro NISHIYAMA wrote in <a href="/issues/674">[ruby-dev:36854]</a>:</p>
<blockquote>
<p>ext/sdbm/init.cのfsdbm_fetchの<br>
return rb_external_str_new(value.dptr, value.dsize);<br>
でvalue = {dptr = "barbarfoo", dsize = 0}となっていて、<br>
lenに0を指定しているのにstring.cのrb_external_str_new_with_encが<br>
if (len == 0 && ptr) len = strlen(ptr);<br>
でlenを無視してstrlenしてしまっているのが原因のようです。</p>
</blockquote>
<p>まだlen==0を指定してrb_external_str_new_with_enc()を呼ぶコードは<br>
ないようですし、rb_{external,locale}_str_new()をそれぞれ二つに分<br>
けたほうがいいんじゃないでしょうか。あるいは、正しい値としてあり<br>
うる0じゃなくて-1あたりにするとか。</p>
<h1>
<br>
Index: include/ruby/intern.h</h1>
<p>--- include/ruby/intern.h (revision 19872)<br>
+++ include/ruby/intern.h (working copy)<br>
@@ -549,5 +549,7 @@ VALUE rb_tainted_str_new(const char*, lo<br>
VALUE rb_tainted_str_new2(const char*);<br>
VALUE rb_external_str_new(const char*, long);<br>
+VALUE rb_external_str_new_cstr(const char*);<br>
VALUE rb_locale_str_new(const char*, long);<br>
+VALUE rb_locale_str_new_cstr(const char*);<br>
VALUE rb_str_buf_new(long);<br>
VALUE rb_str_buf_new_cstr(const char*);<br>
@@ -620,4 +622,16 @@ size_t rb_str_capacity(VALUE);<br>
rb_usascii_str_new_cstr(str); <br>
})<br>
+#define rb_external_str_new_cstr(str) <strong>extension</strong> ( <br>
+{ \</p>
<ul>
<li>(__builtin_constant_p(str)) ? \</li>
<li>rb_external_str_new(str, strlen(str)) : \</li>
<li>rb_external_str_new_cstr(str); <br>
+})<br>
+#define rb_locale_str_new_cstr(str) <strong>extension</strong> ( <br>
+{ \</li>
<li>(__builtin_constant_p(str)) ? \</li>
<li>rb_locale_str_new(str, strlen(str)) : \</li>
<li>rb_locale_str_new_cstr(str); <br>
+})<br>
#define rb_str_buf_new_cstr(str) <strong>extension</strong> ( <br>
{ <br>
Index: string.c<br>
===================================================================<br>
--- string.c (revision 19872)<br>
+++ string.c (working copy)<br>
@@ -29,4 +29,6 @@<br>
#undef rb_tainted_str_new_cstr<br>
#undef rb_usascii_str_new_cstr<br>
+#undef rb_external_str_new_cstr<br>
+#undef rb_locale_str_new_cstr<br>
#undef rb_str_new2<br>
#undef rb_str_new3<br>
@@ -529,5 +531,4 @@ rb_external_str_new_with_enc(const char<br>
VALUE str;</li>
</ul>
<ul>
<li>if (len == 0 && !ptr) len = strlen(ptr);<br>
str = rb_tainted_str_new(ptr, len);<br>
rb_enc_associate(str, eenc);<br>
@@ -542,4 +543,11 @@ rb_external_str_new(const char *ptr, lon</li>
</ul>
<p>VALUE<br>
+rb_external_str_new_cstr(const char *ptr)<br>
+{</p>
<ul>
<li>long len = ptr ? strlen(ptr) : 0;</li>
<li>return rb_external_str_new_with_enc(ptr, len, rb_default_external_encoding());<br>
+}</li>
<li>
</ul>
<p>+VALUE<br>
rb_locale_str_new(const char *ptr, long len)<br>
{<br>
@@ -548,4 +556,11 @@ rb_locale_str_new(const char *ptr, long</p>
<p>VALUE<br>
+rb_locale_str_new_cstr(const char *ptr)<br>
+{</p>
<ul>
<li>long len = ptr ? strlen(ptr) : 0;</li>
<li>return rb_external_str_new_with_enc(ptr, len, rb_locale_encoding());<br>
+}</li>
<li>
</ul>
<p>+VALUE<br>
rb_str_export(VALUE str)<br>
{<br>
</p>
<p>--<br>
--- 僕の前にBugはない。<br>
--- 僕の後ろにBugはできる。<br>
中田 伸悦</p>
<p>=end</p>
Ruby master - Bug #674: Failure: test_aset(TestSDBM)
https://bugs.ruby-lang.org/issues/674?journal_id=1415
2008-10-22T14:57:06Z
matz (Yukihiro Matsumoto)
matz@ruby.or.jp
<ul><li><strong>Status</strong> changed from <i>Open</i> to <i>Closed</i></li><li><strong>% Done</strong> changed from <i>0</i> to <i>100</i></li></ul><p>=begin<br>
Applied in changeset r19885.<br>
=end</p>