[前][次][番号順一覧][スレッド一覧][生データ]

yarv-diff:174

From: ko1 atdot.net
Date: 28 Dec 2005 01:55:07 -0000
Subject: [yarv-diff:174] r333 - in trunk: . rb template yarvtest

Author: ko1
Date: 2005-12-28 10:55:06 +0900 (Wed, 28 Dec 2005)
New Revision: 333

Modified:
   trunk/ChangeLog
   trunk/compile.c
   trunk/compile.h
   trunk/disasm.c
   trunk/eval.c
   trunk/eval_error.h
   trunk/eval_jump.h
   trunk/eval_method.h
   trunk/insns.def
   trunk/rb/allload.rb
   trunk/rb/insns2vm.rb
   trunk/template/insns.inc.tmpl
   trunk/template/insns_info.inc.tmpl
   trunk/template/minsns.inc.tmpl
   trunk/template/opt_sc.inc.tmpl
   trunk/template/optinsn.inc.tmpl
   trunk/template/optunifs.inc.tmpl
   trunk/template/vmtc.inc.tmpl
   trunk/test.rb
   trunk/variable.c
   trunk/vm.c
   trunk/vm_evalbody.h
   trunk/vm_macro.def
   trunk/yarvcore.c
   trunk/yarvcore.h
   trunk/yarvtest/test_class.rb
   trunk/yarvtest/test_method.rb
