SASADA Koichi <ko1 / atdot.net> 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;
     }
~~~