[ruby-trunk - Bug #8510][Open] assertion failed in ary_resize_capa

Issue #8510 has been reported by znz (Kazuhiro NISHIYAMA).


Bug #8510: assertion failed in ary_resize_capa

Author: znz (Kazuhiro NISHIYAMA)
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: current: 2.1.0
ruby -v: ruby 2.1.0dev (2013-06-10 trunk 41220) [x86_64-linux]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN

-DARRAY_DEBUG を付けていると enc.mk のあたりで make が通りません。

generating enc.mk
miniruby: …/ruby/array.c:153: ary_resize_capa: Assertion
`!(!!((!(((VALUE)(ary) & RUBY_IMMEDIATE_MASK) || !!(((VALUE)(ary) &
~((VALUE)RUBY_Qnil)) == 0)) && (int)(((struct RBasic*)(ary))->flags &
RUBY_T_MASK) != RUBY_T_NODE)?(((struct
RBasic*)(ary))->flags&((((VALUE)1)<<11))):((((int)(long)(ary))&RUBY_FIXNUM_FLAG)||((((int)(long)(ary))&RUBY_FLONUM_MASK)
== RUBY_FLONUM_FLAG))))’ failed.
Aborted (core dumped)

原因を調べてみたところ、 ary_make_shared で

else if (OBJ_FROZEN(ary)) {
    ary_resize_capa(ary, ARY_HEAP_LEN(ary));

という条件で ary_resize_capa を呼び出しているのに、ary_resize_capa の中に

assert(!OBJ_FROZEN(ary));

があるからのようです。

Issue #8510 has been updated by znz (Kazuhiro NISHIYAMA).

Status changed from Open to Assigned
Assignee set to nobu (Nobuyoshi N.)


Bug #8510: assertion failed in ary_resize_capa

Author: znz (Kazuhiro NISHIYAMA)
Status: Assigned
Priority: Normal
Assignee: nobu (Nobuyoshi N.)
Category: core
Target version: current: 2.1.0
ruby -v: ruby 2.1.0dev (2013-06-10 trunk 41220) [x86_64-linux]
Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN

-DARRAY_DEBUG を付けていると enc.mk のあたりで make が通りません。

generating enc.mk
miniruby: …/ruby/array.c:153: ary_resize_capa: Assertion
`!(!!((!(((VALUE)(ary) & RUBY_IMMEDIATE_MASK) || !!(((VALUE)(ary) &
~((VALUE)RUBY_Qnil)) == 0)) && (int)(((struct RBasic*)(ary))->flags &
RUBY_T_MASK) != RUBY_T_NODE)?(((struct
RBasic*)(ary))->flags&((((VALUE)1)<<11))):((((int)(long)(ary))&RUBY_FIXNUM_FLAG)||((((int)(long)(ary))&RUBY_FLONUM_MASK)
== RUBY_FLONUM_FLAG))))’ failed.
Aborted (core dumped)

原因を調べてみたところ、 ary_make_shared で

else if (OBJ_FROZEN(ary)) {
    ary_resize_capa(ary, ARY_HEAP_LEN(ary));

という条件で ary_resize_capa を呼び出しているのに、ary_resize_capa の中に

assert(!OBJ_FROZEN(ary));

があるからのようです。