Log:
	* compile.c, compile.h : refactoring (remove self passing, etc)

	* disasm.c : support showing ID of method/dynamic local variables

	* rb/allload.rb : add verbose version (it's enable by $DEBUG)

	* template/insns.inc.tmpl, template/insns_info.inc.tmpl,
	template/minsns.inc.tmpl, template/opt_sc.inc.tmpl,
	template/optinsn.inc.tmpl, template/optunifs.inc.tmpl,
	template/vmtc.inc.tmpl : fix a comment

	* variable.c (mod_av_set) : fix to clear inline cache ([yarv-dev:720])

	* eval_method.h : fix to clear inline method cache

	* vm.c, rb/insns2vm.rb, template/insns_info.inc.tmpl, compile.c,
	insns.def, vm_evalbody.h, vm_macro.def :
	fix operands types (ulong -> num_t, ...)

	* vm_macro.def : fix to check SPECIAL_CONST_P() at splat array
	([yarv-dev:722])

	* yarvcore.c : fix to throw syntax error

	* yarvcore.h, eval.c, eval_error.h, eval_jump.h :
	add yarv_vm_t#exit_code to fix problem at cleanup ([yarv-dev:723])

	* insns.def : fix to invoke zsuper in method defined by define_method
	([yarv-dev:704])

	* yarvtest/test_class.rb : add tests for above

	* yarvtest/test_method.rb : fix comments



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/ChangeLog	2005-12-28 01:55:06 UTC (rev 333)
@@ -4,6 +4,43 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-12-28(Wed) 10:36:45 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* compile.c, compile.h : refactoring (remove self passing, etc)
+
+	* disasm.c : support showing ID of method/dynamic local variables
+
+	* rb/allload.rb : add verbose version (it's enable by $DEBUG)
+
+	* template/insns.inc.tmpl, template/insns_info.inc.tmpl,
+	template/minsns.inc.tmpl, template/opt_sc.inc.tmpl,
+	template/optinsn.inc.tmpl, template/optunifs.inc.tmpl,
+	template/vmtc.inc.tmpl : fix a comment
+
+	* variable.c (mod_av_set) : fix to clear inline cache ([yarv-dev:720])
+
+	* eval_method.h : fix to clear inline method cache
+
+	* vm.c, rb/insns2vm.rb, template/insns_info.inc.tmpl, compile.c,
+	insns.def, vm_evalbody.h, vm_macro.def :
+	fix operands types (ulong -> num_t, ...)
+
+	* vm_macro.def : fix to check SPECIAL_CONST_P() at splat array
+	([yarv-dev:722])
+
+	* yarvcore.c : fix to throw syntax error
+
+	* yarvcore.h, eval.c, eval_error.h, eval_jump.h :
+	add yarv_vm_t#exit_code to fix problem at cleanup ([yarv-dev:723])
+
+	* insns.def : fix to invoke zsuper in method defined by define_method
+	([yarv-dev:704])
+
+	* yarvtest/test_class.rb : add tests for above
+
+	* yarvtest/test_method.rb : fix comments
+
+
 2005-12-27(Tue) 01:52:07 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* array.c, intern.h, insns.def : expose rb_ary_replace and use it

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/compile.c	2005-12-28 01:55:06 UTC (rev 333)
@@ -13,6 +13,7 @@
 #include "yarvcore.h"
 #include "compile.h"
 #include "insns.inc"
+#include "insns_info.inc"
 
 
 #ifdef HAVE_STDARG_PROTOTYPES
@@ -79,8 +80,8 @@
 static void debug_list(LINK_ANCHOR *anchor);
 #endif
 
-void dump_disasm_anchor(LINK_ANCHOR *anc);
-void dump_disasm_list(LINK_ELEMENT* elem);
+static void dump_disasm_anchor(LINK_ANCHOR *anc);
+static void dump_disasm_list(LINK_ELEMENT* elem);
 
 static int insn_data_length(INSN *insnobj);
 static int insn_data_line_no(INSN *insnobj);
@@ -93,8 +94,8 @@
                            int insn_id, int argc, ...);
 static LABEL *new_label_body(yarv_iseq_t *iseq, int line);
 
-static int iseq_compile_each(VALUE self, LINK_ANCHOR *anchor, NODE* n, int);
-static int iseq_setup(VALUE self, LINK_ANCHOR *anchor);
+static int iseq_compile_each(yarv_iseq_t *iseq, LINK_ANCHOR *anchor, NODE* n, int);
+static int iseq_setup(yarv_iseq_t *iseq, LINK_ANCHOR *anchor);
 
 static int iseq_optimize(yarv_iseq_t *iseq, LINK_ANCHOR *anchor);
 static int iseq_insns_unification(yarv_iseq_t *iseq,  LINK_ANCHOR *anchor);
@@ -104,8 +105,8 @@
 static int set_exception_table(yarv_iseq_t *iseq);
 static int set_localtbl(yarv_iseq_t *iseq, ID* tbl);
 static int set_localtbl_eval(yarv_iseq_t *iseq, ID* tbl);
-static int set_arguments(VALUE self, yarv_iseq_t *iseq, LINK_ANCHOR *anchor, NODE *node);
-static NODE* set_block_local_tbl(VALUE self, yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor);
+static int set_arguments(yarv_iseq_t *iseq, LINK_ANCHOR *anchor, NODE *node);
+static NODE* set_block_local_tbl(yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor);
 static int set_exception_tbl(yarv_iseq_t *iseq);
 static int set_optargs_table(yarv_iseq_t *iseq);
 
@@ -146,7 +147,7 @@
   iseq->node = node;
   
   if(iseq->type == ISEQ_TYPE_BLOCK){
-    node = set_block_local_tbl(self, iseq, node, list_anchor);
+    node = set_block_local_tbl(iseq, node, list_anchor);
   }
 
   if(node && nd_type(node) == NODE_SCOPE){
@@ -164,7 +165,7 @@
         if(nd_type(sn_body->nd_head) == NODE_ARGS){
           /* some method attribute process */
           ndargs = sn_body->nd_head;
-          set_arguments(self, iseq, list_anchor, ndargs);
+          set_arguments(iseq, list_anchor, ndargs);
           
           /* with sn_body->nd_head */
           if(iseq->type == ISEQ_TYPE_METHOD){
@@ -201,7 +202,7 @@
         /* some method attribute process */
         debugs("empty method\n");
         
-        set_arguments(self, iseq, list_anchor, sn_body);
+        set_arguments(iseq, list_anchor, sn_body);
         ADD_INSN(list_anchor, nd_line(sn_body), putnil);
 
         iseq->rewind_frame_size = iseq->local_size + MREWIND_DSIZE();
@@ -272,14 +273,14 @@
 
   if(iseq->type == ISEQ_TYPE_RESCUE ||
      iseq->type == ISEQ_TYPE_ENSURE){
-    ADD_INSN2(list_anchor, 0, getdynamic, I2F(1), I2F(0));
-    ADD_INSN1(list_anchor, 0, throw, I2F(0) /* continue throw */);
+    ADD_INSN2(list_anchor, 0, getdynamic, INT2FIX(1), INT2FIX(0));
+    ADD_INSN1(list_anchor, 0, throw, INT2FIX(0) /* continue throw */);
   }
   else{
     ADD_INSN(list_anchor, iseq->compile_data->last_line, end);
   }
 
-  return iseq_setup(self, list_anchor);
+  return iseq_setup(iseq, list_anchor);
 }
 
 VALUE th_eval(void *);
@@ -659,10 +660,10 @@
 {
   INSN *iobj = 0;
 #if OPT_BASIC_OPERATIONS
-  if(block == 0 && flag == I2F(0)){
+  if(block == 0 && flag == INT2FIX(0)){
     ID mid = SYM2ID(id);
 
-    if(argc == I2F(1)){
+    if(argc == INT2FIX(1)){
       if(0){
       }
       else if(mid == idPLUS){
@@ -696,7 +697,7 @@
         iobj = new_insn_body(iseq, line_no, BIN(opt_aref), 0);
       }
     }
-    else if(argc == I2F(0)){
+    else if(argc == INT2FIX(0)){
       if(mid == idLength){
         iobj = new_insn_body(iseq, line_no, BIN(opt_length), 0);
       }
@@ -704,7 +705,7 @@
         iobj = new_insn_body(iseq, line_no, BIN(opt_succ), 0);
       }
     }
-    else if(argc == I2F(2)){
+    else if(argc == INT2FIX(2)){
       if(mid == idASET){
         iobj = new_insn_body(iseq, line_no, BIN(opt_aset), 0);
       }
@@ -746,11 +747,8 @@
 }
 
 static int
-iseq_setup(VALUE self, LINK_ANCHOR *anchor)
+iseq_setup(yarv_iseq_t *iseq, LINK_ANCHOR *anchor)
 {
-  yarv_iseq_t *iseq;
-  GetISeqVal(self, iseq);
-
 //  debugs("[compile step 2] (iseq_array_to_linkedlist)\n");
 //  iseq_array_to_linkedlist_each(anchor, seq_ary);
   
@@ -791,7 +789,7 @@
   GC_CHECK();
   
   if(CPDEBUG > 1){
-    VALUE str = iseq_disasm(self);
+    VALUE str = iseq_disasm(iseq->self);
     printf("%s\n", StringValueCStr(str));
     fflush(stdout);
   }
@@ -979,7 +977,7 @@
 }
 
 static int
-set_block_initializer(VALUE self, yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor)
+set_block_initializer(yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor)
 {
   DECL_ANCHOR(anc);
   LINK_ELEMENT *elem;
@@ -996,7 +994,7 @@
 }
 
 static NODE*
-set_block_local_tbl(VALUE self, yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor)
+set_block_local_tbl(yarv_iseq_t *iseq, NODE *node, LINK_ANCHOR *anchor)
 {
   NODE *rnode;
   
@@ -1022,8 +1020,8 @@
             /* idx-th param, current level*/
             
             ADD_INSN2(anchor, nd_line(node),
-                      getdynamic, I2F(iseq->local_size - i), I2F(0));
-            set_block_initializer(self, iseq, nargs->nd_head, anchor);
+                      getdynamic, INT2FIX(iseq->local_size - i), INT2FIX(0));
+            set_block_initializer(iseq, nargs->nd_head, anchor);
           }
           i++;
           nargs = nargs->nd_next;
@@ -1036,8 +1034,8 @@
 
         if(nd_type(node->nd_var->nd_args) != NODE_DASGN_CURR){
           ADD_INSN2(anchor, nd_line(node), getdynamic,
-                    I2F(iseq->local_size - i), I2F(0));
-          set_block_initializer(self, iseq, node->nd_var->nd_args, anchor);
+                    INT2FIX(iseq->local_size - i), INT2FIX(0));
+          set_block_initializer(iseq, node->nd_var->nd_args, anchor);
         }
       }
       break;
@@ -1049,8 +1047,8 @@
     /* for 1.x compatibility */
     default:{
       /* first param, current level*/
-      ADD_INSN2(anchor, nd_line(node), getdynamic, I2F(iseq->local_size), I2F(0));
-      set_block_initializer(self, iseq, nargs, anchor);
+      ADD_INSN2(anchor, nd_line(node), getdynamic, INT2FIX(iseq->local_size), INT2FIX(0));
+      set_block_initializer(iseq, nargs, anchor);
       break;
     }
     }
@@ -1083,11 +1081,9 @@
 }
 
 static int
-get_dyna_var_idx(VALUE self, ID id, int *level, int *ls)
+get_dyna_var_idx(yarv_iseq_t *iseq, ID id, int *level, int *ls)
 {
-  yarv_iseq_t *iseq;
   int lv = 0, idx;
-  GetISeqVal(self, iseq);
   
   while(iseq){
     if((idx = get_dyna_var_idx_at_raw(iseq, id)) >= 0){
@@ -1105,8 +1101,7 @@
 
  */
 static int
-set_arguments(VALUE self, yarv_iseq_t *iseq,
-              LINK_ANCHOR *optargs, NODE *node)
+set_arguments(yarv_iseq_t *iseq, LINK_ANCHOR *optargs, NODE *node)
 {
   int i, j;
   
@@ -1300,7 +1295,7 @@
         char type = types[j];
         // printf("--> [%c - (%d-%d)]\n", type, k, j);
         switch(type){
-        case 'L':{          /* label(destination position) */
+        case TS_OFFSET:{          /* label(destination position) */
           lobj = (LABEL*)operands[j];
           if(lobj->set != Qtrue){
             rb_bug("unknown label");
@@ -1311,7 +1306,7 @@
           generated_iseq[pos+1+j] = lobj->position - (pos + len);
           break;
         }
-        case 'H':{
+        case TS_CDHASH:{
           /*
            * [[obj, label], ...]
            */
@@ -1333,10 +1328,12 @@
           iseq_add_mark_object(iseq, map);
           break;
         }
-        case 'U':          /* ulong */
+        case TS_LINDEX:
+        case TS_DINDEX:
+        case TS_NUM:          /* ulong */
           generated_iseq[pos+1+j] = FIX2INT(operands[j]);
           break;
-        case 'B':          /* BLOCK */
+        case TS_BLOCKISEQ:    /* BLOCK */
           {
             VALUE v = operands[j];
             yarv_iseq_t *block = 0;
@@ -1346,8 +1343,7 @@
             generated_iseq[pos+1+j] = (VALUE)block;
             break;
           }
-        case 'V':          /* VALUE */
-        case 'C':          /* class path */
+        case TS_VALUE:          /* VALUE */
           {
             VALUE v = operands[j];
             generated_iseq[pos+1+j] = v;
@@ -1357,17 +1353,17 @@
             }
             break;
           }
-        case 'M':          /* inline cache */
+        case TS_IC:          /* inline cache */
           {
             VALUE v = (VALUE)NEW_INLINE_CACHE_ENTRY();
             generated_iseq[pos+1+j] = v;
             iseq_add_mark_object(iseq, v);
             break;
           }
-        case 'I':          /* ID */
+        case TS_ID:          /* ID */
           generated_iseq[pos+1+j] = SYM2ID(operands[j]);
           break;
-        case 'G':
+        case TS_GENTRY:
           {
             struct global_entry *entry = (struct global_entry*)(operands[j] & (~1));
             generated_iseq[pos+1+j] = (VALUE)entry;
@@ -1875,7 +1871,7 @@
 
 
 static int
-compile_dstr(VALUE self, yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
+compile_dstr(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
 {
   NODE *list = node->nd_next;
   VALUE lit  = node->nd_lit;
@@ -1896,34 +1892,33 @@
     list = list->nd_next;
   }
   if(cnt > 1){
-    ADD_INSN1(ret, nd_line(node), concatstrings, I2F(cnt));
+    ADD_INSN1(ret, nd_line(node), concatstrings, INT2FIX(cnt));
   }
   
   return COMPILE_OK;
 }
 
 static int
-compile_branch_condition(VALUE self, yarv_iseq_t *iseq,
-                         LINK_ANCHOR *ret, NODE *cond,
+compile_branch_condition(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE *cond,
                          LABEL *then_label, LABEL *else_label)
 {
   switch(nd_type(cond)){
   case NODE_NOT:
-    compile_branch_condition(self, iseq, ret, cond->nd_body, else_label, then_label);
+    compile_branch_condition(iseq, ret, cond->nd_body, else_label, then_label);
     break;
 
   case NODE_AND:{
     LABEL *label = NEW_LABEL(nd_line(cond));
-    compile_branch_condition(self, iseq, ret, cond->nd_1st, label, else_label);
+    compile_branch_condition(iseq, ret, cond->nd_1st, label, else_label);
     ADD_LABEL(ret, label);
-    compile_branch_condition(self, iseq, ret, cond->nd_2nd, then_label, else_label);
+    compile_branch_condition(iseq, ret, cond->nd_2nd, then_label, else_label);
     break;
   }
   case NODE_OR:{
     LABEL *label = NEW_LABEL(nd_line(cond));
-    compile_branch_condition(self, iseq, ret, cond->nd_1st, then_label, label);
+    compile_branch_condition(iseq, ret, cond->nd_1st, then_label, label);
     ADD_LABEL(ret, label);
-    compile_branch_condition(self, iseq, ret, cond->nd_2nd, then_label, else_label);
+    compile_branch_condition(iseq, ret, cond->nd_2nd, then_label, else_label);
     break;
   }
   case NODE_LIT: /* NODE_LIT is always not true */
@@ -1947,7 +1942,7 @@
 }
 
 static int
-compile_array(VALUE self, yarv_iseq_t *iseq,
+compile_array(yarv_iseq_t *iseq,
               LINK_ANCHOR *ret, NODE *node_root, VALUE opt_p)
 {
   NODE *node = node_root;
@@ -1974,7 +1969,7 @@
     ADD_INSN1(ret, nd_line(node_root), duparray, ary);
   }
   else{
-    ADD_INSN1(anchor, line, newarray, I2F(len));
+    ADD_INSN1(anchor, line, newarray, INT2FIX(len));
     APPEND_LIST(ret, anchor);
   }
 
@@ -1998,8 +1993,7 @@
 }
 
 static int
-make_masgn_lhs(VALUE self, yarv_iseq_t *iseq,
-               LINK_ANCHOR *ret, NODE *node)
+make_masgn_lhs(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE *node)
 {
   
   switch(nd_type(node)){
@@ -2012,7 +2006,7 @@
     ret->last = ret->last->prev;
     
     dupidx = iobj->operands[1]; // RARRAY(iobj->operands)->ptr[1]; /* send sym, num, ... */
-    dupidx = I2F(FIX2INT(dupidx) + 1);
+    dupidx = INT2FIX(FIX2INT(dupidx) + 1);
     iobj->operands[1] = dupidx;
 
     ADD_INSN1(ret, nd_line(node), topn, dupidx);
@@ -2041,12 +2035,12 @@
 }
 
 static int
-compile_massign(VALUE self, yarv_iseq_t *iseq, LINK_ANCHOR *ret,
+compile_massign(yarv_iseq_t *iseq, LINK_ANCHOR *ret,
                 NODE *rhsn, NODE *splatn, NODE *lhsn, int llen)
 {
   if(lhsn != 0){
-    compile_massign(self, iseq, ret, rhsn, splatn, lhsn->nd_next, llen + 1);
-    make_masgn_lhs(self, iseq, ret, lhsn->nd_head);
+    compile_massign(iseq, ret, rhsn, splatn, lhsn->nd_next, llen + 1);
+    make_masgn_lhs(iseq, ret, lhsn->nd_head);
   }
   else{
     int lhs_splat = 0;
@@ -2091,18 +2085,18 @@
         }
 
         if(lhs_splat){
-          ADD_INSN1(ret, 0, newarray, I2F(si));
+          ADD_INSN1(ret, 0, newarray, INT2FIX(si));
         }
         break;
       }
       case NODE_TO_ARY:
         COMPILE  (ret, "rhs to ary", rhsn->nd_head);
-        ADD_INSN2(ret, 0, expandarray, I2F(llen), INT2FIX(lhs_splat));
+        ADD_INSN2(ret, 0, expandarray, INT2FIX(llen), INT2FIX(lhs_splat));
         break;
 
       case NODE_SPLAT:
         COMPILE  (ret, "rhs to ary (splat)", rhsn->nd_head);
-        ADD_INSN2(ret, nd_line(rhsn), expandarray, I2F(llen), INT2FIX(lhs_splat));
+        ADD_INSN2(ret, nd_line(rhsn), expandarray, INT2FIX(llen), INT2FIX(lhs_splat));
         break;
 
       case NODE_ARGSCAT:{
@@ -2122,11 +2116,11 @@
         
         if(llen > idx){
           COMPILE  (ret, "rhs to ary (argscat/splat)", rhsn->nd_body);
-          ADD_INSN2(ret, nd_line(rhsn), expandarray, I2F(llen - idx), INT2FIX(lhs_splat));
+          ADD_INSN2(ret, nd_line(rhsn), expandarray, INT2FIX(llen - idx), INT2FIX(lhs_splat));
         }
         else if(lhs_splat){
           COMPILE  (ret, "rhs to ary (argscat/splat)", rhsn->nd_body);
-          ADD_INSN2(ret, nd_line(rhsn), expandarray, I2F(llen - idx), INT2FIX(lhs_splat));
+          ADD_INSN2(ret, nd_line(rhsn), expandarray, INT2FIX(llen - idx), INT2FIX(lhs_splat));
         }
         break;
       }
@@ -2140,14 +2134,14 @@
     }
 
     if(lhs_splat){
-      make_masgn_lhs(self, iseq, ret, splatn);
+      make_masgn_lhs(iseq, ret, splatn);
     }
   }
   return COMPILE_OK;
 }
 
 static int
-compile_colon2(VALUE self, yarv_iseq_t *iseq, NODE *node,
+compile_colon2(yarv_iseq_t *iseq, NODE *node,
                LINK_ANCHOR *pref, LINK_ANCHOR *body)
 {
   switch(nd_type(node)){
@@ -2162,7 +2156,7 @@
     ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_mid));
     break;
   case NODE_COLON2:
-    compile_colon2(self, iseq, node->nd_head, pref, body);
+    compile_colon2(iseq, node->nd_head, pref, body);
     debugi("compile_colon2 - colon2", node->nd_mid);
     ADD_INSN1(body, nd_line(node), getconstant, ID2SYM(node->nd_mid));
     break;
@@ -2174,8 +2168,8 @@
 }
 
 static int
-defined_expr(VALUE self, yarv_iseq_t *iseq,
-             LINK_ANCHOR *ret, NODE *node, LABEL *lfinish, VALUE needstr)
+defined_expr(yarv_iseq_t *iseq, LINK_ANCHOR *ret,
+             NODE *node, LABEL *lfinish, VALUE needstr)
 {
   char *estr = 0;
 
@@ -2209,30 +2203,30 @@
 
   case NODE_IVAR:
     ADD_INSN (ret, nd_line(node), putnil);
-    ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_IVAR), ID2SYM(node->nd_vid), needstr);
+    ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_IVAR), ID2SYM(node->nd_vid), needstr);
     return 1;
 
   case NODE_GVAR:
     ADD_INSN (ret, nd_line(node), putnil);
-    ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_GVAR),
+    ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_GVAR),
               ((VALUE)node->nd_entry) | 1, needstr);
     return 1;
 
   case NODE_CVAR:
     ADD_INSN (ret, nd_line(node), putnil);
-    ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_CVAR),
+    ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_CVAR),
               ID2SYM(node->nd_vid), needstr);
     return 1;
 
   case NODE_CONST:
     ADD_INSN (ret, nd_line(node), putnil);
-    ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_CONST),
+    ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_CONST),
               ID2SYM(node->nd_vid), needstr);
     return 1;
   case NODE_COLON2:
     if(rb_is_const_id(node->nd_mid)){
       LABEL *lcont = NEW_LABEL(nd_line(node));
-      defined_expr(self, iseq, ret, node->nd_head, lfinish, Qfalse);
+      defined_expr(iseq, ret, node->nd_head, lfinish, Qfalse);
 
       ADD_INSNL(ret, nd_line(node), if, lcont);
       ADD_INSN (ret, nd_line(node), putnil);
@@ -2240,12 +2234,12 @@
 
       ADD_LABEL(ret, lcont);
       COMPILE(ret, "defined/colon2#nd_head", node->nd_head);
-      ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_CONST),
+      ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_CONST),
                 ID2SYM(node->nd_mid), needstr);
     }
     else{
       LABEL *lcont = NEW_LABEL(nd_line(node));
-      defined_expr(self, iseq, ret, node->nd_head, lfinish, Qfalse);
+      defined_expr(iseq, ret, node->nd_head, lfinish, Qfalse);
 
       ADD_INSNL(ret, nd_line(node), if, lcont);
       ADD_INSN (ret, nd_line(node), putnil);
@@ -2253,14 +2247,14 @@
 
       ADD_LABEL(ret, lcont);
       COMPILE(ret, "defined/colon2#nd_head", node->nd_head);
-      ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_METHOD),
+      ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_METHOD),
                 ID2SYM(node->nd_mid), needstr);
     }
     return 1;
   case NODE_COLON3:
     ADD_INSN1(ret, nd_line(node), putobject, rb_cObject);
     ADD_INSN3(ret, nd_line(node), defined,
-              I2F(DEFINED_CONST), ID2SYM(node->nd_mid), needstr);
+              INT2FIX(DEFINED_CONST), ID2SYM(node->nd_mid), needstr);
     return 1;
 
   /* method dispatch */
@@ -2270,7 +2264,7 @@
     if(nd_type(node) == NODE_CALL){
       LABEL *lcont = NEW_LABEL(nd_line(node));
 
-      defined_expr(self, iseq, ret, node->nd_recv, lfinish, Qfalse);
+      defined_expr(iseq, ret, node->nd_recv, lfinish, Qfalse);
       ADD_INSNL(ret, nd_line(node), if, lcont);
       ADD_INSN (ret, nd_line(node), putnil);
       ADD_INSNL(ret, nd_line(node), jump, lfinish);
@@ -2281,23 +2275,23 @@
     else{
       ADD_INSN(ret, nd_line(node), putself);
     }
-    ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_METHOD),
+    ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_METHOD),
               ID2SYM(node->nd_mid), needstr);
     return 1;
 
   case NODE_YIELD:
     ADD_INSN (ret, nd_line(node), putnil);
-    ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_YIELD), 0, needstr);
+    ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_YIELD), 0, needstr);
     return 1;
 
   case NODE_NTH_REF:
     ADD_INSN (ret, nd_line(node), putnil);
-    ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_REF), 0, needstr);
+    ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_REF), 0, needstr);
     return 1;
 
   case NODE_ZSUPER:
     ADD_INSN (ret, nd_line(node), putnil);
