Project

General

Profile

Actions

Bug #674

closed

Failure: test_aset(TestSDBM)

Added by znz (Kazuhiro NISHIYAMA) over 15 years ago. Updated almost 13 years ago.

Status:
Closed
Assignee:
-
Target version:
-
ruby -v:
Backport:
[ruby-dev:36854]

Description

=begin

  1. 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

Actions #1

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

Actions #2

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

Actions

Also available in: Atom PDF

Like0
Like0Like0