# \[Bug:trunk\] duplicate when clauses raise strange exception

**URL:** <https://www.ruby-forum.com/t/bug-trunk-duplicate-when-clauses-raise-strange-exception/161335>\
**Category:** Development\
**Created:** [February 25, 2009, 4:18pm UTC](https://www.ruby-forum.com/t/bug-trunk-duplicate-when-clauses-raise-strange-exception/161335 "2009-02-25T16:18:59Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 25, 2009, 4:18pm UTC](https://www.ruby-forum.com/t/bug-trunk-duplicate-when-clauses-raise-strange-exception/161335/1 "2009-02-25T16:18:59Z")

</div>

e$B1sF#$G$9!#e(B

e$BJ8;zNs$Ne(B when e$B@a$r=EJ#$5$;$k$H!“2x$7$$Nc30$,$”$,$j$^$9!#e(B

$ ruby19 -e ‘case “x”; when “x”; when “x”; end’  
ruby19: method `eql?’ called on terminated object (0x826e0f0)  
(NotImplementedError)

[ruby-dev:37959]  
e$B$N4X78$G!“J8;zNs%j%F%i%k$,IT2D;k$K$J$C$?1F6A$N$h$&$G$9!#e(B  
e$BIT2D;k$r$d$a$F$7$^$($P$H$j$”$($:2r7h$7$^$9$,!"$=$&$9$k$He(B  
ObjectSpace e$B$Ge(B  
when e$B@a$NJ8;zNs$r=q$-49$($i$l$F$7$^$&$h$&$K$J$j$^$9!#e(B  
e$B$I$&$7$?$b$N$G$7$g$&!#e(B

e$B0J2\<$Oe(B when e$B@a$NJ8;zNs$@$1IT2D;k$r$O$:$9%Q%C%A$G$9!#e(B

# Index: compile.c

— compile.c (revision 22632)  
+++ compile.c (working copy)  
@@ -2271,7 +2271,7 @@  
break;  
}  
case NODE\_STR:

- return node-\>nd\_lit;

- return rb\_str\_resurrect(node-\>nd\_lit);  
}  
return Qfalse;  
}

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 26, 2009, 6:16am UTC](https://www.ruby-forum.com/t/bug-trunk-duplicate-when-clauses-raise-strange-exception/161335/2 "2009-02-26T06:16:40Z")

</div>

e$B$J$+$@$G$9!#e(B

At Thu, 26 Feb 2009 00:17:40 +0900,  
Yusuke ENDOH wrote in [ruby-dev:38079]:

> e$BJ8;zNs$Ne(B when e$B@a$r=EJ#$5$;$k$H!“2x$7$$Nc30$,$”$,$j$^$9!#e(B
> 
> $ ruby19 -e ‘case “x”; when “x”; when “x”; end’  
> ruby19: method `eql?’ called on terminated object (0x826e0f0)  
> (NotImplementedError)
> 
> [ruby-dev:37959] e$B$N4X78$G!“J8;zNs%j%F%i%k$,IT2D;k$K$J$C$?1F6A$N$h$&$G$9!#e(B  
> e$BIT2D;k$r$d$a$F$7$^$($P$H$j$”$($:2r7h$7$^$9$,!"$=$&$9$k$He(B ObjectSpace e$B$Ge(B  
> when e$B@a$NJ8;zNs$r=q$-49$($i$l$F$7$^$&$h$&$K$J$j$^$9!#e(B  
> e$B$I$&$7$?$b$N$G$7$g$&!#e(B

e$B$3$l$rD4$Y$F$$$F$b$&0l$D5$$E$$$?$N$,e(B

./ruby -v -e ’  
class S \< String  
def eql?(s)  
@literal = s  
super  
end  
attr\_reader :literal  
end

case a = S.new(“x”)  
when “x”  
end  
p a.literal  
’  
ruby 1.9.2dev (2009-02-26 trunk 22637) [i386-darwin9.6.0]  
-e:13:in `p': method`inspect’ called on terminated object (0x11cdf8)  
(NotImplementedError)  
from -:12:in `’

e$B:GE,2=$5$l$J$$$H$-$K$Oe(B “x” === a  
e$B$,8F$P$l$^$9$,!"$5$l$F$$$k$He(B  
a.eql?(“x”)  
e$B$,8F$P$l$^$9!#%j%F%i%k$r1#$=$&$H;W$&$J$i!"e(BHashe$B$r$=$Ne(B  
e$B$^$^;H$&$N$O$^$:$$$H;W$$$^$9!#e(B

# Index: compile.c

— compile.c (revision 22639)  
+++ compile.c (working copy)  
@@ -1217,4 +1217,36 @@ iseq\_set\_local\_table(rb\_iseq\_t \*iseq, ID  
}

+static int  
+cdhash\_cmp(VALUE val, VALUE lit)  
+{

- if (val == lit) return 0;
- if (SPECIAL\_CONST\_P(lit)) {
- return val != lit;
- }
- if (SPECIAL\_CONST\_P(val) || BUILTIN\_TYPE(val) != BUILTIN\_TYPE(lit))  
{
- return -1;
- }
- if (BUILTIN\_TYPE(lit) == T\_STRING) {
- return rb\_str\_hash\_cmp(lit, val);
- }
- return !rb\_eql(lit, val);  
+}
- 

+static int  
+cdhash\_hash(VALUE a)  
+{

- if (SPECIAL\_CONST\_P(a)) return (int)a;
- if (TYPE(a) == T\_STRING) return rb\_str\_hash(a);
- {
- 

```
   VALUE hval = rb_hash(a);

```

- return (int)FIX2LONG(hval);
- }  
+}
- 

+static const struct st\_hash\_type cdhash\_type = {

- cdhash\_cmp,
- cdhash\_hash,  
+};
- 

/\*\*  
ruby insn object array -\> raw instruction sequence  
@@ -1344,4 +1376,5 @@ iseq\_set\_sequence(rb\_iseq\_t \*iseq, LINK\_  
VALUE lits = operands[j];  
VALUE map = rb\_hash\_new();

- 

```
     RHASH_TBL(map)->type = &cdhash_type;

     for (i=0; i < RARRAY_LEN(lits); i+=2) {
```

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [February 27, 2009, 10:37am UTC](https://www.ruby-forum.com/t/bug-trunk-duplicate-when-clauses-raise-strange-exception/161335/3 "2009-02-27T10:37:44Z")

</div>

e$B%A%1%C%He(B #1209 e$B$,99?7$5$l$^$7$?!#e(B (by Nobuyoshi N.)

e$B%9%F!\<%?%9e(B Opene$B$+$ie(BClosede$B$KJQ99e(B  
e$B?JD=e(B % 0e$B$+$ie(B100e$B$KJQ99e(B

## Applied in changeset r22662.

[http://redmine.ruby-lang.org/issues/show/1209](http://redmine.ruby-lang.org/issues/show/1209)