-    ADD_INSN3(ret, nd_line(node), defined, I2F(DEFINED_ZSUPER), 0, needstr);
+    ADD_INSN3(ret, nd_line(node), defined, INT2FIX(DEFINED_ZSUPER), 0, needstr);
     return 1;
 
   default:{
@@ -2396,7 +2390,7 @@
 }
 
 static void
-add_ensure_iseq(LINK_ANCHOR *ret, yarv_iseq_t *iseq, VALUE self)
+add_ensure_iseq(LINK_ANCHOR *ret, yarv_iseq_t *iseq)
 {
   struct iseq_compile_data_ensure_node_stack *enlp =
     iseq->compile_data->ensure_node_stack;
@@ -2429,14 +2423,10 @@
   poped: This node will be poped
  */
 static int
-iseq_compile_each(VALUE self, LINK_ANCHOR *ret, NODE* node, int poped)
+iseq_compile_each(yarv_iseq_t *iseq, LINK_ANCHOR *ret, NODE* node, int poped)
 {
   VALUE tmp; /* reserved for macro */
-  
   int type;
-  yarv_iseq_t *iseq;
-
-  GetISeqVal(self, iseq);
   
   GC_CHECK();
 
@@ -2498,7 +2488,7 @@
     else_label = NEW_LABEL(nd_line(node));
     end_label  = NEW_LABEL(nd_line(node));
 
-    compile_branch_condition(self, iseq, cond_seq, node->nd_cond, then_label, else_label);
+    compile_branch_condition(iseq, cond_seq, node->nd_cond, then_label, else_label);
     COMPILE_(then_seq, "then", node->nd_body, poped);
     COMPILE_(else_seq, "else", node->nd_else, poped);
 
@@ -2695,17 +2685,17 @@
     ADD_LABEL(ret, next_label); /* next */
 
     if(type == NODE_WHILE){
-      compile_branch_condition(self, iseq, ret,
-                               node->nd_cond, redo_label, end_label);
+      compile_branch_condition(iseq, ret, node->nd_cond,
+                               redo_label, end_label);
     }
     else if(type == NODE_UNTIL){
       /* untile */
-      compile_branch_condition(self, iseq, ret,
-                               node->nd_cond, end_label, redo_label);
+      compile_branch_condition(iseq, ret, node->nd_cond,
+                               end_label, redo_label);
     }
     else{
       ADD_INSN(ret, nd_line(node), putself);
-      ADD_CALL(ret, nd_line(node), ID2SYM(idGets), I2F(0));
+      ADD_CALL(ret, nd_line(node), ID2SYM(idGets), INT2FIX(0));
       ADD_INSNL(ret, nd_line(node), if, redo_label);
       /* opt_n */
     }
@@ -2778,7 +2768,7 @@
     
     if(iseq->compile_data->redo_label != 0){
       /* while/until */
-      add_ensure_iseq(ret, iseq, self);
+      add_ensure_iseq(ret, iseq);
       COMPILE_(ret, "break val(while/until)", node->nd_stts,
                iseq->compile_data->loopval_popped);
       ADD_INSNL(ret, nd_line(node), jump, iseq->compile_data->end_label);
@@ -2787,7 +2777,7 @@
     break_by_insn:
       /* escape from block */
       COMPILE(ret, "break val (block)", node->nd_stts);
-      ADD_INSN1(ret, nd_line(node), throw, I2F(level | 0x02) /* TAG_BREAK */);
+      ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x02) /* TAG_BREAK */);
     }
     else{
       yarv_iseq_t *ip = iseq->parent_iseq;
@@ -2807,7 +2797,7 @@
         }
         ip = ip->parent_iseq;
       }
-      COMPILE_ERROR(("can't put break"));
+      COMPILE_ERROR(("Illegal break"));
     }
     break;
   }
@@ -2815,12 +2805,12 @@
     unsigned long level = 0;
     
     if(iseq->compile_data->redo_label != 0){
-      add_ensure_iseq(ret, iseq, self);
+      add_ensure_iseq(ret, iseq);
       ADD_INSNL(ret, nd_line(node), jump, iseq->compile_data->start_label);
     }
     else if(iseq->compile_data->end_label){
       COMPILE(ret, "next val", node->nd_stts);
-      add_ensure_iseq(ret, iseq, self);
+      add_ensure_iseq(ret, iseq);
       ADD_INSNL(ret, nd_line(node), jump, iseq->compile_data->end_label);
     }
     else{
@@ -2838,18 +2828,18 @@
       }
       if(ip != 0){
         COMPILE(ret, "next val", node->nd_stts);
-        add_ensure_iseq(ret, iseq, self);
-        ADD_INSN1(ret, nd_line(node), throw, I2F(level | 0x03) /* TAG_NEXT */);
+        add_ensure_iseq(ret, iseq);
+        ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x03) /* TAG_NEXT */);
       }
       else{
-        COMPILE_ERROR(("can't next"));
+        COMPILE_ERROR(("Illegal next"));
       }
     }
     break;
   }
   case NODE_REDO:{
     if(iseq->compile_data->redo_label){
-      add_ensure_iseq(ret, iseq, self);
+      add_ensure_iseq(ret, iseq);
       ADD_INSNL(ret, nd_line(node), jump, iseq->compile_data->redo_label);
     }
     else if(iseq->compile_data->start_label){
@@ -2868,11 +2858,12 @@
         ip = ip->parent_iseq;
       }
       if(ip != 0){
-        add_ensure_iseq(ret, iseq, self);
-        ADD_INSN1(ret, nd_line(node), throw, I2F(level | 0x05) /* TAG_REDO */);
+        add_ensure_iseq(ret, iseq
+                        );
+        ADD_INSN1(ret, nd_line(node), throw, INT2FIX(level | 0x05) /* TAG_REDO */);
       }
       else{
-        COMPILE_ERROR(("can't redo"));
+        COMPILE_ERROR(("Illegal redo"));
       }
     }
     break;
@@ -2881,10 +2872,10 @@
     if(iseq->type == ISEQ_TYPE_BLOCK ||
        iseq->type == ISEQ_TYPE_RESCUE){
       ADD_INSN (ret, nd_line(node), putnil);
-      ADD_INSN1(ret, nd_line(node), throw, I2F(0x04) /* TAG_RETRY */);
+      ADD_INSN1(ret, nd_line(node), throw, INT2FIX(0x04) /* TAG_RETRY */);
     }
     else{
-      COMPILE_ERROR(("can't put retry"));
+      COMPILE_ERROR(("Illegal retry"));
     }
     break;
   }
@@ -2931,14 +2922,14 @@
       narg = resq->nd_args;
       while(narg){
         COMPILE  (ret, "rescue arg", narg->nd_head);
-        ADD_INSN2(ret, nd_line(node), getdynamic, I2F(1), I2F(0));
+        ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(1), INT2FIX(0));
         ADD_SEND (ret, nd_line(node), ID2SYM(idEqq), INT2FIX(1));
         ADD_INSNL(ret, nd_line(node), if, label_hit);
         narg = narg->nd_next;
       }
       if(resq->nd_args == 0){
         ADD_INSN1(ret, nd_line(node), putobject, rb_eStandardError);
-        ADD_INSN2(ret, nd_line(node), getdynamic, I2F(1), I2F(0));
+        ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(1), INT2FIX(0));
         ADD_SEND (ret, nd_line(node), ID2SYM(idEqq), INT2FIX(1));
         ADD_INSNL(ret, nd_line(node), if, label_hit);
       }
@@ -3025,7 +3016,7 @@
   }
     
   case NODE_MASGN:{
-    compile_massign(self, iseq, ret,
+    compile_massign(iseq, ret,
                     node->nd_value, /* rhsn  */
                     node->nd_args,  /* splat */
                     node->nd_head,  /* lhsn  */
@@ -3044,7 +3035,7 @@
     if(!poped){
       ADD_INSN(ret, nd_line(node), dup);
     }
-    ADD_INSN1(ret, nd_line(node), setlocal, I2F(idx));
+    ADD_INSN1(ret, nd_line(node), setlocal, INT2FIX(idx));
     
     break;
   }
@@ -3057,7 +3048,7 @@
     if(!poped){
       ADD_INSN(ret, nd_line(node), dup);
     }
-    idx = get_dyna_var_idx(self, node->nd_vid, &lv, &ls);
+    idx = get_dyna_var_idx(iseq, node->nd_vid, &lv, &ls);
     if(nd_type(node) == NODE_DASGN_CURR &&
        lv > 0 &&
        iseq->type != ISEQ_TYPE_RESCUE &&
@@ -3072,7 +3063,7 @@
       COMPILE_ERROR(("NODE_DASGN error"));
     }
     ADD_INSN2(ret, nd_line(node), setdynamic,
-              I2F(ls - idx), I2F(lv));
+              INT2FIX(ls - idx), INT2FIX(lv));
     break;
   }
   case NODE_GASGN:{
@@ -3137,13 +3128,13 @@
      */
     COMPILE(ret, "NODE_OP_ASGN1 recv", node->nd_recv);
 
-    compile_array(self, iseq, args, node->nd_args->nd_next, Qfalse);
+    compile_array(iseq, args, node->nd_args->nd_next, Qfalse);
     POP_ELEMENT(args); POP_ELEMENT(args);
     argc = node->nd_args->nd_alen - 2;
 
     ADD_SEQ  (ret, args);
-    ADD_INSN1(ret, nd_line(node), dupn, I2F(argc+1));
-    ADD_SEND (ret, nd_line(node), ID2SYM(idAREF), I2F(argc));
+    ADD_INSN1(ret, nd_line(node), dupn, INT2FIX(argc+1));
+    ADD_SEND (ret, nd_line(node), ID2SYM(idAREF), INT2FIX(argc));
 
     if(id == 0 || id == 1){
       /* 0: or, 1: and
@@ -3170,7 +3161,7 @@
       }
       
       COMPILE  (ret, "NODE_OP_ASGN1 args->head: ", node->nd_args->nd_head);
-      ADD_SEND (ret, nd_line(node), ID2SYM(idASET), I2F(argc+1));
+      ADD_SEND (ret, nd_line(node), ID2SYM(idASET), INT2FIX(argc+1));
       ADD_INSNL(ret, nd_line(node), jump, lfin);
       ADD_LABEL(ret, label);
       if(id == 0){ /* or */
@@ -3188,8 +3179,8 @@
     }
     else{
       COMPILE (ret, "NODE_OP_ASGN1 args->head: ", node->nd_args->nd_head);
-      ADD_SEND(ret, nd_line(node), ID2SYM(id), I2F(1));
-      ADD_SEND(ret, nd_line(node), ID2SYM(idASET), I2F(argc+1));
+      ADD_SEND(ret, nd_line(node), ID2SYM(id), INT2FIX(1));
+      ADD_SEND(ret, nd_line(node), ID2SYM(idASET), INT2FIX(argc+1));
     }
 
     if(poped){
@@ -3242,7 +3233,7 @@
 
     COMPILE  (ret, "NODE_OP_ASGN2#recv", node->nd_recv);
     ADD_INSN (ret, nd_line(node), dup);
-    ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_vid), I2F(0));
+    ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_vid), INT2FIX(0));
 
     if(atype == 0 || atype == 1){ /* 0: OR or 1: AND */
       ADD_INSN (ret, nd_line(node), dup);
@@ -3254,7 +3245,7 @@
       }
       ADD_INSN (ret, nd_line(node), pop);
       COMPILE  (ret, "NODE_OP_ASGN2 val", node->nd_value);
-      ADD_SEND (ret, nd_line(node), ID2SYM(node->nd_next->nd_aid), I2F(1));
+      ADD_SEND (ret, nd_line(node), ID2SYM(node->nd_next->nd_aid), INT2FIX(1));
       ADD_INSNL(ret, nd_line(node), jump, lfin);
       
       ADD_LABEL(ret, lcfin);
