# Iseq_compile_each()でのマジックナンバ

\$B\$-\$?\$6\$o\$G\$9!#(B

\$B\$O\$8\$a\$^\$7\$F!#(B
\$B\$O\$8\$a\$F%]%9%H\$9\$k\$N\$G!"(Bdev\$B\$J\$N\$+(Blist\$B\$J\$N\$+LB\$C\$?\$N\$G\$9\$,!"%=!<%9%3!<%I\$K4X\$9\$k(B
\$B\$3\$H\$J\$N\$G!"\$3\$A\$i\$K%]%9%H\$7\$^\$9!#(B
[email protected]\$C\$?\$i;XE&\$7\$F\$/[email protected]\$5\$\$!#(B

iseq_compile_each()\$B\$N(BNODE_BREAK/NODE_NEXT\$B\$"\$?\$j\$G!"JQ?t(Blevel\$B\$KBP\$9\$k(B
\$B%^%8%C%/%J%s%P\$,5\$\$K\$J\$k\$N\$G%Q%C%A\$rEv\$F\$h\$&\$+\$H;W\$C\$F\$\$\$^\$9!#(B

\$B\$G!"\$I\$&\$7\$F\$b\$o\$+\$i\$J\$\$\$3\$H\$,\$"\$k\$N\$G65\$(\$F\$/[email protected]\$5\$\$!#(B

case NODE_BREAK\$B\$N\$"\$H\$G!"(B
level++;
if (ip->compile_data->redo_label != 0) {
level = 0x8000;
if (ip->compile_data->loopval_popped == 0) {
/* need value */
level |= 0x4000;
}
goto break_by_insn;
}
\$B\$H\$\$\$&%3!<%I\$,\$"\$k\$N\$G\$9\$,!"(B0x4000\$B\$N0UL#!JMQES!K\$,\$o\$+\$j\$^\$;\$s!#(B
vm_throw()\$B\$G\$O\$3\$NCM!J%S%C%H!K\$r\$_\$F\$\$\$J\$\$\$h\$&\$J\$N\$G\$9!#(B
need value\$B\$H\$\$\$&%3%a%s%H\$,\$"\$k\$N\$G!“I,MW\$C\$]\$\$46\$8\$J\$N\$G\$9\$,!”(B
\$B%G%P%C%0MQ\$K;H\$&\$/\$i\$\$\$7\$+;W\$\$\$D\$+\$J\$\$\$N\$G\$9!#(B

\$B\$h\$m\$7\$/\$*4j\$\$CW\$7\$^\$9!#(B

\$B6a1J\$H?=\$7\$^\$9!#(B

\$B\$3\$N7o5\$\$K\$J\$C\$F\$\$\$?\$N\$G\$9\$,!"H?1~\$,CY\$/\$J\$C\$F\$9\$_\$^\$;\$s!#(B
[email protected]\$O(B ruby-dev \$B\$GE,@[email protected]\$H;W\$\$\$^\$9!#(B

\$B\$H\$\$\$&%3!<%I\$,\$"\$k\$N\$G\$9\$,!"(B0x4000\$B\$N0UL#!JMQES!K\$,\$o\$+\$j\$^\$;\$s!#(B
vm_throw()\$B\$G\$O\$3\$NCM!J%S%C%H!K\$r\$\$F\$\$\$J\$\$\$h\$&\$J\$N\$G\$9!#(B
need value\$B\$H\$\$\$&%3%a%s%H\$,\$"\$k\$N\$G!“I,MW\$C\$]\$\$46\$8\$J\$N\$G\$9\$,!”(B
\$B%G%P%C%0MQ\$K;H\$&\$/\$i\$\$\$7\$+;W\$\$\$D\$+\$J\$\$\$N\$G\$9!#(B
\$B3N\$+\$K;HMQ\$5\$l\$F\$\$\$J\$\$\$h\$&\$K8+\$(\$^\$9\$M!#(B
\$B\$3\$3\$NB>(B2\$B2U=j(B(\$B7W(B3\$B2U=j(B)\$B\$N(B 0x4000
\$B%S%C%H\$rN)\$F\$F\$\$\$k=j\$r:o\$C\$F(B
make check
\$B\$G%F%9%H\$7\$F\$
\$^\$7\$?\$,%(%i!<\$,A}\$(\$F\$\$\$k\$h\$&\$G\$O\$"\$j\$^\$;\$s\$G\$7\$?!#(B
\$B2a5n\$N2?\$+\$NL>;D\$j\$G:#\$OITMW\$K\$J\$C\$F\$7\$^\$C\$F\$\$\$k\$b\$N\$G\$O\$J\$\$\$G\$7\$g\$&\$+(B?

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

\$B\$3\$N%a!<%k\$K5\$\$,\$D\$\$\$F\$^\$;\$s\$G\$7\$?!#(B

2011\$BG/(B3\$B7n(B5\$BF|(B0:05 nagachika [email protected]:

\$B\$H\$\$\$&%3!<%I\$,\$"\$k\$N\$G\$9\$,!"(B0x4000\$B\$N0UL#!JMQES!K\$,\$o\$+\$j\$^\$;\$s!#(B
vm_throw()\$B\$G\$O\$3\$NCM!J%S%C%H!K\$r\$\$F\$\$\$J\$\$\$h\$&\$J\$N\$G\$9!#(B
need value\$B\$H\$\$\$&%3%a%s%H\$,\$"\$k\$N\$G!“I,MW\$C\$]\$\$46\$8\$J\$N\$G\$9\$,!”(B
\$B%G%P%C%0MQ\$K;H\$&\$/\$i\$\$\$7\$+;W\$\$\$D\$+\$J\$\$\$N\$G\$9!#(B
\$B3N\$+\$K;HMQ\$5\$l\$F\$\$\$J\$\$\$h\$&\$K8+\$(\$^\$9\$M!#(B
\$B\$3\$3\$NB>(B2\$B2U=j(B(\$B7W(B3\$B2U=j(B)\$B\$N(B 0x4000
\$B%S%C%H\$rN)\$F\$F\$\$\$k=j\$r:o\$C\$F(B
make check
\$B\$G%F%9%H\$7\$F\$
\$^\$7\$?\$,%(%i!<\$,A}\$(\$F\$\$\$k\$h\$&\$G\$O\$"\$j\$^\$;\$s\$G\$7\$?!#(B
\$B2a5n\$N2?\$+\$NL>;D\$j\$G:#\$OITMW\$K\$J\$C\$F\$7\$^\$C\$F\$\$\$k\$b\$N\$G\$O\$J\$\$\$G\$7\$g\$&\$+(B?

\$B\$=\$&[email protected]\$&\$N\$KG:[email protected]\$H\$-\$O(B git log -p \$B\$H\$+\$G2a5n\$N5-O?\$r8+\$F\$_\$k\$H(B
\$B\$\$\$\$\$G\$9\$h!#(B
\$B\$3\$N%3!<%I\$,F~\$C\$?\$N\$O(B r11439 (Merge YARV) \$B\$G!"\$=\$N;~\$O(B 0x4000
\$B\$r(B
\$B;H\$&%3!<%I\$,3NG’\$G\$-\$^\$9(B (insns.def \$B\$N(B throw) \$B!#\$=\$N%3!<%I\$O(B
vm.c
\$B\$N(B vm_throw \$B\$K0\$j(B (r12887) \$B!"\$=\$N8e(B r16568
\$B\$G>C\$5\$l\$F\$\$\$^\$9!#(B

Author: mame [email protected]
Date: Sat May 24 06:29:48 2008 +0000

``````* compile.c (iseq_set_exception_table, NODE_WHILE, NODE_NEXT):
``````

remove
special handling that decrements sp in CATCH_TYPE_NEXT for
NODE_WHILE.

``````* vm.c (vm_eval_body), vm_insnhelper.c (vm_throw): remove unused
``````

code.

``````git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/[email protected]
``````

b2dd03c8-39d4-4d8f-98ff-823fe69b080e

diff --git a/vm_insnhelper.c b/vm_insnhelper.c
index bf9ded1…6fb867a 100644
— a/vm_insnhelper.c
+++ b/vm_insnhelper.c
@@ -1204,12 +1204,7 @@ vm_throw(rb_thread_t *th, rb_control_frame_t
*reg_cfp,
VALUE *pt = 0;
int i;
if (flag != 0) {

• ``````      if (throw_state & 0x4000) {
``````
• ``````          pt = (void *)1;
``````
• ``````      }
``````
• ``````      else {
``````
• ``````          pt = 0;
``````
• ``````      }
``````
• ``````      pt = (void *) 1;
}
else {
if (state == TAG_BREAK) {
``````

\$B\$(\$C!">C\$7\$?\$N;d\$J\$s\$G\$9\$M!#%3%_%C%H%m%0\$r8+\$F;W\$\$=P\$9\$H!"(B

• next \$B\$O0z?t\$r<h\$k(B (next val) \$B\$N\$G!"%9%?%C%/\$r>CHq\$9\$k(B

• \$B\$7\$+\$7!"(Bwhile \$B\$NCf\$G(B next
\$B\$KCM\$rM?\$(\$F\$b<[email protected]\$1\$J\$N\$G!"(B
\$B%9%?%C%/\$NL5BL\$K\$J\$k(B

• while \$B\$NCf\$N(B next [email protected]\$1FCJL07\$\$\$7\$F%9%?%C%/>CHq\$7\$J\$\$\$h\$&\$K\$7(B
\$B\$F\$\$\$?(B (0x4000 \$B\$O%9%?%C%/\$r>CHq\$9\$k>l9g\$N%U%i%0(B)

\$B\$H\$\$\$&[email protected]\$C\$?\$O\$:!#(B
\$B\$G\$b!"\$J\$<\$3\$N:GE,2=\$r\$d\$a\$?\$N\$+\$^\$G\$O=q\$\$\$F\$\$\$^\$;\$s\$M!#%@%a%@%a!#(B

\$B\$J\$<\$+\$H\$\$\$&\$H!"\$3\$N:GE,2=\$r\$7\$F\$\$\$k\$H%Y%j%U%!%\$%":n\$k>e\$G%9%?%C(B
\$B%/D9\$N8!>Z\$,\$H\$F\$bFq\$7\$/\$J\$kLdBj\$,[email protected]\$C\$?\$H;W\$\$\$^\$9!#(B
\$B\$5\$i\$K\$3\$N:GE,2=\$O\$b\$H\$b\$H(B /* TODO: Dirty Hack! Fix me */ \$B\$H=q(B
\$B\$+\$l\$k\$h\$&[email protected]\$C\$?\$3\$H\$b\$"\$C\$F!"[email protected]\$5\$s\$,>[email protected]\$C(B
\$B\$?\$O\$:!#(B

# \$B\$D\$\$\$F\$J\$\$!D!D!#(B

\$B\$-\$?\$6\$o\$5\$s\$,<(\$5\$l\$?2U=j(B (NODE_BREAK) \$B\$G\$b(B 0x4000
\$B\$,4X\$o\$C\$F(B
\$B\$\$\$?\$s\$G\$9\$M!#(Bwhile \$B\$NJV\$jCM\$,;H\$o\$l\$k>l9g(B (loopval_popped
\$B\$,(B 0
\$B\$N>l9g(B) [email protected]\$1!"(Bbreak
\$B\$N0z?t\$r%9%?%C%/\$K:\$;\$k\$H\$\$\$&:GE,[email protected]\$C\$?\$H(B
\$B;W\$o\$l\$^\$9!#(B
\$B\$G\$b!"(Bloopval_popped \$B\$,(B 0
[email protected]\$,%3!<%[email protected]\$;(B
\$B\$J\$\$\$N\$G!"(Bif (ip->compile_data->loopval_popped == 0) \$B\$NJ,4t\$O0U(B
\$BL#\$,\$J\$\$\$s\$8\$c\$J\$\$\$+\$J!<\$H;W\$\$\$^\$9!#(B
\$BEv;~(B (2008/05/24) \$B\$N(B IRC
\$B\$N%m%0\$r8+\$F\$_\$?\$H\$3\$m!"[email protected]\$C(B
\$B\$F\$^\$7\$?!#(B

11:13:10 loopval_popped \$B\$O\$b\$&;H\$o\$l\$F\$\$\$J\$\$\$N\$G\$O\$J\$\$\$+(B

\$B\$H\$\$\$&\$o\$1\$G!"(B0x4000 \$B4X78\$N%3!<%I\$H(B loopval_popped
\$B4X78\$N%3!<%I(B
\$B\$OA4It<h\$j=|\$\$\$F\$h\$5\$=\$&\$G\$9!#(B

\$B\$-\$?\$6\$o\$G\$9!#(B

\$B1sF#\$5\$s!“6a1J\$5\$s!”\$"\$j\$,\$H\$&\$4\$6\$\$\$^\$9!#(B

\$B\$=\$&[email protected]\$&\$N\$KG:[email protected]\$H\$-\$O(B git log -p \$B\$H\$+\$G2a5n\$N5-O?\$r8+\$F\$\$k\$H(B
\$B\$\$\$\$\$G\$9\$h!#(B
\$B<!\$+\$i!"\$=\$&\$7\$F\$
\$^\$9!#(B

\$B\$H\$\$\$&\$o\$1\$G!"(B0x4000 \$B4X78\$N%3!<%I\$H(B loopval_popped \$B4X78\$N%3!<%I(B
\$B\$OA4It<h\$j=|\$\$\$F\$h\$5\$=\$&\$G\$9!#(B
[email protected]|!"%Q%C%A\$r(Bpost\$B\$7\$h\$&\$+\$H;W\$\$\$^\$9!#(B
\$B!t:#HU\$N3Z\$7\$_\$,\$G\$-\$?!#%o%\$%o%\$(B
\$B!t\$"\$l!)\$d\$C\$F\$\$\$k%R%^\$"\$k\$N\$+\$J!)(B

loopval_popped \$B4X78\$N%3!<%I\$K\$D\$\$\$F\$O!"\$A\$g\$C\$H<+J,\$GD4\$Y\$F\$_\$^\$9!#(B
[email protected]\$+!"\$o\$+\$C\$F\$\$\$J\$\$!&!&!&(B

\$B\$-\$?\$6\$o\$G\$9!#(B

\$B\$H\$\$\$&\$o\$1\$G!"(B0x4000 \$B4X78\$N%3!<%I\$H(B loopval_popped \$B4X78\$N%3!<%I(B
\$B\$OA4It<h\$j=|\$\$\$F\$h\$5\$=\$&\$G\$9!#(B

loopval_popped\$BJQ?t\$H\$O!"(B
struct iseq_compile_data {
\$B!JN,!K(B
int loopval_popped; /* used by NODE_BREAK */

\$B\$G!"\$d\$O\$j(Bcompile.c\$BFb\$G(B

compile.c:3204: int prev_loopval_popped =
iseq->compile_data->loopval_popped;
compile.c:3216: iseq->compile_data->loopval_popped = 0;
compile.c:3278: iseq->compile_data->loopval_popped =
prev_loopval_popped;
compile.c:3327: COMPILE_(ret, “break val (while/until)”,
node->nd_stts, iseq->compile_data->loopval_popped);

\$B\$H!"1d!9(B0\$B\$,7+\$jJV\$7BeF~\$5\$l\$F\$\$\$k%d%D\$G\$9\$M!#(B

\$B\$3\$l\$b\$d\$C\$Q\$j;H\$C\$F\$J\$\$\$s\$G\$9\$M!#(B
\$B2?EYFI\$s\$G\$b!"IT;W5D\$G\$?\$^\$i\$+\$C\$?\$s\$G\$9\$h!#(B

\$B\$C\$F\$3\$H\$O!"(BCOMPILE_\$B\$+\$i!"(BCOMPILE(ret, “break val
(while/until)”, node->nd_stts);
\$B\$G\$9\$M!#(B

\$B\$-\$?\$6\$o\$G\$9!#(B

# \$B\$D\$\$\$F\$J\$\$!D!D!#(B

iseq_set_exception_table(rb_iseq_t iseq)
{
\$B!JN,!K(B
/
TODO: Dirty Hack! Fix me */
if (entry->type == CATCH_TYPE_RESCUE ||
entry->type == CATCH_TYPE_BREAK ||
entry->type == CATCH_TYPE_NEXT) {
entry->sp–;
}
}

\$B\$3\$N%3%a%s%H\$G\$9\$M!)(B

[email protected]>!"\$J\$s\$N%3%a%s%[email protected]\$+\$o\$+\$i\$J\$+\$C\$?\$H\$3\$m\$G\$9!#(B

[email protected]\$G\$9!%(B

\$B!!\$3\$NJU\$O\$b\$&\$5\$C\$Q\$j3P\$(\$F\$\$\$J\$\$\$N\$G\$9\$,!%(B

(2011/03/06 11:37), \$B\$-\$?\$6\$o\$1\$s\$\$\$A(B wrote:

``````entry->type == CATCH_TYPE_NEXT) {
entry->sp--;
}
``````

}

\$B\$3\$N%3%a%s%H\$G\$9\$M!)(B

[email protected]>!"\$J\$s\$N%3%a%s%[email protected]\$+\$o\$+\$i\$J\$+\$C\$?\$H\$3\$m\$G\$9!#(B

\$B!!\$3\$N(B sp-- \$B\$9\$k\$N\$,!\$\$J\$s\$G(B sp–
[email protected]\$1\$G\$\$\$\$\$N\$+\$o\$+\$i\$J\$+\$C\$?!\$\$H\$\$\$&(B
\$B\$+!\$3N\$+!\$JL\$N>l9g\$b\$"\$k\$h\$&\$J5\$\$,\$9\$k\$1\$I!\$\$^\$!(B test-all
\$B\$,F0\$/\$+\$i\$\$\$\$(B
\$B\$+!\$\$H;W\$C\$F!\$\$b\$C\$H\$A\$c\$s\$H\$7\$J\$\$\$H\$\$\$+\$s\$J\$!!\$\$H;W\$C\$F=q\$\$\$F\$\$\$?\$s\$8\$c(B
\$B\$J\$\$\$+\$H;W\$\$\$^\$9!%(B

\$B!!<B9T;~\$N(B sp
\$B\$NA+0\$O!\$\$b\$&\$A\$g\$C\$H%U%)!<%^%k\$K\$-\$C\$A\$j7h\$a\$i\$l\$k\$h\$&\$K(B
\$B\$7\$?\$\$\$J\$!!\$\$H;W\$C\$F\$\$\$?\$j\$7\$F!\$J|\$C\$?\$i\$+\$7\$G\$9!J:#\$O!\$%P%0\$,\$"\$C\$?\$i%"(B
\$B%I%[%C%/\$KD>\$9!\$\$C\$F46\$8!K!%1sF#\$5\$s\$,\$-\$C\$A\$j7h\$^\$k\$h\$&\$K!\$?’!9JQ99\$7\$F(B
\$B\$/\$l\$?HG\$,\$"\$C\$?\$H;W\$&[email protected]\$1\$I!\$Bg\$-\$9\$.\$F(B reject
\$B\$7\$A\$c\$C\$?\$s\$G\$9\$+\$M!%(B

\$B!!K\Ev\$O!\$%U%m!<%0%i%U\$+\$J\$s\$+\$r\$-\$A\$s\$H:n\$C\$F!\$\$-\$C\$A\$j\$7\$?\$\$\$H\$3\$m\$J\$s(B
\$B\$G\$9\$,!%(B

\$BKL_7\$G\$9!#(B

iseq_compile_each(compile.c)\$B\$N(BNODE_BREAK\$B\$"\$?\$j\$N%^%8%C%/%J%s%P\$N%Q%C%A\$rAw\$j\$^\$9!#(B
svn diff\$B\$G:9J,\$r\$H\$C\$?\$1\$I!"\$3\$l\$G\$h\$\$\$N\$+\$7\$i!)(B
\$B?’!9L\$7P83\$JItJ,\$,\$"\$k\$N\$G!";XE&\$7\$F\$/[email protected]\$5\$\$!#(B

# Index: vm_core.h

— vm_core.h (\$B%j%S%8%g%s(B 31028)
+++ vm_core.h (\$B:n6H%3%T!<(B)
@@ -583,6 +583,12 @@
#define RUBYVM_CFUNC_FRAME_P(cfp)
(VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC)

+/* vm_throw state /
+#define VM_THROW_GET_DFP 0x8000
+#define VM_THROW_LVL_SHIFT 16
+#define VM_THROW_LEVEL(s) (s >> VM_THROW_LVL_SHIFT)
+
/
inline cache */
typedef struct iseq_inline_cache_entry *IC;

# Index: compile.c

— compile.c (\$B%j%S%8%g%s(B 31028)
+++ compile.c (\$B:n6H%3%T!<(B)
@@ -15,6 +15,7 @@
#define USE_INSN_STACK_INCREASE 1
#include “vm_core.h”
#include “iseq.h”
+#include “eval_intern.h”
#include “insns.inc”
#include “insns_info.inc”

@@ -3336,7 +3337,7 @@
break_by_insn:
/* escape from block */
COMPILE(ret, “break val (block)”, node->nd_stts);

• `````` ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x02) /*
``````

TAG_BREAK */ );

• `````` ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | TAG_BREAK)
``````

/* TAG_BREAK */ );
if (poped) {
}
@@ -3355,11 +3356,7 @@

`````` level++;
if (ip->compile_data->redo_label != 0) {
``````
• ``````   level = 0x8000;
``````
• ``````   if (ip->compile_data->loopval_popped == 0) {
``````
• `````` /* need value */
``````
• `````` level |= 0x4000;
``````
• ``````   }
``````
• ``````   level = VM_THROW_GET_DFP;
goto break_by_insn;
``````
}
else if (ip->type == ISEQ_TYPE_BLOCK) {
@@ -3419,7 +3416,7 @@
break;
}
• level = 0x8000 | 0x4000;
• level = VM_THROW_GET_DFP;
if (ip->compile_data->redo_label != 0) {
/* while loop */
break;
@@ -3435,7 +3432,7 @@
}
if (ip != 0) {
COMPILE(ret, “next val”, node->nd_stts);
• ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x03) /*
TAG_NEXT */ );
• ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | TAG_NEXT) /*
TAG_NEXT */ );

if (poped) {
@@ -3481,7 +3478,7 @@
else {
rb_iseq_t *ip;
unsigned long level;

• `````` level = 0x8000 | 0x4000;
``````
• `````` level = VM_THROW_GET_DFP;
ip = iseq;
while (ip) {
``````
if (!ip->compile_data) {
@@ -3503,7 +3500,7 @@
}
if (ip != 0) {
• ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x05) /*
TAG_REDO */ );
• ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | TAG_REDO) /*
TAG_REDO */ );

if (poped) {
@@ -3518,7 +3515,7 @@
case NODE_RETRY:{
if (iseq->type == ISEQ_TYPE_RESCUE) {

• `````` ADD_INSN1(ret, nd_line(node), throw, INT2FIX(0x04) /* TAG_RETRY
``````

*/ );

• `````` ADD_INSN1(ret, nd_line(node), throw, INT2FIX(TAG_RETRY) /*
``````

TAG_RETRY */ );

``````   if (poped) {
``````

@@ -4316,7 +4313,7 @@
}
}
else {

• ``````   ADD_INSN1(ret, nd_line(node), throw, INT2FIX(0x01) /*
``````

TAG_RETURN */ );

• ``````   ADD_INSN1(ret, nd_line(node), throw, INT2FIX(TAG_RETURN) /*
``````

# TAG_RETURN */ ); if (poped) { ADD_INSN(ret, nd_line(node), pop); } Index: vm_insnhelper.c

— vm_insnhelper.c (\$B%j%S%8%g%s(B 31028)
+++ vm_insnhelper.c (\$B:n6H%3%T!<(B)
@@ -1432,9 +1432,9 @@
rb_num_t throw_state, VALUE throwobj)
{

• int state = (int)(throw_state & 0xff);
• int flag = (int)(throw_state & 0x8000);
• rb_num_t level = throw_state >> 16;
• int state = (int)(throw_state & VM_THROW_STATE_MASK);

• int flag = (int)(throw_state & VM_THROW_GET_DFP);

• rb_num_t level = VM_THROW_LEVEL(throw_state);

if (state != 0) {
VALUE *pt = 0;

[email protected]\$G\$9!%(B

\$B!!\$3\$NJU\$N%3!<%I\$r5W!9\$K8+\$^\$7\$?!%(B

(2011/03/06 11:25), \$B\$-\$?\$6\$o\$1\$s\$\$\$A(B wrote:

# Index: vm_core.h

— vm_core.h (\$B%j%S%8%g%s(B 31028)
+++ vm_core.h (\$B:n6H%3%T!<(B)
@@ -583,6 +583,12 @@
#define RUBYVM_CFUNC_FRAME_P(cfp)
(VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC)

+/* vm_throw state */
+#define VM_THROW_GET_DFP 0x8000

\$B!!\$3\$l!\$2?\$d\$C\$F\$k\$s\$G\$7\$?\$C\$1!%%3!<%I8+\$?\$1\$I;W\$\$=P\$;\$J\$\$(B…\$B!%\$J\$s\$+!\$(B
\$B\$3\$l\$,@_Dj\$5\$l\$F\$\$\$k\$H!\$5U\$K(B dfp \$B\$r8+\$F\$\$\$J\$\$\$h\$&\$J!%(B

+#define VM_THROW_LVL_SHIFT 16
+#define VM_THROW_LEVEL(s) (s >> VM_THROW_LVL_SHIFT)

\$B!!(Blvl \$B\$C\$F(B level \$B\$G\$7\$g\$&\$+!%(B

# Index: compile.c

— compile.c (\$B%j%S%8%g%s(B 31028)
+++ compile.c (\$B:n6H%3%T!<(B)
@@ -15,6 +15,7 @@
#define USE_INSN_STACK_INCREASE 1
#include “vm_core.h”
#include “iseq.h”
+#include “eval_intern.h”

\$B!!\$J\$<!\$(Beval_intern.h \$B\$r(B include
\$B\$7\$F\$\$\$k\$s\$G\$7\$g\$&\$+!%(BTAG_BREAK \$B\$H\$+\$r(B
\$B8+\$k\$?\$a\$+\$J!%;d\$O\$J\$<\$3\$3\$rB([email protected]\$m\$&!%(Binclude
\$B\$7\$?\$/\$J\$+\$C\$?\$+(B
\$B\$i\$+\$J\$!!%(B

\$B\$-\$?\$6\$o\$G\$9!#(B

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

\$B\$3\$s\$J\$s\$G!"\$I\$&\$G\$7\$g\$&\$+!)(B
loopval_popped\$B\$N7o\$O!"0l%+=j\$r=|\$\$\$F\$^[email protected]~\$l\$F\$^\$;\$s!#(B

# Index: vm_core.h

— vm_core.h (\$B%j%S%8%g%s(B 31028)
+++ vm_core.h (\$B:n6H%3%T!<(B)
@@ -583,6 +583,11 @@
#define RUBYVM_CFUNC_FRAME_P(cfp)
(VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC)

+/* vm_throw state /
+#define VM_THROW_NO_DFP 0x8000
+#define VM_THROW_LEVEL_SHIFT 16
+
/
inline cache */
typedef struct iseq_inline_cache_entry *IC;

# Index: compile.c

— compile.c (\$B%j%S%8%g%s(B 31028)
+++ compile.c (\$B:n6H%3%T!<(B)
@@ -14,6 +14,7 @@

#define USE_INSN_STACK_INCREASE 1
#include “vm_core.h”
+#include “eval_intern.h”
#include “iseq.h”
#include “insns.inc”
#include “insns_info.inc”
@@ -3355,11 +3356,7 @@

`````` level++;
if (ip->compile_data->redo_label != 0) {
``````
• ``````   level = 0x8000;
``````
• ``````   if (ip->compile_data->loopval_popped == 0) {
``````
• `````` /* need value */
``````
• `````` level |= 0x4000;
``````
• ``````   }
``````
• ``````   level = VM_THROW_NO_DFP;
goto break_by_insn;
``````
}
else if (ip->type == ISEQ_TYPE_BLOCK) {
@@ -3419,7 +3416,7 @@
break;
}
• level = 0x8000 | 0x4000;
• level = VM_THROW_NO_DFP;
if (ip->compile_data->redo_label != 0) {
/* while loop */
break;
@@ -3481,7 +3478,7 @@
else {
rb_iseq_t *ip;
unsigned long level;
• `````` level = 0x8000 | 0x4000;
``````
• `````` level = VM_THROW_NO_DFP;
ip = iseq;
while (ip) {
``````
if (!ip->compile_data) {
Index: vm_insnhelper.c
===================================================================
— vm_insnhelper.c (\$B%j%S%8%g%s(B 31028)
+++ vm_insnhelper.c (\$B:n6H%3%T!<(B)
@@ -1432,9 +1432,9 @@
rb_num_t throw_state, VALUE throwobj)
{
• int state = (int)(throw_state & 0xff);
• int flag = (int)(throw_state & 0x8000);
• rb_num_t level = throw_state >> 16;
• int state = (int)throw_state & VM_THROW_STATE_MASK;

• int flag = (int)throw_state & VM_THROW_NO_DFP;

• rb_num_t level = (rb_num_t)(throw_state >> VM_THROW_LEVEL_SHIFT);

if (state != 0) {
VALUE *pt = 0;

\$B\$-\$?\$6\$o\$G\$9!#(B

[email protected]\$5\$s\$HOC\$7\$,\$G\$-\$k\$J\$s\$F9,\$;[email protected]\$J\$!(B

\$B!!\$3\$l!\$2?\$d\$C\$F\$k\$s\$G\$7\$?\$C\$1!%%3!<%I8+\$?\$1\$I;W\$\$=P\$;\$J\$\$(B…\$B!%\$J\$s\$+!\$(B
\$B\$3\$l\$,@_Dj\$5\$l\$F\$\$\$k\$H!\$5U\$K(B dfp \$B\$r8+\$F\$\$\$J\$\$\$h\$&\$J!%(B

\$B\$"!“MQES\$H\$7\$F\$O5U\$G\$9\$M!#(B
[email protected]\$H!”(Bdfp\$B\$r8+\$^\$9\$h\$M!#\$H\$\$\$&\$+!"(Bthrow\$BL?Na\$NJV\$jCM\$r(B1\$B\$K\$9\$k\$+!"(Bdfp\$B\$K\$9\$k\$+!"\$G\$9\$+\$M!#(B

# \$B5U\$K\$H\$i\$(\$F\$7\$^\$C\$?\$+(B

VM_THROW_RETRUN_NOT_DFP\$B\$+\$J!)(B

+#define VM_THROW_LVL_SHIFT 16
+#define VM_THROW_LEVEL(s) (s >> VM_THROW_LVL_SHIFT)

\$B!!(Blvl \$B\$C\$F(B level \$B\$G\$7\$g\$&\$+!%(B

\$B\$=\$&\$G\$9!#(BVM_THROW_LEVEL_SHIFT\$B\$K\$7\$^\$9!#(B

+#include “eval_intern.h”

\$B!!\$J\$<!\$(Beval_intern.h \$B\$r(B include \$B\$7\$F\$\$\$k\$s\$G\$7\$g\$&\$+!%(BTAG_BREAK
\$B\$H\$+\$r(B
\$B8+\$k\$?\$a\$+\$J!%;d\$O\$J\$<\$3\$3\$rB([email protected]\$m\$&!%(Binclude \$B\$7\$?\$/\$J\$+\$C\$?\$+(B
\$B\$i\$+\$J\$!!%(B

eval_intern.h\$B\$r(Binclude\$B\$9\$k\$N\$O!"(BTAG_xxx\$B\$r8+\$k\$?\$a\$G\$9!#(B

\$B\$b\$C\$H\$b!"(B0x8000\$B\$r%;%C%H\$5\$l\$k\$h\$&\$J%3!<%I\$,=q\$1\$J\$/\$F!":\$\$C\$F\$b\$\$\$k\$s\$G\$9\$1\$I\$M!#(B

\$B;d\$O\$J\$<\$3\$3\$rB([email protected]\$m\$&!%(B
\$B?M4V\$,A[5/\$G\$-\$k5-21\$N\$[\$&\$,>/\$J\$\$\$G\$9\$h!#(B

\$B\$-\$?\$6\$o\$G\$9!#(B

\$B2?EY\$b2?EY\$b!"\$9\$\$\$^\$;\$s!#(B
TAG_xxx\$B\$r%^%8%C%/%J%s%P\$N\$^\$^\$G\$7\$?!#(B
\$B\$"\$H!"\$d\$C\$Q\$j(B

• int state = (int)(throw_state & 0xff);
• int flag = (int)(throw_state & 0x8000);
• rb_num_t level = throw_state >> 16;
\$B\$N\$"\$?\$j\$r%^%/%m\$K\$7\$^\$7\$?!#(B

# Index: vm_core.h

— vm_core.h (\$B%j%S%8%g%s(B 31028)
+++ vm_core.h (\$B:n6H%3%T!<(B)
@@ -583,6 +583,13 @@
#define RUBYVM_CFUNC_FRAME_P(cfp)
(VM_FRAME_TYPE(cfp) == VM_FRAME_MAGIC_CFUNC)

+/* vm_throw state /
+#define VM_THROW_NO_DFP 0x8000
+#define VM_THROW_LEVEL_SHIFT 16
+#define GET_VM_THROW_NO_DFP(s) ((int)(s & VM_THROW_NO_DFP))
+#define GET_VM_THROW_LEVEL(s) ((rb_num_t)(s >> VM_THROW_LEVEL_SHIFT))
/
inline cache */
typedef struct iseq_inline_cache_entry *IC;

# Index: compile.c

— compile.c (\$B%j%S%8%g%s(B 31028)
+++ compile.c (\$B:n6H%3%T!<(B)
@@ -14,6 +14,7 @@

#define USE_INSN_STACK_INCREASE 1
#include “vm_core.h”
+#include “eval_intern.h”
#include “iseq.h”
#include “insns.inc”
#include “insns_info.inc”
@@ -3336,7 +3337,7 @@
break_by_insn:
/* escape from block */
COMPILE(ret, “break val (block)”, node->nd_stts);

• `````` ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x02) /*
``````

TAG_BREAK */ );

• `````` ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | TAG_BREAK)
``````

/* TAG_BREAK */ );
if (poped) {
}
@@ -3355,11 +3356,7 @@

`````` level++;
if (ip->compile_data->redo_label != 0) {
``````
• ``````   level = 0x8000;
``````
• ``````   if (ip->compile_data->loopval_popped == 0) {
``````
• `````` /* need value */
``````
• `````` level |= 0x4000;
``````
• ``````   }
``````
• ``````   level = VM_THROW_NO_DFP;
goto break_by_insn;
``````
}
else if (ip->type == ISEQ_TYPE_BLOCK) {
@@ -3419,7 +3416,7 @@
break;
}
• level = 0x8000 | 0x4000;
• level = VM_THROW_NO_DFP;
if (ip->compile_data->redo_label != 0) {
/* while loop */
break;
@@ -3435,7 +3432,7 @@
}
if (ip != 0) {
COMPILE(ret, “next val”, node->nd_stts);
• ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x03) /*
TAG_NEXT */ );
• ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | TAG_NEXT) /*
TAG_NEXT */ );

if (poped) {
@@ -3481,7 +3478,7 @@
else {
rb_iseq_t *ip;
unsigned long level;

• `````` level = 0x8000 | 0x4000;
``````
• `````` level = VM_THROW_NO_DFP;
ip = iseq;
while (ip) {
``````
if (!ip->compile_data) {
@@ -3503,7 +3500,7 @@
}
if (ip != 0) {
• ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x05) /*
TAG_REDO */ );
• ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | TAG_REDO) /*
TAG_REDO */ );

if (poped) {
@@ -3518,7 +3515,7 @@
case NODE_RETRY:{
if (iseq->type == ISEQ_TYPE_RESCUE) {

• `````` ADD_INSN1(ret, nd_line(node), throw, INT2FIX(0x04) /* TAG_RETRY
``````

*/ );

• `````` ADD_INSN1(ret, nd_line(node), throw, INT2FIX(TAG_RETRY) /*
``````

TAG_RETRY */ );

``````   if (poped) {
``````

@@ -4316,7 +4313,7 @@
}
}
else {

• ``````   ADD_INSN1(ret, nd_line(node), throw, INT2FIX(0x01) /*
``````

TAG_RETURN */ );

• ``````   ADD_INSN1(ret, nd_line(node), throw, INT2FIX(TAG_RETURN) /*
``````

# TAG_RETURN */ ); if (poped) { ADD_INSN(ret, nd_line(node), pop); } Index: vm_insnhelper.c

— vm_insnhelper.c (\$B%j%S%8%g%s(B 31028)
+++ vm_insnhelper.c (\$B:n6H%3%T!<(B)
@@ -1432,9 +1432,9 @@
rb_num_t throw_state, VALUE throwobj)
{

• int state = (int)(throw_state & 0xff);
• int flag = (int)(throw_state & 0x8000);
• rb_num_t level = throw_state >> 16;
• int state = GET_VM_THROW_STATE(throw_state);

• int flag = GET_VM_THROW_NO_DFP(throw_state);

• rb_num_t level = GET_VM_THROW_LEVEL(throw_state);

if (state != 0) {
VALUE *pt = 0;

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

``````          entry->type == CATCH_TYPE_BREAK ||
entry->type == CATCH_TYPE_NEXT) {
entry->sp--;
}
}
``````

\$B\$3\$N%3%a%s%H\$G\$9\$M!)(B

\$B\$=\$&\$G\$9!#(B

\$B!!\$3\$N(B sp-- \$B\$9\$k\$N\$,!\$\$J\$s\$G(B sp–
[email protected]\$1\$G\$\$\$\$\$N\$+\$o\$+\$i\$J\$+\$C\$?!\$\$H\$\$\$&(B
\$B\$+!\$3N\$+!\$JL\$N>l9g\$b\$"\$k\$h\$&\$J5\$\$,\$9\$k\$1\$I!\$\$^\$!(B test-all \$B\$,F0\$/\$+\$i\$\$\$\$(B
\$B\$+!\$\$H;W\$C\$F!\$\$b\$C\$H\$A\$c\$s\$H\$7\$J\$\$\$H\$\$\$+\$s\$J\$!!\$\$H;W\$C\$F=q\$\$\$F\$\$\$?\$s\$8\$c(B
\$B\$J\$\$\$+\$H;W\$\$\$^\$9!%(B

\$B\$\$\$d!"85\$O\$b\$C\$H\$R\$I\$\$%3!<%[email protected]\$C\$?\$s\$G\$9\$h!#(B

``````       /* TODO: Dirty Hack!  Fix me */
if (entry->type == CATCH_TYPE_RESCUE ||
entry->type == CATCH_TYPE_BREAK ||
(((ptr[0] & 0x10000) == 0)
&& entry->type == CATCH_TYPE_NEXT)) {
entry->sp--;
}
``````

rescue \$B\$H(B break \$B\$H(B next
\$B\$K\$O0z?t\$,\$"\$k\$H\$\$\$&6&[email protected]\$,\$"\$k\$N\$G!"(B
\$B8=>u\$N%3!<%[email protected]\$H;W\$\$\$^\$9!#(B
0x10000 \$B\$J\$s\$F%^%8%C%/%J%s%P!<\$G\$O\$J\$/(B CATCH_TYPE_NEXT_WITH_NO_ARG
\$B\$H\$+(B CATCH_TYPE_NEXT_FOR_WHILE \$B\$H\$+JL\$N%i%Y%k\$rDj5A\$7\$F\$\$\$l\$P(B
Dirty \$B\$H\$^\$G\$O;W\$o\$J\$+\$C\$?\$G\$9\$,!#(B

# \$B\$A\$J\$_\$KEv;~\$N(B IRC \$B%m%0H4?h(B

13:44:10 <ko1_ndk> catch_type \$B\$rA}\$d\$7\$?\$i\$b\$C\$HC1=c\$K\$J\$k!)(B
13:46:19 next \$B\$r%-%c%C%A\$9\$k\$1\$I0z?t\$r%9%?%C%/\$K:\$;\$J\$\$(B
catch_type \$B\$H:\$;\$k(B catch_type \$B\$G\$9\$+(B
13:46:41 <ko1_ndk> \$B\$=\$&\$=\$&(B
13:47:37 \$B\$I\$C\$A\$,9,\$;\$J\$N\$+\$J\$"(B
13:50:49 \$B\$=\$b\$=\$b(B while \$B\$NCf\$N(B next
\$B\$N0z?t\$,L50UL#\$G5\$;}\$A0-\$\$(B

\$B<B9T;~\$N(B sp \$B\$NA+0\$O!\$\$b\$&\$A\$g\$C\$H%U%)!<%^%k\$K\$-\$C\$A\$j7h\$a\$i\$l\$k\$h\$&\$K(B
\$B\$7\$?\$\$\$J\$!!\$\$H;W\$C\$F\$\$\$?\$j\$7\$F!\$J|\$C\$?\$i\$+\$7\$G\$9!J:#\$O!\$%P%0\$,\$"\$C\$?\$i%"(B
\$B%I%[%C%/\$KD>\$9!\$\$C\$F46\$8!K!%1sF#\$5\$s\$,\$-\$C\$A\$j7h\$^\$k\$h\$&\$K!\$?’!9JQ99\$7\$F(B
\$B\$/\$l\$?HG\$,\$"\$C\$?\$H;W\$&[email protected]\$1\$I!\$Bg\$-\$9\$.\$F(B reject \$B\$7\$A\$c\$C\$?\$s\$G\$9\$+\$M!%(B

[email protected]<0\$KDs0F\$7\$?\$+\$I\$&\$+3P\$(\$F\$J\$\$\$G\$9\$,!"(Bsp \$BA+0\4X78\$N%P%0\$r(B
\$BKPLG\$G\$-\$k(B (+ \$B%3!<%I\$,\$-\$l\$\$\$K\$J\$k(B) \$BDxEY\$N%a%j%C%H\$7\$+\$J\$+\$C(B
\$B\$?\$N\$G!"@Q6KE*\$K<h\$jF~\$l\$kM}M3\$,\$J\$\$!"[email protected]\$C\$?5\$\$,\$7\$^\$9!#(B

\$BK\Ev\$O!\$%U%m!<%0%i%U\$+\$J\$s\$+\$r\$-\$A\$s\$H:n\$C\$F!\$\$-\$C\$A\$j\$7\$?\$\$\$H\$3\$m\$J\$s(B
\$B\$G\$9\$,!%(B

\$B\$\$\$A\$\$\$A%a%b%j>e\$K%0%i%[email protected]\$^\$G\$O\$7\$J\$\$\$b\$N\$N!"(Bsp \$B\$r\$-\$C(B
\$B\$A\$j7h\$a\$k\$H\$\$\$&;d\$N%Q%C%A\$O\$=\$&\$\$\$&%Q%C%[email protected]\$C\$?\$O\$:!#(B
\$B%3%s%Q%\$%i\$N%3!<%I\$G%U%m!<\$rI=8=\$7\$F\$\$\$k\$H\$\$\$&0UL#\$G!#(B

\$B\$-\$?\$6\$o\$G\$9!#(B

[email protected]\$\$\$V!"D9\$/\$J\$C\$A\$c\$\$\$^\$7\$?\$M!#(B

\$BG0\$N\$?\$aIU\$12C\$(\$k\$H!"!V<+J,[email protected]\$\$\$?\$\$\$o\$1\$G\$O\$J\$/!"(B
\$B\$"\$/\$^\$G\$4;29M\$G\$9!#(B
\$B\$`\$7\$m%a!<%k\$G\$d\$j\$H\$j\$7\$?\$[\$&\$,5-O?\$,;D\$C\$F\$h\$\$\$+\$b\$7\$l\$J\$\$!#(B

\$B\$H\$\$\$&\$N\$,p\$G\$9!#(B

\$BC5\$7J}\$NI}\$r9-\$2\$F\$\$\$+\$J\$\$\$H\$\$\$1\$J\$\$\$G\$9\$M!#(B
\$B\$"\$j\$,\$H\$&\$4\$6\$\$\$^\$9!#(B

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

2011\$BG/(B3\$B7n(B5\$BF|(B21:07 \$B\$-\$?\$6\$o\$1\$s\$\$\$A(B
removed[email protected]:

\$B\$=\$&[email protected]\$&\$N\$KG:[email protected]\$H\$-\$O(B git log -p \$B\$H\$+\$G2a5n\$N5-O?\$r8+\$F\$\$k\$H(B
\$B\$\$\$\$\$G\$9\$h!#(B
\$B<!\$+\$i!"\$=\$&\$7\$F\$
\$^\$9!#(B

\$BG0\$N\$?\$aIU\$12C\$(\$k\$H!"!V<+J,[email protected]\$\$\$?\$\$\$o\$1\$G\$O\$J\$/!"(B
\$B\$"\$/\$^\$G\$4;29M\$G\$9!#(B
\$B\$`\$7\$m%a!<%k\$G\$d\$j\$H\$j\$7\$?\$[\$&\$,5-O?\$,;D\$C\$F\$h\$\$\$+\$b\$7\$l\$J\$\$!#(B