ワナベと申します。

2008/06/23 21:15 Shumpei Akai <admin / flexfrank.net>:
> 昨日のRejectRejectKaigiで発表したVM::InstructionSequence.loadのバグを報
> 告します.

VM::InstructionSequence.load なんてあるんですね。
コメントアウトされている実装を指してバグと言っていいのかどうか分かりませんが
赤井さんの示されたコードが動くようにするならこんな感じでしょうか。

実装を読むと、iseq は常に local_size == local_table_size + 1 のようだったので
そのように変更したのですが、読み間違えていたら不都合があるかもしれません。

Index: compile.c
===================================================================
--- compile.c	(revision 17547)
+++ compile.c	(working copy)
@@ -4983,22 +4983,16 @@
 		    VALUE exception, VALUE body)
 {
     int i;
-    int opt = 0;
     ID *tbl;
     struct st_table *labels_table = st_init_numtable();

     DECL_ANCHOR(anchor);

     INIT_ANCHOR(anchor);
-    if (iseq->type == ISEQ_TYPE_METHOD ||
-	iseq->type == ISEQ_TYPE_TOP ||
-	iseq->type == ISEQ_TYPE_CLASS) {
-	opt = 1;
-    }

-    iseq->local_table_size = opt + RARRAY_LEN(locals);
+    iseq->local_table_size = RARRAY_LEN(locals);
     iseq->local_table = tbl = (ID *)ALLOC_N(ID *, iseq->local_table_size);
-    iseq->local_size = opt + iseq->local_table_size;
+    iseq->local_size = iseq->local_table_size + 1;

     for (i=0; i<RARRAY_LEN(locals); i++) {
 	VALUE lv = RARRAY_PTR(locals)[i];

-- 
ワナベ