@@ -3265,8 +3256,8 @@
     }
     else{
       COMPILE (ret, "NODE_OP_ASGN2 val", node->nd_value);
-      ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_mid), I2F(1));
-      ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_aid), I2F(1));
+      ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_mid), INT2FIX(1));
+      ADD_SEND(ret, nd_line(node), ID2SYM(node->nd_next->nd_aid), INT2FIX(1));
     }
     
     if(poped){
@@ -3376,7 +3367,7 @@
     if(type != NODE_VCALL && node->nd_args){
       if(nd_type(node->nd_args) == NODE_SPLAT){
         COMPILE(args, "args(splat)", node->nd_args->nd_head);
-        argc  = I2F(1);
+        argc  = INT2FIX(1);
         flag |= VM_CALL_ARGS_SPLAT_BIT;
       }
       else if(nd_type(node->nd_args) == NODE_ARGSCAT){
@@ -3384,23 +3375,23 @@
         for(argc = 0; t; argc++, t = t->nd_next){
           /* */
         }
-        argc = I2F(argc+1);
+        argc = INT2FIX(argc+1);
         
-        compile_array(self, iseq, args, node->nd_args->nd_head, Qfalse);
+        compile_array(iseq, args, node->nd_args->nd_head, Qfalse);
         POP_ELEMENT(args);
         
-        // argc = I2F(LIST_SIZE(args) + 1);
+        // argc = INT2FIX(LIST_SIZE(args) + 1);
         COMPILE(args, "args(cat: splat)", node->nd_args->nd_body);
 
         flag |= VM_CALL_ARGS_SPLAT_BIT;
       }
       else{
-        compile_array(self, iseq, args, node->nd_args, Qfalse);
+        compile_array(iseq, args, node->nd_args, Qfalse);
         argc = OPERAND_AT(POP_ELEMENT(args), 0);
      }
     }
     else{
-      argc = I2F(0);
+      argc = INT2FIX(0);
     }
 
     ADD_SEQ(ret, recv);
@@ -3429,7 +3420,7 @@
     }
     
     ADD_SEND_R(ret, nd_line(node), ID2SYM(mid), argc,
-               block, I2F(flag));
+               block, INT2FIX(flag));
     
     if(poped){
       ADD_INSN(ret, nd_line(node), pop);
@@ -3450,11 +3441,11 @@
       if(type != NODE_VCALL && node->nd_args){
         if(nd_type(node->nd_args) == NODE_SPLAT){
           COMPILE(args, "args(splat)", node->nd_args->nd_head);
-          argc  = I2F(1);
+          argc  = INT2FIX(1);
           flag |= VM_CALL_ARGS_SPLAT_BIT;
         }
         else if(nd_type(node->nd_args) == NODE_ARGSCAT){
-          compile_array(self, iseq, args, node->nd_args->nd_head, Qfalse);
+          compile_array(iseq, args, node->nd_args->nd_head, Qfalse);
           POP_ELEMENT(args);
           
           argc = INT2FIX(LIST_SIZE(args) + 1);
@@ -3462,12 +3453,12 @@
           flag |= VM_CALL_ARGS_SPLAT_BIT;
         }
         else{
-          compile_array(self, iseq, args, node->nd_args, Qfalse);
+          compile_array(iseq, args, node->nd_args, Qfalse);
           argc = OPERAND_AT(POP_ELEMENT(args), 0);
         }
       }
       else{
-        argc = I2F(0);
+        argc = INT2FIX(0);
       }
     }
     else{
@@ -3475,12 +3466,12 @@
       int i;
       yarv_iseq_t *liseq = iseq->local_iseq;
       
-      argc = I2F(liseq->argc);
+      argc = INT2FIX(liseq->argc);
 
       /* normal arguments */
       for(i=0; i<liseq->argc; i++){
         int idx = liseq->local_size - i;
-        ADD_INSN1(args, nd_line(node), getlocal, I2F(idx));
+        ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
       }
       if(!liseq->arg_simple){
         if(liseq->arg_opts){
@@ -3488,7 +3479,7 @@
           int j;
           for(j=0; j<liseq->arg_opts-1; j++){
             int idx = liseq->local_size - (i+j);
-            ADD_INSN1(args, nd_line(node), getlocal, I2F(idx));
+            ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
           }
           i+=j;
           argc = INT2FIX(i);
@@ -3496,14 +3487,20 @@
         if(liseq->arg_rest){
           /* rest arguments */
           int idx = liseq->local_size - liseq->arg_rest + 1;
-          ADD_INSN1(args, nd_line(node), getlocal, I2F(idx));
+          ADD_INSN1(args, nd_line(node), getlocal, INT2FIX(idx));
           argc = INT2FIX(liseq->arg_rest);
           flag |= VM_CALL_ARGS_SPLAT_BIT;
         }
       }
     }
-    
-    ADD_INSN(ret, nd_line(node), putnil); /* dummy reciever */
+
+    /* dummy reciever */
+    if(nd_type(node) == NODE_ZSUPER){
+      ADD_INSN1(ret, nd_line(node), putobject, Qfalse);
+    }
+    else{
+      ADD_INSN1(ret, nd_line(node), putobject, Qtrue);
+    }
     ADD_SEQ(ret, args);
 
     /* block */
@@ -3518,7 +3515,7 @@
       }
     }
     
-    ADD_INSN3(ret, nd_line(node), super, argc, block, I2F(flag));
+    ADD_INSN3(ret, nd_line(node), super, argc, block, INT2FIX(flag));
 
     if(poped){
       ADD_INSN(ret, nd_line(node), pop);
@@ -3526,7 +3523,7 @@
     break;
   }
   case NODE_ARRAY:{
-    compile_array(self, iseq, ret, node, Qtrue);
+    compile_array(iseq, ret, node, Qtrue);
     if(poped){
       ADD_INSN(ret, nd_line(node), pop);
     }
@@ -3534,7 +3531,7 @@
   }
   case NODE_ZARRAY:{
     if(!poped){
-      ADD_INSN1(ret, nd_line(node), newarray, I2F(0));
+      ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(0));
     }
     break;
   }
@@ -3544,7 +3541,7 @@
       COMPILE(ret, "values item", n->nd_head);
       n = n->nd_next;
     }
-    ADD_INSN1(ret, nd_line(node), newarray, I2F(node->nd_alen));
+    ADD_INSN1(ret, nd_line(node), newarray, INT2FIX(node->nd_alen));
     if(poped){
       ADD_INSN(ret, nd_line(node), pop);
     }
@@ -3557,13 +3554,13 @@
     
     switch(type){
     case NODE_ARRAY:{
-      compile_array(self, iseq, list, node->nd_head, Qfalse);
+      compile_array(iseq, list, node->nd_head, Qfalse);
       size = OPERAND_AT(POP_ELEMENT(list), 0);
       ADD_SEQ  (ret, list);
       break;
     } 
     case NODE_ZARRAY:
-      size = I2F(0);
+      size = INT2FIX(0);
       break;
       
     default:
@@ -3583,7 +3580,7 @@
     while(is){
       if(is->type == ISEQ_TYPE_TOP ||
          is->type == ISEQ_TYPE_CLASS){
-        COMPILE_ERROR(("can't put return"));
+        COMPILE_ERROR(("Illegal return"));
         break;
       }
       else{
@@ -3592,13 +3589,13 @@
         }
         
         COMPILE(ret, "return nd_stts (return val)", node->nd_stts);
-        add_ensure_iseq(ret, iseq, self);
+        add_ensure_iseq(ret, iseq);
 
         if(is->type == ISEQ_TYPE_METHOD){
           ADD_INSN(ret, nd_line(node), end);
         }
         else{
-          ADD_INSN1(ret, nd_line(node), throw, I2F(0x01) /* TAG_RETURN */);
+          ADD_INSN1(ret, nd_line(node), throw, INT2FIX(0x01) /* TAG_RETURN */);
         }
         break;
       }
@@ -3613,7 +3610,7 @@
     
     if(iseq->type == ISEQ_TYPE_TOP ||
        iseq->type == ISEQ_TYPE_CLASS){
-      COMPILE_ERROR(("can't put yield"));
+      COMPILE_ERROR(("Illegal yield"));
     }
     
     if(node->nd_head){
@@ -3626,7 +3623,7 @@
           COMPILE(args, "yield with an arg", node->nd_head);
         }
         else{
-          compile_array(self, iseq, args, node->nd_head, Qfalse);
+          compile_array(iseq, args, node->nd_head, Qfalse);
           POP_ELEMENT(args);
         }
         debugs("argc: %d\n", argc);
@@ -3637,7 +3634,7 @@
             flag |= VM_CALL_ARGS_SPLAT_BIT;
           }
           
-          compile_array(self, iseq, args, node->nd_head->nd_head, Qfalse);
+          compile_array(iseq, args, node->nd_head->nd_head, Qfalse);
           POP_ELEMENT(args);
           argc = LIST_SIZE(args) + 1;
 
@@ -3661,7 +3658,7 @@
       argc = 0;
     }
     ADD_SEQ  (ret, args);
-    ADD_INSN2(ret, nd_line(node), yield, I2F(argc), I2F(flag));
+    ADD_INSN2(ret, nd_line(node), yield, INT2FIX(argc), INT2FIX(flag));
 
     if(poped){
       ADD_INSN(ret, nd_line(node), pop);
@@ -3672,7 +3669,7 @@
     if(!poped){
       int idx = iseq->local_iseq->local_size + 2 - node->nd_cnt;
       debugs("idx: %d\n", idx);
-      ADD_INSN1(ret, nd_line(node), getlocal, I2F(idx));
+      ADD_INSN1(ret, nd_line(node), getlocal, INT2FIX(idx));
     }
     break;
   }
@@ -3680,11 +3677,11 @@
     int lv, idx, ls;
     debugi("nd_vid", node->nd_vid);
     if(!poped){
-      idx = get_dyna_var_idx(self, node->nd_vid, &lv, &ls);
+      idx = get_dyna_var_idx(iseq, node->nd_vid, &lv, &ls);
       if(idx < 0){
         rb_bug("unknown dvar (%s)", rb_id2name(node->nd_vid));
       }
-      ADD_INSN2(ret, nd_line(node), getdynamic, I2F(ls - idx), I2F(lv));
+      ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(ls - idx), INT2FIX(lv));
     }
     break;
   }
@@ -3725,11 +3722,11 @@
     break;
   }
   case NODE_NTH_REF:{
-    ADD_INSN2(ret, nd_line(node), getspecial, I2F(node->nd_cnt), I2F(node->nd_nth << 1));
+    ADD_INSN2(ret, nd_line(node), getspecial, INT2FIX(node->nd_cnt), INT2FIX(node->nd_nth << 1));
     break;
   }
   case NODE_BACK_REF:{
-    ADD_INSN2(ret, nd_line(node), getspecial, I2F(node->nd_cnt), I2F(0x01 | (node->nd_nth << 1)));
+    ADD_INSN2(ret, nd_line(node), getspecial, INT2FIX(node->nd_cnt), INT2FIX(0x01 | (node->nd_nth << 1)));
     break;
   }
   case NODE_MATCH:
