# Then clause needs pop for stack consistency

**URL:** <https://www.ruby-forum.com/t/then-clause-needs-pop-for-stack-consistency/124519>\
**Category:** Development\
**Created:** [December 29, 2007, 6:06pm UTC](https://www.ruby-forum.com/t/then-clause-needs-pop-for-stack-consistency/124519 "2007-12-29T18:06:38Z")\
**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:** [December 29, 2007, 6:06pm UTC](https://www.ruby-forum.com/t/then-clause-needs-pop-for-stack-consistency/124519/1 "2007-12-29T18:06:38Z")

</div>

e$B1sF#$H?=$7$^$9!#e(B

e$B0J2\<$r\<B9T$9$k$H0l2sL$N%k!\<%W$N=PNO$@$1JQ$K$J$j$^$9!#e(B

$ ./ruby -e ’  
f = true  
if false  
else  
while f  
p [:foo, while true; break :bar; end]  
redo  
end  
end  
’ | head  
[:bar, :bar]  
[:foo, :bar]  
[:foo, :bar]  
[:foo, :bar]  
[:foo, :bar]  
[:foo, :bar]  
[:foo, :bar]  
[:foo, :bar]  
[:foo, :bar]  
[:foo, :bar]

NODE\_IF e$B$N%3%s%Q%$%k$G!"e(Bthen e$B@a$N:G8e$Ne(B jump e$B$N8e$Ge(B  
stack consistency e$B$re(B  
e$BJ]$D$?$a$Ne(B pop e$B$,I,MW$G$9!#e(B

# Index: compile.c

— compile.c (revision 14784)  
+++ compile.c (working copy)  
@@ -2634,6 +2634,7 @@  
ADD\_LABEL(ret, then\_label);  
ADD\_SEQ(ret, then\_seq);  
ADD\_INSNL(ret, nd\_line(node), jump, end\_label);

- if(!poped) ADD\_INSN(ret, nd\_line(node), pop);

---

<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:** [December 29, 2007, 6:47pm UTC](https://www.ruby-forum.com/t/then-clause-needs-pop-for-stack-consistency/124519/2 "2007-12-29T18:47:38Z")

</div>

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

NODE\_WHEN e$B$K$bF1$8LdBj$,$"$j$^$7$?!#0J2\<$Ne(B 2  
e$B$D$N%W%m%0%i%`$O0l2sL$@$1e(B  
[:foo, :bar] e$B$G$J$$$b$N$r=PNO$7$^$9!#e(B

f = true  
case  
when false  
when true  
while f  
p [:foo, while true; break :bar; end]  
redo  
end  
end

f = true  
case  
when true  
while f  
p [:foo, while true; break :bar; end]  
redo  
end  
end

NODE\_CASE e$B$K$bF1MM$NLdBj$,$"$j$^$9$,!"$=$l$\>$l$Ne(B body  
e$B$N:G=i$Ke(B pop e$B$,e(B  
e$BA^F~$5$l$k$?$a!"GA$-7j:GE,2=$,F/$+$:!"H/\>I$9$kNc$O8+$D$1$i$l$F$$$^$;$s!#e(B  
e$B$G$b$9$4$/%P%0$N85$J$N$G!“0J2\<$N%Q%C%A$G$Oe(B NODE\_CASE  
e$B$bBP=h$7$F$”$j$^$9!#e(B

# Index: compile.c

— compile.c (revision 14785)  
+++ compile.c (working copy)  
@@ -2634,6 +2634,7 @@  
ADD\_LABEL(ret, then\_label);  
ADD\_SEQ(ret, then\_seq);  
ADD\_INSNL(ret, nd\_line(node), jump, end\_label);

- if (!poped) ADD\_INSN(ret, nd\_line(node), pop);

- 

```
 if (!poped) ADD_INSN(body_seq, nd_line(node), pop);

 vals = node->nd_head;
 if (vals) {

```

@@ -2723,6 +2725,7 @@  
ADD\_INSN(cond\_seq, nd\_line(node), pop);  
COMPILE\_(cond\_seq, “else”, node, poped);  
ADD\_INSNL(cond\_seq, nd\_line(node), jump, endlabel);

- 

```
 if (!poped) ADD_INSN(cond_seq, nd_line(node), pop);

```

}  
else {  
debugs("== else (implicit)\n");  
@@ -2761,6 +2764,7 @@  
ADD\_LABEL(body\_seq, l1);  
COMPILE\_(body\_seq, “when”, node-\>nd\_body, poped);  
ADD\_INSNL(body\_seq, nd\_line(node), jump, endlabel);
- 

```
 if (!poped) ADD_INSN(body_seq, nd_line(node), pop);

 vals = node->nd_head;
 if (vals && nd_type(vals) == NODE_ARRAY) {

```

@@ -2803,6 +2807,7 @@  
/\* else \*/  
COMPILE\_(ret, “else”, node, poped);  
ADD\_INSNL(ret, nd\_line(orig\_node), jump, endlabel);

- if (!poped) ADD\_INSN(ret, nd\_line(orig\_node), pop);

e$B$D$$$G$G$9$,!"?tL\>$NJ}$+$i%3%\_%C%H8"8B$r;}$C$?$i$I$&$+$H8@$o$l$F$$$^$9!#e(B  
e$B$h$1$l$P!"$\*0l$D$/$@$5$$!#Js9p$7$?$b$N$re(B test\_knownbug.rb  
e$B$K\>!\<j$Ke(B  
e$BDI2C$9$k$/$i$$$O$G$-$k$H;W$$$^$9!#e(B

---

<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:** [December 29, 2007, 7:40pm UTC](https://www.ruby-forum.com/t/then-clause-needs-pop-for-stack-consistency/124519/3 "2007-12-29T19:40:57Z")

</div>

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

e$B2?EY$b$9$\_$^$;$s!#e(B

07/12/30 e$B$Ke(B Yusuke ENDOH[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) e$B$5$s$O=q$-$^$7$?e(B:

> NODE\_CASE e$B$K$bF1MM$NLdBj$,$“$j$^$9$,!”$=$l$\>$l$Ne(B body e$B$N:G=i$Ke(B pop e$B$,e(B  
> e$BA^F~$5$l$k$?$a!"GA$-7j:GE,2=$,F/$+$:!"H/\>I$9$kNc$O8+$D$1$i$l$F$$$^$;$s!#e(B  
> e$B$G$b$9$4$/%P%0$N85$J$N$G!“0J2\<$N%Q%C%A$G$Oe(B NODE\_CASE e$B$bBP=h$7$F$”$j$^$9!#e(B

NODE\_CASE  
e$B$NBP1~$,4V0c$C$F$$$^$7$?\>e$KH4$1$,$“$j$^$7$?!#$9$\_$^$;$s!#e(B  
NODE\_CASE e$B$Ne(B NODE\_WHEN e$B$?$A$O$=$l$\>$l$,e(B pop  
e$B$9$k$N$G!”$=$N:G8e$K$Oe(B putnil e$B$re(B  
e$BB-$5$J$$$H$$$1$^$;$s$G$7$?!#e(B  
e$B:#$N$H$3$mH/\>I$O$7$J$$$N$GJ|$C$F$\*$/$N$b\<j$+$b$7$l$^$;$s!#e(B

# Index: compile.c

— compile.c (revision 14785)  
+++ compile.c (working copy)  
@@ -2634,6 +2634,7 @@  
ADD\_LABEL(ret, then\_label);  
ADD\_SEQ(ret, then\_seq);  
ADD\_INSNL(ret, nd\_line(node), jump, end\_label);

- if (!poped) ADD\_INSN(ret, nd\_line(node), pop);

- 

```
 if (poped) ADD_INSN(body_seq, nd_line(node), putnil);

 vals = node->nd_head;
 if (vals) {

```

@@ -2723,6 +2725,7 @@  
ADD\_INSN(cond\_seq, nd\_line(node), pop);  
COMPILE\_(cond\_seq, “else”, node, poped);  
ADD\_INSNL(cond\_seq, nd\_line(node), jump, endlabel);

- 

```
 if (poped) ADD_INSN(cond_seq, nd_line(node), putnil);

```

}  
else {  
debugs(“== else (implicit)\n”);  
@@ -2732,6 +2735,7 @@  
ADD\_INSN(cond\_seq, nd\_line(tempnode), putnil);  
}  
ADD\_INSNL(cond\_seq, nd\_line(tempnode), jump, endlabel);

- 

```
 if (poped) ADD_INSN(cond_seq, nd_line(tempnode), putnil);

```

}

if (special\_literals) {  
@@ -2761,6 +2765,7 @@  
ADD\_LABEL(body\_seq, l1);  
COMPILE\_(body\_seq, “when”, node-\>nd\_body, poped);  
ADD\_INSNL(body\_seq, nd\_line(node), jump, endlabel);

- 

```
 if (!poped) ADD_INSN(body_seq, nd_line(node), pop);

 vals = node->nd_head;
 if (vals && nd_type(vals) == NODE_ARRAY) {

```

@@ -2803,6 +2808,7 @@  
/\* else \*/  
COMPILE\_(ret, “else”, node, poped);  
ADD\_INSNL(ret, nd\_line(orig\_node), jump, endlabel);

- if (!poped) ADD\_INSN(ret, nd\_line(orig\_node), pop);
