From: Eric Wong Date: 2014-08-30T18:45:36+00:00 Subject: [ruby-core:64676] Re: Fwd: [ruby-changes:35240] normal:r47322 (trunk): symbol.c (rb_sym2id): do not return garbage object SASADA Koichi wrote: > (2014/08/30 8:50), SASADA Koichi wrote: > > Why this fix solve your problem? > > dsymbol_pindown(sym) returns symbol itself (with cast to ID). > > OMG, it is my fault. > > There is a path to return another symbol value. > > > sym = dsymbol_check(sym); Right :) However, my fix appears incomplete. Even with my patch applied, I still get into a problem where fstr is 0 inside dsymbol_check. So there seems to be another bug... ~~~ --- a/symbol.c +++ b/symbol.c @@ -440,12 +440,15 @@ static inline VALUE dsymbol_check(const VALUE sym) { if (UNLIKELY(rb_objspace_garbage_object_p(sym))) { const VALUE fstr = RSYMBOL(sym)->fstr; RSYMBOL(sym)->fstr = 0; + if (fstr == 0) + rb_bug("fstr is zero"); + unregister_sym(fstr, sym); return dsymbol_alloc(rb_cSymbol, fstr, rb_enc_get(fstr)); } else { return sym; } ~~~