@@ -3740,7 +3737,7 @@
 
     if(nd_type(node) == NODE_MATCH){
       ADD_INSN1(recv, nd_line(node), putobject, node->nd_lit);
-      ADD_INSN2(val, nd_line(node), getspecial, I2F(0), I2F(0));
+      ADD_INSN2(val, nd_line(node), getspecial, INT2FIX(0), INT2FIX(0));
     }
     else{
       COMPILE(recv, "reciever", node->nd_recv);
@@ -3785,7 +3782,7 @@
     break;
   }
   case NODE_DSTR:{
-    compile_dstr(self, iseq, ret, node);
+    compile_dstr(iseq, ret, node);
     
     if(poped){
       ADD_INSN(ret, nd_line(node), pop);
@@ -3804,7 +3801,7 @@
   }
   case NODE_DXSTR:{
     ADD_INSN(ret, nd_line(node), putself);
-    compile_dstr(self, iseq, ret, node);
+    compile_dstr(iseq, ret, node);
     ADD_CALL(ret, nd_line(node), ID2SYM(idBackquote), INT2FIX(1));
 
     if(poped){
@@ -3824,8 +3821,8 @@
     break;
   }
   case NODE_DREGX:{
-    compile_dstr(self, iseq, ret, node);
-    ADD_INSN1(ret, nd_line(node), toregexp, I2F(node->nd_cflag));
+    compile_dstr(iseq, ret, node);
+    ADD_INSN1(ret, nd_line(node), toregexp, INT2FIX(node->nd_cflag));
     
     if(poped){
       ADD_INSN(ret, nd_line(node), pop);
@@ -3841,8 +3838,8 @@
     ADD_INSN2(ret, nd_line(node), onceinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
     ADD_INSN (ret, nd_line(node), pop);
     
-    compile_dstr(self, iseq, ret, node);
-    ADD_INSN1(ret, nd_line(node), toregexp, I2F(node->nd_cflag));
+    compile_dstr(iseq, ret, node);
+    ADD_INSN1(ret, nd_line(node), toregexp, INT2FIX(node->nd_cflag));
 
     ADD_INSN1(ret, nd_line(node), setinlinecache, lstart);
     ADD_LABEL(ret, lend);
@@ -4019,7 +4016,7 @@
       DECL_ANCHOR(pref);
       DECL_ANCHOR(body);
 
-      compile_colon2(self, iseq, node, pref, body);
+      compile_colon2(iseq, node, pref, body);
       if(LIST_SIZE_ZERO(pref)){
         ADD_LABEL(ret, lstart);
         ADD_INSN2(ret, nd_line(node), getinlinecache, NEW_INLINE_CACHE_ENTRY(), lend);
@@ -4087,7 +4084,7 @@
     LABEL * lfin   = NEW_LABEL(nd_line(node));
     LABEL * ltrue  = NEW_LABEL(nd_line(node));
     
-    ADD_INSN2(ret, nd_line(node), getspecial, I2F(node->nd_cnt), I2F(0));
+    ADD_INSN2(ret, nd_line(node), getspecial, INT2FIX(node->nd_cnt), INT2FIX(0));
     ADD_INSNL(ret, nd_line(node), if, lend);
 
     /* *flip == 0 */
@@ -4096,11 +4093,11 @@
     ADD_INSNL(ret, nd_line(node), unless, lfin);
     if(nd_type(node) == NODE_FLIP3){
       ADD_INSN (ret, nd_line(node), dup);
-      ADD_INSN2(ret, nd_line(node), setspecial, I2F(node->nd_cnt), I2F(0));
+      ADD_INSN2(ret, nd_line(node), setspecial, INT2FIX(node->nd_cnt), INT2FIX(0));
       ADD_INSNL(ret, nd_line(node), jump, lfin);
     }
     else{
-      ADD_INSN2(ret, nd_line(node), setspecial, I2F(node->nd_cnt), I2F(0));
+      ADD_INSN2(ret, nd_line(node), setspecial, INT2FIX(node->nd_cnt), INT2FIX(0));
     }
 
     /* *flip == 1 */
@@ -4108,7 +4105,7 @@
     COMPILE  (ret, "flip2 end", node->nd_end);
     ADD_INSNL(ret, nd_line(node), unless, ltrue);
     ADD_INSN1(ret, nd_line(node), putobject, Qfalse);
-    ADD_INSN2(ret, nd_line(node), setspecial, I2F(node->nd_cnt), I2F(0));
+    ADD_INSN2(ret, nd_line(node), setspecial, INT2FIX(node->nd_cnt), INT2FIX(0));
     
     ADD_LABEL(ret, ltrue);
     ADD_INSN1(ret, nd_line(node), putobject, Qtrue);
@@ -4150,7 +4147,7 @@
   case NODE_ERRINFO:{
     if(!poped){
       if(iseq->type == ISEQ_TYPE_RESCUE){
-        ADD_INSN2(ret, nd_line(node), getdynamic, I2F(1), I2F(0));
+        ADD_INSN2(ret, nd_line(node), getdynamic, INT2FIX(1), INT2FIX(0));
       }
       else{
         ADD_INSN(ret, nd_line(node), putnil);
@@ -4161,7 +4158,7 @@
   case NODE_DEFINED:{
     if(!poped){
       LABEL * lfinish = NEW_LABEL(nd_line(node));
-      defined_expr(self, iseq, ret, node->nd_head, lfinish, Qtrue);
+      defined_expr(iseq, ret, node->nd_head, lfinish, Qtrue);
       ADD_LABEL(ret, lfinish);
     }
     break;
@@ -4196,9 +4193,9 @@
     break;
   }
   case NODE_DSYM:{
-    compile_dstr(self, iseq, ret, node);
+    compile_dstr(iseq, ret, node);
     if(!poped){
-      ADD_SEND(ret, nd_line(node), ID2SYM(idIntern), I2F(0));
+      ADD_SEND(ret, nd_line(node), ID2SYM(idIntern), INT2FIX(0));
     }
     else{
       ADD_INSN(ret, nd_line(node), pop);
@@ -4211,11 +4208,11 @@
     VALUE argc;
 
     if(node->nd_args){
-      compile_array(self, iseq, args, node->nd_args, Qfalse);
+      compile_array(iseq, args, node->nd_args, Qfalse);
       argc = OPERAND_AT(POP_ELEMENT(args), 0);
     }
     else{
-      argc = I2F(0); /* massign */
+      argc = INT2FIX(0); /* massign */
     }
     
     if(node->nd_recv == (NODE *)1){
@@ -4261,82 +4258,11 @@
   return COMPILE_OK;
 }
 
-
 /***************************/
 /* instruction information */
 /***************************/
 
-#define TS_LONG      "L"
-#define TS_OFFSET    "L"
-#define TS_ULONG     "U"
-#define TS_VALUE     "V"
-#define TS_ID        "I"
-#define TS_GENTRY    "G"
-#define TS_IC        "M"
-#define TS_CDHASH    "H"
-#define TS_VARIABLE  "."
-#define TS_BLOCKISEQ "B"
-
-#include "insns_info.inc"
-
-/* some utility */
-
-#if CPDEBUG > 5
-
-#define INSN_CHECK(insn)                                         \
-  if(insn < 0 ||                                                 \
-     insn > sizeof(insn_name_info) / sizeof(insn_name_info[0])){ \
-    int *a = 0; *a = 0; \
-    rb_bug("(in)unknown instruction: %d", insn);                 \
-  }                                                              \
-
-#else
-
-#define INSN_CHECK(insn) /* */
-
-#endif
-
-char *
-insn_name(int insn)
-{
-  INSN_CHECK(insn);
-  return insn_name_info[insn];
-}
-
-int
-insn_len(int insn)
-{
-  INSN_CHECK(insn);
-  return insn_len_info[insn];
-}
-
-char *
-insn_op_types(int insn)
-{
-  INSN_CHECK(insn);
-  return insn_operand_info[insn];
-}
-
-int
-insn_op_type(int insn, int pos)
-{
-  int len = insn_len(insn) - 1;
-  if(pos < len){
-    return insn_operand_info[insn][pos];
-  }
-  else{
-    return TS_LONG[0];
-  }
-}
-
 static int
-insn_ret_num(int insn)
-{
-  INSN_CHECK(insn);
-  return insn_stack_push_num_info[insn];
-}
-
-static int
 insn_data_length(INSN *insnobj)
 {
   return insn_len(insnobj->insn_id);
@@ -4354,7 +4280,7 @@
   return insn_len(insnobj->line_no);
 }
 
-VALUE
+static VALUE
 insn_data_to_s_detail(INSN *insnobj)
 {
   VALUE str = rb_str_new(0,0);
@@ -4370,7 +4296,7 @@
       char type = types[j];
 
       switch(type){
-      case 'L':          /* label(destination position) */
+      case TS_OFFSET:          /* label(destination position) */
         {
           char  buff[0x100];
           LABEL *lobj = (LABEL *)OPERAND_AT(insnobj, j);
@@ -4379,24 +4305,24 @@
           break;
         }
         break;
-      case 'B':          /* block */
-      case 'U':          /* ulong */
-      case 'V':          /* VALUE */
+      case TS_BLOCKISEQ:    /* block */
+      case TS_NUM:          /* ulong */
+      case TS_VALUE:        /* VALUE */
         rb_str_concat(str, rb_inspect(OPERAND_AT(insnobj, j)));
         break;
-      case 'I':          /* ID */
+      case TS_ID:          /* ID */
         rb_str_concat(str, rb_inspect(OPERAND_AT(insnobj, j)));
         break;
-      case 'G':
+      case TS_GENTRY:
         {
           struct global_entry *entry = (struct global_entry*)
             (OPERAND_AT(insnobj, j) & (~1));
           rb_str_cat2(str, rb_id2name(entry->id));
         }
-      case 'M': /* method cache */
+      case TS_IC:         /* method cache */
         rb_str_cat2(str, "<ic>");
         break;
-      case 'H': /* case/when condition cache */
+      case TS_CDHASH:     /* case/when condition cache */
         rb_str_cat2(str, "<ch>");
         break;
       default:{
@@ -4411,23 +4337,12 @@
   return str;
 }
 
-VALUE
-insns_name_array()
-{
-  VALUE ary = rb_ary_new();
-  int i;
-  for(i=0; i< sizeof(insn_name_info) / sizeof(insn_name_info[0]); i++){
-    rb_ary_push(ary, rb_str_new2(insn_name_info[i]));
-  }
-  return ary;
-}
-
-void
+static void
 dump_disasm_anchor(LINK_ANCHOR *anc){
   dump_disasm_list(FIRST_ELEMENT(anc));
 }
 
-void
+static void
 dump_disasm_list(struct iseq_link_element *link)
 {
   int pos = 0;
@@ -4470,3 +4385,15 @@
 {
   return nd_line(n);
 }
+
+VALUE
+insns_name_array()
+{
+  VALUE ary = rb_ary_new();
+  int i;
+  for(i=0; i< sizeof(insn_name_info) / sizeof(insn_name_info[0]); i++){
+    rb_ary_push(ary, rb_str_new2(insn_name_info[i]));
+  }
+  return ary;
+}
+

Modified: trunk/compile.h
===================================================================
--- trunk/compile.h	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/compile.h	2005-12-28 01:55:06 UTC (rev 333)
@@ -133,10 +133,10 @@
 
 /* Specific Insn factory */
 #define ADD_SEND(seq, line, id, argc) \
-  ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)I2F(0))
+  ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(0))
 
 #define ADD_CALL(seq, line, id, argc) \
-  ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)I2F(VM_CALL_FCALL_BIT))
+  ADD_SEND_R(seq, line, id, argc, (VALUE)Qfalse, (VALUE)INT2FIX(VM_CALL_FCALL_BIT))
 
 #define ADD_SEND_R(seq, line, id, argc, block, flag) \
   ADD_ELEM(seq, (LINK_ELEMENT *) \
@@ -159,25 +159,23 @@
 /* compile node */
 #define COMPILE(anchor, desc, node) \
   (debug_compile("== " desc "\n", \
-                 iseq_compile_each(self, anchor, node, 0)))
+                 iseq_compile_each(iseq, anchor, node, 0)))
 
 /* compile node, this node's value will be poped */
 #define COMPILE_POPED(anchor, desc, node)    \
   (debug_compile("== " desc "\n", \
-                 iseq_compile_each(self, anchor, node, 1)))
+                 iseq_compile_each(iseq, anchor, node, 1)))
 
 /* compile node, which is poped when 'poped' is true */
 #define COMPILE_(anchor, desc, node, poped)  \
   (debug_compile("== " desc "\n", \
-                 iseq_compile_each(self, anchor, node, poped)))
+                 iseq_compile_each(iseq, anchor, node, poped)))
 
 #define OPERAND_AT(insn, idx) \
   (((INSN*)(insn))->operands[idx])
 
 #define INSN_OF(insn) \
   (((INSN*)(insn))->insn_id)
-     
-#define I2F(x) INT2FIX(x)
 
 /* error */
 #define COMPILE_ERROR(strs)                        \

Modified: trunk/disasm.c
===================================================================
--- trunk/disasm.c	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/disasm.c	2005-12-28 01:55:06 UTC (rev 333)
@@ -9,11 +9,15 @@
 #include <node.h>
 
 #include "yarvcore.h"
+#include "insns.inc"
+#include "insns_info.inc"
 
 /*
   now, search algorithm is brute force. but this should be binary search.
  */
-unsigned short find_line_no(yarv_iseq_t *iseqdat, unsigned long pos){
+static unsigned short
+find_line_no(yarv_iseq_t *iseqdat, unsigned long pos)
+{
   unsigned long i, size = iseqdat->insn_info_size;
   struct insn_info_struct *iiary = iseqdat->insn_info_tbl;
 
@@ -26,7 +30,9 @@
   return 0;
 }
 
-unsigned short find_prev_line_no(yarv_iseq_t *iseqdat, unsigned long pos){
+static unsigned short
+find_prev_line_no(yarv_iseq_t *iseqdat, unsigned long pos)
+{
   unsigned long i, size = iseqdat->insn_info_size;
   struct insn_info_struct *iiary = iseqdat->insn_info_tbl;
   
@@ -44,37 +50,60 @@
   return 0;
 }
 
-VALUE insn_operand_intern(int insn, int op_no, VALUE op,
-                          int len, int pos, VALUE child){
+static VALUE
+insn_operand_intern(yarv_iseq_t *iseq,
+                    int insn, int op_no, VALUE op,
+                    int len, int pos, VALUE *pnop,
+                    VALUE child)
+{
   char *types = insn_op_types(insn);
   char type   = types[op_no];
   VALUE ret;
   char buff[0x100];
 
   switch(type){
-  case 'L': /* LONG */
+  case TS_OFFSET: /* LONG */
     snprintf(buff, sizeof(buff), "%ld", pos + len + op);
     ret = rb_str_new2(buff);
     break;
 
-  case 'U': /* ULONG */
+  case TS_NUM:   /* ULONG */
     snprintf(buff, sizeof(buff), "%lu", op);
     ret = rb_str_new2(buff);
     break;
-
-  case 'I': /* ID (symbol) */
+  case TS_LINDEX:{
+    yarv_iseq_t *ip = iseq->local_iseq;
+    op = ID2SYM(ip->local_tbl[ip->local_size - op + 1]);
+    goto inspect_value;
+  }
+  case TS_DINDEX:{
+    if(insn == BIN(getdynamic) ||
+       insn == BIN(setdynamic)){
+      yarv_iseq_t *ip = iseq;
+      int level = *pnop;
+      int i;
+      for(i=0; i<level; i++){
+        ip = ip->parent_iseq;
+      }
+      op = ID2SYM(ip->local_tbl[ip->local_size - op]);
+    }
+    else{
+      op = INT2FIX(op);
+    }
+    goto inspect_value;
+  }
+  case TS_ID:    /* ID (symbol) */
     op = ID2SYM(op);
-    /* fall through */
-    
-  case 'V': /* VALUE */
+    goto inspect_value;
+  case TS_VALUE: /* VALUE */
+  inspect_value:
     ret = rb_inspect(op);
-    
     if(child && CLASS_OF(op) == cYarvISeq){
       rb_ary_push(child, op);
     }
     break;
 
-  case 'B': /* block */
+  case TS_BLOCKISEQ: /* block */
     {
       yarv_iseq_t *block = (yarv_iseq_t *)op;
       if(block){
@@ -88,18 +117,18 @@
       }
       break;
     }
-  case 'G':
+  case TS_GENTRY:
     {
       struct global_entry *entry = (struct global_entry*)op;
       ret = rb_str_new2(rb_id2name(entry->id));
     }
     break;
 
-  case 'M':
+  case TS_IC:
     ret = rb_str_new2("<ic>");
     break;
     
-  case 'H':
+  case TS_CDHASH:
     ret = rb_str_new2("<cdhash>");
     break;
 
@@ -109,13 +138,14 @@
   return ret;
 }
 
-
 /**
  * Disassemble a instruction
  * Iseq -> Iseq inspect object
  */
-VALUE iseq_disasm_insn(VALUE ret, VALUE *iseq, int pos,
-                       yarv_iseq_t *iseqdat, VALUE child){
+VALUE
+iseq_disasm_insn(VALUE ret, VALUE *iseq, int pos,
+                 yarv_iseq_t *iseqdat, VALUE child)
+{
   int insn = iseq[pos];
   int len  = insn_len(insn);
   int i, j;
@@ -139,8 +169,8 @@
   
   for(j=0;types[j]; j++){
     char *types = insn_op_types(insn);
-    VALUE opstr = insn_operand_intern(insn, j, iseq[pos+j+1],
-                                      len, pos, child);
+    VALUE opstr = insn_operand_intern(iseqdat, insn, j, iseq[pos+j+1],
+                                      len, pos, &iseq[pos+j+2], child);
     rb_str_concat(str, opstr);
     
     GC_CHECK();
@@ -168,7 +198,8 @@
 }
 
 static char *
-catch_type(int type){
+catch_type(int type)
+{
   switch(type){
   case CATCH_TYPE_RESCUE: return "rescue";
   case CATCH_TYPE_ENSURE: return "ensure";
@@ -187,7 +218,9 @@
  *
  * return disassembled string
  */
-VALUE iseq_disasm(VALUE self){
+VALUE
+iseq_disasm(VALUE self)
+{
   yarv_iseq_t *iseqdat;
   VALUE *iseq;
   VALUE str = rb_str_new(0, 0);
@@ -291,7 +324,9 @@
   return str;
 }
 
-char* node_name(int node){
+char*
+node_name(int node)
+{
   switch(node){
   case NODE_METHOD     : return "NODE_METHOD";
   case NODE_FBODY      : return "NODE_FBODY";

Modified: trunk/eval.c
===================================================================
--- trunk/eval.c	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/eval.c	2005-12-28 01:55:06 UTC (rev 333)
@@ -171,26 +171,24 @@
 int ruby_in_eval;
 
 void
-ruby_options(argc, argv)
-    int argc;
-    char **argv;
+ruby_options(int argc, char **argv)
 {
-    int state;
+  int state;
 
-    Init_stack((void*)&state);
-    PUSH_THREAD_TAG();
-    if ((state = EXEC_TAG()) == 0) {
-	ruby_process_options(argc, argv);
+  Init_stack((void*)&state);
+  PUSH_THREAD_TAG();
+  if ((state = EXEC_TAG()) == 0) {
+    ruby_process_options(argc, argv);
+  }
+  else {
+    if (state == TAG_THREAD) {
+      rb_thread_start_1();
     }
-    else {
-	if (state == TAG_THREAD) {
-	    rb_thread_start_1();
-	}
-	trace_func = 0;
-	tracing = 0;
-	exit(error_handle(state));
-    }
-    POP_THREAD_TAG();
+    trace_func = 0;
+    tracing = 0;
+    exit(error_handle(state));
+  }
+  POP_THREAD_TAG();
 }
 
 void rb_exec_end_proc _((void));
@@ -217,44 +215,53 @@
 }
 
 void
-ruby_finalize()
+ruby_finalize(void)
 {
     ruby_finalize_0();
     ruby_finalize_1();
 }
 
 int
-ruby_cleanup(ex)
-    int ex;
+ruby_cleanup(int ex)
 {
-    int state;
-    volatile VALUE err = GET_THREAD()->errinfo;
+  int state;
+  volatile VALUE err = GET_THREAD()->errinfo;
+  VALUE st = 0;
+  yarv_vm_t *vm = GET_VM();
 
-    ruby_safe_level = 0;
-    Init_stack((void*)&state);
-    PUSH_THREAD_TAG();
-    if ((state = EXEC_TAG()) == 0) {
-	ruby_finalize_0();
-	if (GET_THREAD()->errinfo) err = GET_THREAD()->errinfo;
-	rb_thread_cleanup();
-	rb_thread_wait_other_threads();
+  if (RTEST(err) && rb_obj_is_kind_of(err, rb_eSystemExit)) {
+    vm->exit_code = NUM2INT(rb_iv_get(err, "status"));
+  }
+  else{
+    vm->exit_code = 0;
+  }
+  
+  ruby_safe_level = 0;
+  Init_stack((void*)&state);
+  PUSH_THREAD_TAG();
+  if ((state = EXEC_TAG()) == 0) {
+    if (GET_THREAD()->errinfo) {
+      err = GET_THREAD()->errinfo;
     }
-    else if (state == TAG_THREAD) {
-	rb_thread_start_1();
-    }
-    else if (ex == 0) {
-	ex = state;
-    }
-    GET_THREAD()->errinfo = err;
-    ex = error_handle(ex);
-    ruby_finalize_1();
-    POP_THREAD_TAG();
+    ruby_finalize_0();
+    rb_thread_cleanup();
+    rb_thread_wait_other_threads();
+  }
+  else if (state == TAG_THREAD) {
+    rb_thread_start_1();
+  }
+  else if (ex == 0) {
+    ex = state;
+  }
+  GET_THREAD()->errinfo = err;
+  ex = error_handle(ex);
+  ruby_finalize_1();
+  POP_THREAD_TAG();
 
-    if (err && rb_obj_is_kind_of(err, rb_eSystemExit)) {
-	VALUE st = rb_iv_get(err, "status");
-	return NUM2INT(st);
-    }
-    return ex;
+  if(vm->exit_code){
+    return vm->exit_code;
+  }
+  return ex;
 }
 
 extern NODE *ruby_eval_tree;
@@ -2002,7 +2009,7 @@
   /* replace environment */
   cfp->self = self;
   if(cbase){
-    rb_ary_push(th->klass_nest_stack, cbase);
+    rb_thread_push_cref(th, cbase, NOEX_PUBLIC);
     if(!CMETHOD_INFO_P(cfp->iseq) &&
        cfp->iseq->klass_nest_stack){
       rb_ary_push(cfp->iseq->klass_nest_stack, cbase);
@@ -2018,7 +2025,7 @@
   /* restore environment */
   cfp->self = stored_self;
   if(cbase){
-    rb_ary_pop(th->klass_nest_stack);
+    rb_thread_pop_cref(th);
     if(!CMETHOD_INFO_P(cfp->iseq) &&
        cfp->iseq->klass_nest_stack){
       rb_ary_pop(cfp->iseq->klass_nest_stack);

Modified: trunk/eval_error.h
===================================================================
--- trunk/eval_error.h	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/eval_error.h	2005-12-28 01:55:06 UTC (rev 333)
@@ -191,64 +191,62 @@
 VALUE sysstack_error;
 
 static int
-sysexit_status(err)
-    VALUE err;
+sysexit_status(VALUE err)
 {
-    VALUE st = rb_iv_get(err, "status");
-    return NUM2INT(st);
+  VALUE st = rb_iv_get(err, "status");
+  return NUM2INT(st);
 }
 
 static int
-error_handle(ex)
-    int ex;
+error_handle(int ex)
 {
-    int status = EXIT_FAILURE;
+  int status = EXIT_FAILURE;
 
-    if (thread_set_raised()) return EXIT_FAILURE;
-    switch (ex & TAG_MASK) {
-      case 0:
-	status = EXIT_SUCCESS;
-	break;
+  if (thread_set_raised()) return EXIT_FAILURE;
+  switch (ex & TAG_MASK) {
+  case 0:
+    status = EXIT_SUCCESS;
+    break;
 
-      case TAG_RETURN:
-	error_pos();
-	warn_print(": unexpected return\n");
-	break;
-      case TAG_NEXT:
-	error_pos();
-	warn_print(": unexpected next\n");
-	break;
-      case TAG_BREAK:
-	error_pos();
-	warn_print(": unexpected break\n");
-	break;
-      case TAG_REDO:
-	error_pos();
-	warn_print(": unexpected redo\n");
-	break;
-      case TAG_RETRY:
-	error_pos();
-	warn_print(": retry outside of rescue clause\n");
-	break;
-      case TAG_THROW:
-        // TODO: fix me
-	    error_pos();
-	    warn_printf(": unexpected throw\n");
-	break;
-      case TAG_RAISE:
-      case TAG_FATAL:
-	if (rb_obj_is_kind_of(GET_THREAD()->errinfo, rb_eSystemExit)) {
-	    status = sysexit_status(GET_THREAD()->errinfo);
-	}
-	else {
-	    error_print();
-	}
-	break;
-      default:
-	rb_bug("Unknown longjmp status %d", ex);
-	break;
+  case TAG_RETURN:
+    error_pos();
+    warn_print(": unexpected return\n");
+    break;
+  case TAG_NEXT:
+    error_pos();
+    warn_print(": unexpected next\n");
+    break;
+  case TAG_BREAK:
+    error_pos();
+    warn_print(": unexpected break\n");
+    break;
+  case TAG_REDO:
+    error_pos();
+    warn_print(": unexpected redo\n");
+    break;
+  case TAG_RETRY:
+    error_pos();
+    warn_print(": retry outside of rescue clause\n");
+    break;
+  case TAG_THROW:
+    // TODO: fix me
+    error_pos();
+    warn_printf(": unexpected throw\n");
+    break;
+  case TAG_RAISE:
+  case TAG_FATAL:
+    if (rb_obj_is_kind_of(GET_THREAD()->errinfo, rb_eSystemExit)) {
+      status = sysexit_status(GET_THREAD()->errinfo);
     }
-    thread_reset_raised();
-    return status;
+    else {
+      error_print();
+    }
+    break;
+  default:
+    rb_bug("Unknown longjmp status %d", ex);
+    break;
+  }
+  thread_reset_raised();
+  return status;
 }
 

Modified: trunk/eval_jump.h
===================================================================
--- trunk/eval_jump.h	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/eval_jump.h	2005-12-28 01:55:06 UTC (rev 333)
@@ -138,16 +138,16 @@
 NORETURN(static VALUE terminate_process _((int, const char *, long)));
 
 static VALUE
-terminate_process(status, mesg, mlen)
-    int status;
-    const char *mesg;
-    long mlen;
+terminate_process(int status, const char *mesg, long mlen)
 {
-    VALUE args[2];
-    args[0] = INT2NUM(status);
-    args[1] = rb_str_new(mesg, mlen);
-
-    rb_exc_raise(rb_class_new_instance(2, args, rb_eSystemExit));
+  VALUE args[2];
+  yarv_vm_t *vm = GET_VM();
+  
+  args[0] = INT2NUM(status);
+  args[1] = rb_str_new(mesg, mlen);
+  
+  vm->exit_code = status;
+  rb_exc_raise(rb_class_new_instance(2, args, rb_eSystemExit));
 }
 
 

Modified: trunk/eval_method.h
===================================================================
--- trunk/eval_method.h	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/eval_method.h	2005-12-28 01:55:06 UTC (rev 333)
@@ -21,6 +21,8 @@
 {
   struct cache_entry *ent, *end;
 
+  rb_vm_change_state();
+
   if (!ruby_running) return;
   ent = cache; end = ent + CACHE_SIZE;
   while (ent < end) {
@@ -34,6 +36,8 @@
 {
   struct cache_entry *ent, *end;
 
+  rb_vm_change_state();
+
   if (!ruby_running) return;
   ent = cache; end = ent + CACHE_SIZE;
   while (ent < end) {
@@ -49,6 +53,8 @@
 {
   struct cache_entry *ent, *end;
 
+  rb_vm_change_state();
+
   if (!ruby_running) return;
   ent = cache; end = ent + CACHE_SIZE;
   while (ent < end) {
@@ -64,6 +70,8 @@
 {
   struct cache_entry *ent, *end;
 
+  rb_vm_change_state();
+
   if (!ruby_running) return;
   ent = cache; end = ent + CACHE_SIZE;
   while (ent < end) {
@@ -258,11 +266,9 @@
 }
 
 void
-rb_remove_method(klass, name)
-    VALUE klass;
-    const char *name;
+rb_remove_method(VALUE klass, const char *name)
 {
-    remove_method(klass, rb_intern(name));
+  remove_method(klass, rb_intern(name));
 }
 
 /*

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/insns.def	2005-12-28 01:55:06 UTC (rev 333)
@@ -50,7 +50,7 @@
  */
 DEFINE_INSN
 getlocal
-(ulong idx)
+(lindex_t idx)
 ()
 (VALUE val)
 {
@@ -64,7 +64,7 @@
  */
 DEFINE_INSN
 setlocal
-(ulong idx)
+(lindex_t idx)
 (VALUE val)
 ()
 {
@@ -78,7 +78,7 @@
  */
 DEFINE_INSN
 getspecial
-(ulong idx, ulong type)
+(num_t idx, num_t type)
 ()
 (VALUE val)
 {
@@ -137,7 +137,7 @@
  */
 DEFINE_INSN
 setspecial
-(ulong idx, ulong type)
+(num_t idx, num_t type)
 (VALUE obj)
 ()
 {
@@ -169,7 +169,7 @@
  */
 DEFINE_INSN
 getdynamic
-(ulong idx, ulong level)
+(dindex_t idx, num_t level)
 ()
 (VALUE val)
 {
@@ -190,7 +190,7 @@
  */
 DEFINE_INSN
 setdynamic
-(ulong idx, ulong level)
+(dindex_t idx, num_t level)
 (VALUE val)
 ()
 {
@@ -426,7 +426,7 @@
  */
 DEFINE_INSN
 concatstrings
-(ulong num)
+(num_t num)
 (...)
 (VALUE val) // inc += 1 - num;
 {
@@ -462,7 +462,7 @@
  */
 DEFINE_INSN
 toregexp
-(ulong flag)
+(num_t flag)
 (VALUE str)
 (VALUE val)
 {
@@ -476,7 +476,7 @@
  */
 DEFINE_INSN
 newarray
-(ulong num)
+(num_t num)
 (...)
 (VALUE val) // inc += 1 - num;
 {
@@ -509,7 +509,7 @@
  */
 DEFINE_INSN
 expandarray
-(ulong num, ulong flag)
+(num_t num, num_t flag)
 (..., VALUE ary)
 (...) // inc += (num > 0) ? num - 1 + (flag ? 1 : 0) : num + 1 - (flag ? 1 : 0);
 {
@@ -670,7 +670,7 @@
  */
 DEFINE_INSN
 newhash
-(ulong num)
+(num_t num)
 (...)
 (VALUE val) // inc += 1 - num;
 {
@@ -693,7 +693,7 @@
  */
 DEFINE_INSN
 newrange
-(ulong flag)
+(num_t flag)
 (VALUE low, VALUE high)
 (VALUE val)
 {
@@ -759,7 +759,7 @@
  */
 DEFINE_INSN
 dupn
-(ulong n)
+(num_t n)
 (...)
 (...) // inc += n;
 {
@@ -809,7 +809,7 @@
  */
 DEFINE_INSN
 topn
-(ulong n)
+(num_t n)
 (...)
 (VALUE val) // inc += 1;
 {
@@ -855,7 +855,6 @@
   /* dup */
   GetISeqVal(body, miseq);
   rb_ary_replace(miseq->klass_nest_stack, th->klass_nest_stack);
-  
   miseq->klass = rb_ary_entry(th->klass_nest_stack, -1);
 
   /* make new node */
@@ -987,7 +986,7 @@
  */
 DEFINE_INSN
 defined
-(ulong type, VALUE obj, VALUE needstr)
+(num_t type, VALUE obj, VALUE needstr)
 (VALUE v)
 (VALUE val)
 {
@@ -1073,7 +1072,7 @@
  */
 DEFINE_INSN
 trace
-(ulong flag, VALUE args)
+(num_t flag, VALUE args)
 ()
 ()
 {
@@ -1144,7 +1143,7 @@
              klass_iseq->local_size, 0, 0);
   RESTORE_REGS();
   /* others */
-  eval_push_cref(th, klass, NOEX_PUBLIC);
+  rb_thread_push_cref(th, klass, NOEX_PUBLIC);
   
   INC_VM_STATE_VERSION();
   NEXT_INSN();
@@ -1176,7 +1175,7 @@
              klass_iseq->local_size, 0, 0);
   RESTORE_REGS();
   /* others */
-  eval_push_cref(th, klass, NOEX_PUBLIC);
+  rb_thread_push_cref(th, klass, NOEX_PUBLIC);
 
   INC_VM_STATE_VERSION();
   NEXT_INSN();
@@ -1225,7 +1224,7 @@
   RESTORE_REGS();
   
   /* others */
-  eval_push_cref(th, module, NOEX_PUBLIC);
+  rb_thread_push_cref(th, module, NOEX_PUBLIC);
   
   INC_VM_STATE_VERSION();
   NEXT_INSN();
@@ -1242,7 +1241,7 @@
 ()
 ()
 {
-  eval_pop_cref(th);
+  rb_thread_pop_cref(th);
 }
 
 
@@ -1261,7 +1260,7 @@
  */
 DEFINE_INSN
 send
-(ID id, ulong op_argc, BLOCKISEQ blockiseq, ulong flag, IC ic)
+(ID id, num_t op_argc, BLOCKISEQ blockiseq, num_t flag, IC ic)
 (...)
 (VALUE val) // inc += - op_argc;
 {
@@ -1269,7 +1268,7 @@
   VALUE recv;
   VALUE klass;
   yarv_block_t *blockptr = 0;
-  ulong num = op_argc;
+  num_t num = op_argc;
 
   macro_eval_setup_send_arguments(num, blockptr, flag, blockiseq);
   recv  = TOPN(num);
@@ -1313,11 +1312,32 @@
       
       if(ip->klass == 0){
         ip = iseq;
+        /* super in define_method */
         while(!ip->defined_method_id){
           ip = ip->parent_iseq;
         }
         id    = ip->defined_method_id;
         klass = eval_search_super_klass(ip->klass, recv);
+        if(TOPN(num) == Qfalse){
+          yarv_control_frame_t *lcfp = GET_CFP();
+          int i;
+
+          while(lcfp->iseq != ip){
+            VALUE *tdfp = GET_PREV_DFP(lcfp->dfp);
+            while(1){
+              lcfp = YARV_PREVIOUS_CONTROL_FRAME(lcfp);
+              if(lcfp->dfp == tdfp){
+                break;
+              }
+            }
+          }
+
+          POPN(num);
+          num = ip->argc;
+          for(i=0; i< ip->argc; i++){
+            PUSH(lcfp->dfp[i - ip->local_size]);
+          }
+        }
       }
       else{
         id    = rb_to_id(ip->name);
@@ -1340,7 +1360,7 @@
  */
 DEFINE_INSN
 super
-(ulong op_argc, BLOCKISEQ blockiseq, ulong flag)
+(num_t op_argc, BLOCKISEQ blockiseq, num_t flag)
 (...)
 (VALUE val) // inc += - op_argc;
 {
@@ -1366,7 +1386,7 @@
  */
 DEFINE_INSN
 yield
-(ulong num, ulong flag)
+(num_t num, num_t flag)
 (...)
 (VALUE val)  // inc += 1 - num;
 {
@@ -1525,13 +1545,13 @@
  */
 DEFINE_INSN
 throw
-(ulong throw_state)
+(num_t throw_state)
 (VALUE throwobj)
 ()
 {
-  ulong state = throw_state & 0xff;
-  ulong flag  = throw_state & 0x8000;
-  ulong level = throw_state >> 16;
+  num_t state = throw_state & 0xff;
+  num_t flag  = throw_state & 0x8000;
+  num_t level = throw_state >> 16;
 
   if(state != 0){
     VALUE *pt;

Modified: trunk/rb/allload.rb
===================================================================
--- trunk/rb/allload.rb	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/rb/allload.rb	2005-12-28 01:55:06 UTC (rev 333)
@@ -1,5 +1,7 @@
 ignores = %w(/dl/import.rb)
 
+# $DEBUG = true
+
 module Enumerable
   def all?
     self.each{|e|
@@ -12,12 +14,13 @@
 ARGV.each{|dir|
   dir = File.expand_path(dir)
   Dir.glob(File.join(dir, '**/*.rb')){|file|
-    p file
+    p file if $DEBUG
     if ignores.all?{|e|
       r = Regexp.compile(Regexp.escape(e))
       r !~ file
     }
-      YARVCore::parse(File.read(file), file, 1)
+    parsed = YARVCore::parse(File.read(file), file, 1)
+    puts parsed.disasm if $DEBUG
     else
       puts "ignore: #{file}"
     end

Modified: trunk/rb/insns2vm.rb
===================================================================
--- trunk/rb/insns2vm.rb	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/rb/insns2vm.rb	2005-12-28 01:55:06 UTC (rev 333)
@@ -72,12 +72,12 @@
         ret = "int inc = 0;\n"
 
         @opes.each_with_index{|(t, v), i|
-          if t == 'ulong'
+          if t == 'num_t'
             ret << "        unsigned long #{v} = FIX2INT(opes[#{i}]);\n"
           end
         }
         @defopes.each_with_index{|((t, var), val), i|
-          if t == 'ulong' && val != '*'
+          if t == 'num_t' && val != '*'
             ret << "        unsigned long #{var} = #{val};\n"
           end
         }
@@ -801,8 +801,12 @@
     case op
     when /^OFFSET/
       "TS_OFFSET"
-    when /^ulong/
-      "TS_ULONG"
+    when /^num_t/
+      "TS_NUM"
+    when /^lindex_t/
+      "TS_LINDEX"
+    when /^dindex_t/
+      "TS_DINDEX"
     when /^VALUE/
       "TS_VALUE"
     when /^ID/
@@ -822,8 +826,27 @@
     end
   end
   
+  TYPE_CHARS = {
+    'TS_OFFSET'    => 'O',
+    'TS_NUM'       => 'N',
+    'TS_LINDEX'    => 'L',
+    'TS_DINDEX'    => 'D',
+    'TS_VALUE'     => 'V',
+    'TS_ID'        => 'I',
+    'TS_GENTRY'    => 'G',
+    'TS_IC'        => 'C',
+    'TS_CDHASH'    => 'H',
+    'TS_BLOCKISEQ' => 'B',
+    'TS_VARIABLE'  =>  '.',
+  }
+  
   # insns_info.inc
   def insns_info_inc
+    # insn_type_chars
+    insn_type_chars = TYPE_CHARS.map{|t, c|
+      "#define #{t} '#{c}'"
+    }.join("\n")
+    
     # insn_names
     insn_names = ''
     @insns.each{|insn|
@@ -836,14 +859,10 @@
     @insns.each{|insn|
       opes = insn.opes
       operands_info << '  '
-      if opes.size == 0
-        operands_info << '"",' + "\n"
-      else
-        opes.each{|type, var|
-          operands_info << (op2typesig(type) + ' ')
-        }
-        operands_info << ",\n"
-      end
+      ot = opes.map{|type, var|
+        TYPE_CHARS.fetch(op2typesig(type))
+      }
+      operands_info << "\"#{ot.join}\"" << ", \n"
 
       num = opes.size + 1
       operands_num_info << "  #{num},\n"
@@ -903,10 +922,8 @@
     val  = op[1]
 
     case type
-    when /^long/
+    when /^long/, /^num_t/, /^lindex_t/, /^dindex_t/
       "INT2FIX(#{val})"
-    when /^ulong/
-      "INT2FIX(#{val})"
     when /^VALUE/
       val
     when /^ID/
@@ -920,7 +937,6 @@
     else
       raise "type: #{type}"
     end
-    
   end
   
   # optinsn.inc

Modified: trunk/template/insns.inc.tmpl
===================================================================
--- trunk/template/insns.inc.tmpl	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/insns.inc.tmpl	2005-12-28 01:55:06 UTC (rev 333)
@@ -5,7 +5,7 @@
   This file is auto generated by insns2vm.rb
   DO NOT TOUCH!
 
-  If you want to fix something, you must edit 'tmpl/insns.inc.tmpl'
+  If you want to fix something, you must edit 'template/insns.inc.tmpl'
   or insns2vm.rb
  */
 

Modified: trunk/template/insns_info.inc.tmpl
===================================================================
--- trunk/template/insns_info.inc.tmpl	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/insns_info.inc.tmpl	2005-12-28 01:55:06 UTC (rev 333)
@@ -5,10 +5,12 @@
   This file is auto generated by insns2vm.rb
   DO NOT TOUCH!
   
-  If you want to fix something, you must edit 'tmpl/insns_info.inc.tmpl'
+  If you want to fix something, you must edit 'template/insns_info.inc.tmpl'
   or insns2vm.rb
  */
 
+<%= insn_type_chars %>
+
 static char *insn_name_info[] = {
 <%= insn_names %>
 };
@@ -36,3 +38,40 @@
   return 0;
 }
 
+/* some utilities */
+
+static int
+insn_len(int insn)
+{
+  return insn_len_info[insn];
+}
+
+static char *
+insn_name(int insn)
+{
+  return insn_name_info[insn];
+}
+
+static char *
+insn_op_types(int insn)
+{
+  return insn_operand_info[insn];
+}
+
+static int
+insn_op_type(int insn, int pos)
+{
+  int len = insn_len(insn) - 1;
+  if(pos < len){
+    return insn_operand_info[insn][pos];
+  }
+  else{
+    return 0;
+  }
+}
+
+static int
+insn_ret_num(int insn)
+{
+  return insn_stack_push_num_info[insn];
+}

Modified: trunk/template/minsns.inc.tmpl
===================================================================
--- trunk/template/minsns.inc.tmpl	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/minsns.inc.tmpl	2005-12-28 01:55:06 UTC (rev 333)
@@ -5,7 +5,7 @@
   This file is auto generated by insns2vm.rb
   DO NOT TOUCH!
 
-  If you want to fix something, you must edit 'tmpl/minsns.inc.tmpl'
+  If you want to fix something, you must edit 'template/minsns.inc.tmpl'
   or insns2vm.rb
  */
 

Modified: trunk/template/opt_sc.inc.tmpl
===================================================================
--- trunk/template/opt_sc.inc.tmpl	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/opt_sc.inc.tmpl	2005-12-28 01:55:06 UTC (rev 333)
@@ -8,7 +8,7 @@
   This file is auto generated by insns2vm.rb
   DO NOT TOUCH!
 
-  If you want to fix something, you must edit 'tmpl/opt_sc.inc.tmpl'
+  If you want to fix something, you must edit 'template/opt_sc.inc.tmpl'
   or rb/insns2vm.rb
  */
 

Modified: trunk/template/optinsn.inc.tmpl
===================================================================
--- trunk/template/optinsn.inc.tmpl	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/optinsn.inc.tmpl	2005-12-28 01:55:06 UTC (rev 333)
@@ -8,7 +8,7 @@
   This file is auto generated by insns2vm.rb
   DO NOT TOUCH!
 
-  If you want to fix something, you must edit 'tmpl/optinsn.inc.tmpl'
+  If you want to fix something, you must edit 'template/optinsn.inc.tmpl'
   or rb/insns2vm.rb
  */
 

Modified: trunk/template/optunifs.inc.tmpl
===================================================================
--- trunk/template/optunifs.inc.tmpl	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/optunifs.inc.tmpl	2005-12-28 01:55:06 UTC (rev 333)
@@ -8,7 +8,7 @@
   This file is auto generated by insns2vm.rb
   DO NOT TOUCH!
 
-  If you want to fix something, you must edit 'tmpl/optunifs.inc.tmpl'
+  If you want to fix something, you must edit 'template/optunifs.inc.tmpl'
   or rb/insns2vm.rb
  */
 

Modified: trunk/template/vmtc.inc.tmpl
===================================================================
--- trunk/template/vmtc.inc.tmpl	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/template/vmtc.inc.tmpl	2005-12-28 01:55:06 UTC (rev 333)
@@ -8,7 +8,7 @@
   This file is auto generated by insns2vm.rb
   DO NOT TOUCH!
 
-  If you want to fix something, you must edit 'tmpl/vmtc.inc.tmpl'
+  If you want to fix something, you must edit 'template/vmtc.inc.tmpl'
   or insns2vm.rb
  */
 

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/test.rb	2005-12-28 01:55:06 UTC (rev 333)
@@ -1,3 +1,113 @@
+
+at_exit{
+  break
+}
+
+__END__
+
+Const = :top
+C = Class.new{
+  def m
+    p "C#m"
+  end
+}
+
+p C.instance_methods(false)
+C.new.m
+
+__END__
+
+class C
+  a = 10
+  1.times{
+    a = 10
+    b = 20
+  }
+end
+__END__
+
+def m a
+  1.times{
+    b = 1
+    a = 20
+  }
+end
+
+
+__END__
+
+def m
+  p :m
+end
+
+2.times{
+  m()
+  Object.class_eval{
+    p self
+    remove_method :m
+  }
+}
+__END__
+class A
+  C = "BAD"
+  class B
+    def self.c
+      C
+    end
+  end
+end
+
+A::B.c   # cache
+A::B.const_set :C, "OK"
+p A::B.c
+
+__END__
+p [0][*0]
+
+__END__
+
+def m *args
+  args
+end
+
+m(*1)
+__END__
+
+class C
+        def m *args
+          "C#m(#{args.join(',')})"
+        end
+        def b
+          class << self
+            define_method(:m){|a, b|
+              1.times{
+                p super
+              }
+            }
+          end
+          self
+        end
+      end
+      C.new.b.m(:ok1, :ok2)
+
+__END__
+
+class X
+  def a
+  end
+  def b
+    class << self
+      define_method(:a) {
+        super
+      }
+    end
+  end
+end
+
+x = X.new
+x.b
+x.a
+__END__
 class Module
   public :remove_const
 end

Modified: trunk/variable.c
===================================================================
--- trunk/variable.c	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/variable.c	2005-12-28 01:55:06 UTC (rev 333)
@@ -1480,33 +1480,36 @@
 static void
 mod_av_set(VALUE klass, ID id, VALUE val, int isconst)
 {
-    char *dest = isconst ? "constant" : "class variable";
+  char *dest = isconst ? "constant" : "class variable";
 
-    if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4)
-	rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest);
-    if (OBJ_FROZEN(klass)) {
-	if (BUILTIN_TYPE(klass) == T_MODULE) {
-	    rb_error_frozen("module");
-	}
-	else {
-	    rb_error_frozen("class");
-	}
+  if (!OBJ_TAINTED(klass) && rb_safe_level() >= 4)
+    rb_raise(rb_eSecurityError, "Insecure: can't set %s", dest);
+  if (OBJ_FROZEN(klass)) {
+    if (BUILTIN_TYPE(klass) == T_MODULE) {
+      rb_error_frozen("module");
     }
-    if (!RCLASS(klass)->iv_tbl) {
-	RCLASS(klass)->iv_tbl = st_init_numtable();
+    else {
+      rb_error_frozen("class");
     }
-    else if (isconst) {
-	VALUE value = Qfalse;
+  }
+  if (!RCLASS(klass)->iv_tbl) {
+    RCLASS(klass)->iv_tbl = st_init_numtable();
+  }
+  else if (isconst) {
+    VALUE value = Qfalse;
 
-	if (st_lookup(RCLASS(klass)->iv_tbl, id, &value)) {
-	    if (value == Qundef)
-		autoload_delete(klass, id);
-	    else
-		rb_warn("already initialized %s %s", dest, rb_id2name(id));
-	}
+    if (st_lookup(RCLASS(klass)->iv_tbl, id, &value)) {
+      if (value == Qundef)
+        autoload_delete(klass, id);
+      else
+        rb_warn("already initialized %s %s", dest, rb_id2name(id));
     }
+  }
 
-    st_insert(RCLASS(klass)->iv_tbl, id, val);
+  if(isconst){
+    rb_vm_change_state();
+  }
+  st_insert(RCLASS(klass)->iv_tbl, id, val);
 }
 
 void

Modified: trunk/vm.c
===================================================================
--- trunk/vm.c	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/vm.c	2005-12-28 01:55:06 UTC (rev 333)
@@ -15,11 +15,11 @@
 
 #define EVALBODY_HELPER_FUNCTION static inline
 
-#ifndef HAVE_TYPE_ULONG
-typedef unsigned long ulong;
-#endif
+typedef unsigned long num_t;
+typedef unsigned long lindex_t;
+typedef unsigned long dindex_t;
 
-typedef ulong GENTRY;
+typedef num_t GENTRY;
 
 void vm_analysis_operand(int insn, int n, VALUE op);
 void vm_analysis_register(int reg, int isset);
@@ -960,15 +960,15 @@
   return mn;
 }
 
-EVALBODY_HELPER_FUNCTION VALUE
-eval_push_cref(yarv_thread_t *th, VALUE klass, int noex)
+void
+rb_thread_push_cref(yarv_thread_t *th, VALUE klass, int noex)
 {
   rb_ary_push(th->klass_nest_stack, klass);
   rb_ary_push(th->visibility_nest_stack, INT2FIX(noex));
 }
 
-EVALBODY_HELPER_FUNCTION VALUE
-eval_pop_cref(yarv_thread_t *th)
+void
+rb_thread_pop_cref(yarv_thread_t *th)
 {
   rb_ary_pop(th->klass_nest_stack);
   rb_ary_pop(th->visibility_nest_stack);
@@ -1161,7 +1161,7 @@
   else{
     int i;
     struct catch_table_entry *entry;
-    ulong  epc, cont_pc, cont_sp;
+    unsigned long epc, cont_pc, cont_sp;
     VALUE catch_iseqval;
     yarv_control_frame_t *cfp;
     VALUE  *escape_dfp;
@@ -1336,7 +1336,7 @@
     else{
       /* pop cref */
       if(cfp->iseq->type == ISEQ_TYPE_CLASS){
-        eval_pop_cref(th);
+        rb_thread_pop_cref(th);
       }
       
       th->cfp++;

Modified: trunk/vm_evalbody.h
===================================================================
--- trunk/vm_evalbody.h	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/vm_evalbody.h	2005-12-28 01:55:06 UTC (rev 333)
@@ -68,7 +68,7 @@
 
   ID tmp_id;
   yarv_block_t *tmp_blockptr;
-  ulong tmp_num;
+  num_t tmp_num;
 
 #if OPT_TOKEN_THREADED_CODE || OPT_DIRECT_THREADED_CODE
 #include "vmtc.inc"

Modified: trunk/vm_macro.def
===================================================================
--- trunk/vm_macro.def	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/vm_macro.def	2005-12-28 01:55:06 UTC (rev 333)
@@ -32,8 +32,9 @@
   /* expand top of stack? */
   if(flag & VM_CALL_ARGS_SPLAT_BIT){
     VALUE ary = TOPN(0);
-    if(BUILTIN_TYPE(ary) != T_ARRAY){
-      /* not a [BUG] */
+    if(SPECIAL_CONST_P(ary) || BUILTIN_TYPE(ary) != T_ARRAY){
+      /* not a BUG */
+      /* TODO: check specification */
     }
     else{
       VALUE *ptr = RARRAY(ary)->ptr;
@@ -81,7 +82,7 @@
   if(niseq->arg_simple){
     if(niseq->argc != num){
       rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
-               (ulong)num, niseq->argc);
+               (unsigned long)num, niseq->argc);
     }
   }
   else{
@@ -93,15 +94,15 @@
          (niseq->arg_rest == 0 && num > iseq_argc + opts)){
         if(0){
           printf("num: %lu, iseq_argc: %d, opts: %d\n",
-                 (ulong)num, iseq_argc, opts);
+                 (unsigned long)num, iseq_argc, opts);
         }
         rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
-                 (ulong)num, iseq_argc);
+                 (unsigned long)num, iseq_argc);
       }
 
       if(0){
         printf("num: %lu, opts: %d, iseq_argc: %d\n",
-               (ulong)num, opts, iseq_argc);
+               (unsigned long)num, opts, iseq_argc);
       }
       if(num - iseq_argc < opts){
         opt_pc = niseq->arg_opt_tbl[num - iseq_argc];
@@ -127,11 +128,12 @@
       int rest = niseq->arg_rest - 1;
       int pack_size = num - rest;
       if(0){
-        printf("num: %lu, rest: %d, ps: %d\n", (ulong)num, niseq->arg_rest, pack_size);
+        printf("num: %lu, rest: %d, ps: %d\n",
+               (unsigned long)num, niseq->arg_rest, pack_size);
       }
       if(pack_size < 0){
         rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
-                 (ulong)num, rest - niseq->arg_opts);
+                 (unsigned long)num, rest - niseq->arg_opts);
       }
 
       /*
@@ -152,7 +154,7 @@
            (niseq->arg_opts && num == niseq->argc + niseq->arg_opts - 1) ||
            num == niseq->argc)){
         rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
-                 (ulong)num, niseq->argc);
+                 (unsigned long)num, niseq->argc);
       }
 
       if(blockptr){
@@ -229,7 +231,7 @@
   else{
     if(proc->block.iseq->argc != num){
       rb_raise(rb_eArgError, "wrong number of arguments (%lu for %d)",
-               (ulong)num, proc->block.iseq->argc);
+               (unsigned long)num, proc->block.iseq->argc);
     }
     th_set_env(th, proc->block.iseq,
                FRAME_MAGIC_PROC, recv, (VALUE)proc->block.dfp,

Modified: trunk/yarvcore.c
===================================================================
--- trunk/yarvcore.c	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/yarvcore.c	2005-12-28 01:55:06 UTC (rev 333)
@@ -488,8 +488,9 @@
   iseq->compile_data = 0;
 
   if(ruby_nerrs > 0){
+    VALUE str = rb_str_buf_new2("compile error");
     ruby_nerrs = 0;
-    rb_exc_raise(err);
+    rb_exc_raise(rb_exc_new3(rb_eSyntaxError, str));
   }
   return Qtrue;
 }

Modified: trunk/yarvcore.h
===================================================================
--- trunk/yarvcore.h	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/yarvcore.h	2005-12-28 01:55:06 UTC (rev 333)
@@ -288,9 +288,10 @@
   unsigned long thread_critical;
   VALUE main_thread;
   st_table *living_threads;
+
+  int exit_code;
   
   unsigned long interrupt_flag;
-  
   unsigned long trace_flag;
 } yarv_vm_t;
 
@@ -405,13 +406,6 @@
 char* node_name(int node);
 
 
-/* insns_info.c */
-char *insn_name(int insn);
-int   insn_len(int insn);
-char *insn_op_types(int insn);
-int   insn_op_type(int insn, int pos);
-
-
 /* each thread has this size stack : 2MB */
 #define YARV_THREAD_STACK_SIZE (128 * 1024)
 
@@ -509,6 +503,12 @@
 #define SDR()     vm_stack_dump_raw(GET_THREAD(), GET_THREAD()->cfp)
 #define SDR2(cfp) vm_stack_dump_raw(GET_THREAD(), (cfp))
 
+
+void rb_thread_push_cref(yarv_thread_t *th, VALUE klass, int noex);
+void rb_thread_pop_cref(yarv_thread_t *th);
+
+/* for thread */
+
 #include "yarv.h"
 
 #define GVL_LOCK_BEGIN() do { \
@@ -558,8 +558,6 @@
   YARV_CHECK_INTS_TH(GET_THREAD())
 
 
-
-
 #endif	// _YARVCORE_H_INCLUDED_
 
 

Modified: trunk/yarvtest/test_class.rb
===================================================================
--- trunk/yarvtest/test_class.rb	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/yarvtest/test_class.rb	2005-12-28 01:55:06 UTC (rev 333)
@@ -216,7 +216,7 @@
     }
   end
 
-  def test_super_from_define_method
+  def test_zsuper_from_define_method
     ae %q{
       class C
         def a
@@ -258,6 +258,42 @@
       x.b
       x.a
     }
+    ae %q{
+      class C
+        def m arg
+          "C#m(#{arg})"
+        end
+        def b
+          class << self
+            define_method(:m){|a|
+              super
+            }
+          end
+          self
+        end
+      end
+      C.new.b.m(:ok)
+    }
+    ae %q{
+      class C
+        def m *args
+          "C#m(#{args.join(', ')})"
+        end
+        def b
+          class << self
+            define_method(:m){|a, b|
+              r = nil
+              1.times{
+                r = super
+              }
+              r
+            }
+          end
+          self
+        end
+      end
+      C.new.b.m(:ok1, :ok2)
+    } if false # ruby 1.9 dumped core
   end
   
   def test_zsuper

Modified: trunk/yarvtest/test_method.rb
===================================================================
--- trunk/yarvtest/test_method.rb	2005-12-26 17:08:23 UTC (rev 332)
+++ trunk/yarvtest/test_method.rb	2005-12-28 01:55:06 UTC (rev 333)
@@ -48,30 +48,22 @@
   end
 
   def test_splat
-    if false
-      # error
-      ae %q{
-        def m a
-          a
-        end
-        
-        m(*1)
-      }
-    end
-
     ae %q{
+      def m a
+        a
+      end
+      m(*1)
+    } if false # ruby HEAD cause TypeError
+    ae %q{
       def m a, b
         [a, b]
       end
-
       m(*[1,2])
     }
-
     ae %q{
       def m a, b, c
         [a, b, c]
       end
-
       m(1, *[2, 3])
     }
 


-- 
ML: yarv-diff quickml.atdot.net
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧][生データ]