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

yarv-diff:91

From: ko1 atdot.net
Date: 18 Aug 2005 04:01:49 -0000
Subject: [yarv-diff:91] r247 - in trunk: . yarvtest

Author: ko1
Date: 2005-08-18 13:01:48 +0900 (Thu, 18 Aug 2005)
New Revision: 247

Added:
   trunk/test.rb
   trunk/test2.rb
Removed:
   trunk/test1.rb
Modified:
   trunk/ChangeLog
   trunk/common.mk
   trunk/compile.c
   trunk/vm.c
   trunk/yarvtest/test_syn.rb
Log:
	* common.mk : 

	* compile.c : fix when clause bug and splat arugment



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/ChangeLog	2005-08-18 04:01:48 UTC (rev 247)
@@ -4,6 +4,13 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-08-18(Thu) 12:59:38 +0900
+
+	* common.mk : 
+
+	* compile.c : fix when clause bug and splat arugment
+
+
 2005-08-17(Wed) 05:22:31 +0900
 
 	* compile.c : fix block local parameter setting routine and support

Modified: trunk/common.mk
===================================================================
--- trunk/common.mk	2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/common.mk	2005-08-18 04:01:48 UTC (rev 247)
@@ -394,16 +394,16 @@
 yarv-test-each: all
 	$(BASERUBY) -I$(srcdir) $(srcdir)/yarvtest/test_$(ITEM).rb $(OPT) yarv=$(MINIRUBY) ruby=$(BASERUBY)
 
-run: all
+run2: all
 	$(BASERUBY) -I$(srcdir)/lib $(srcdir)/test.rb $(MINIRUBY) $(BASERUBY) $(RUNOPT)
 
-run1: all
+run: all
 	$(MINIRUBY) $(srcdir)/test1.rb
 
 parse: all
 	$(MINIRUBY) $(srcdir)/rb/parse.rb $(srcdir)/test1.rb
 
-run1p: all
+runp: all
 	$(MINIRUBY) $(srcdir)/rb/parse.rb $(srcdir)/test1.rb
 	$(MINIRUBY) $(srcdir)/test1.rb
 

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/compile.c	2005-08-18 04:01:48 UTC (rev 247)
@@ -788,21 +788,33 @@
     case NODE_MASGN:{
       int i;
       nelem = node->nd_var->nd_head;
-      iseqobj->argc = node->nd_var->nd_head->nd_alen;
-      for(i=0; i<iseqobj->argc; i++, nelem = nelem->nd_next){
-        if(nd_type(nelem->nd_head) == NODE_DASGN_CURR){
-          rb_ary_push(vars, ID2SYM(nelem->nd_head->nd_vid));
-          debugi("block arg", nelem->nd_head->nd_vid);
+      if(nelem != 0){
+        iseqobj->argc = node->nd_var->nd_head->nd_alen;
+        for(i=0; i<iseqobj->argc; i++, nelem = nelem->nd_next){
+          if(nd_type(nelem->nd_head) == NODE_DASGN_CURR){
+            rb_ary_push(vars, ID2SYM(nelem->nd_head->nd_vid));
+            debugi("block arg", nelem->nd_head->nd_vid);
+          }
+          else{
+            char buff[0x20];
+            ID   id;
+            int  idx = iseqobj->argc - RARRAY(vars)->len;
+            snprintf(buff, 0x20, "#blp%d", idx);
+            id = rb_intern(buff);
+            rb_ary_push(vars, ID2SYM(id));
+            debugi("block arg (auto)", id);
+            search_block_local_variables(nelem->nd_head, local_vars);
+          }
         }
+      }
+      if(node->nd_var->nd_args){
+        NODE *sn = node->nd_var->nd_args;
+        if(nd_type(sn) == NODE_DASGN_CURR){
+          rb_ary_push(vars, ID2SYM(sn->nd_vid));
+        }
         else{
-          char buff[0x20];
-          ID   id;
-          int  idx = iseqobj->argc - RARRAY(vars)->len;
-          snprintf(buff, 0x20, "#blp%d", idx);
-          id = rb_intern(buff);
-          rb_ary_push(vars, ID2SYM(id));
-          debugi("block arg (auto)", id);
-          search_block_local_variables(nelem->nd_head, local_vars);
+          rb_ary_push(vars, ID2SYM(rb_intern("#blp_splat")));
+          debugi("block/splat (auto)", rb_intern("#blp_splat"));
         }
       }
       break;
@@ -884,12 +896,9 @@
   if(node->nd_var){
     NODE *nargs = node->nd_var;
     switch(nd_type(nargs)){
-    case NODE_MASGN:
-      if(nargs->nd_head == 0){
-        rb_bug("unsupport this type block parameter");
-      }
-      else{
-        int i=0;
+    case NODE_MASGN:{
+      int i=0;
+      if(nargs->nd_head != 0){
         nargs = nargs->nd_head;
         while(nargs){
           if(nd_type(nargs->nd_head) != NODE_DASGN_CURR){
@@ -902,7 +911,16 @@
           nargs = nargs->nd_next;
         }
       }
+      if(node->nd_var->nd_args){
+        iseqobj->argc++;
+        iseqobj->arg_rest = i;
+        if(nd_type(node->nd_var->nd_args) != NODE_DASGN_CURR){
+          ADD_INSN2(anchor, nd_line(node), getdynamic, I2F(iseqobj->local_size - i), I2F(0));
+          set_block_initializer(self, iseqobj, node->nd_var->nd_args, anchor);
+        }
+      }
       break;
+    }
       
     case NODE_DASGN_CURR:
       break;
@@ -2233,12 +2251,13 @@
   case NODE_WHEN:{
     NODE* vals;
     NODE* val;
+    NODE* orig_node = node;
     LABEL* endlabel;
     DECL_ANCHOR(body_seq);
 
     endlabel = NEW_LABEL(nd_line(node));
 
-    while(nd_type(node) == NODE_WHEN){
+    while(node && nd_type(node) == NODE_WHEN){
       LABEL *l1  = NEW_LABEL(nd_line(node));
       ADD_LABEL(body_seq, l1);
       COMPILE_ (body_seq, "when", node->nd_body, poped);
@@ -2260,7 +2279,7 @@
     }
     /* else */
     COMPILE_ (ret, "else", node, poped);
-    ADD_INSNL(ret, nd_line(node), jump, endlabel);
+    ADD_INSNL(ret, nd_line(orig_node), jump, endlabel);
 
     ADD_SEQ  (ret, body_seq);
     ADD_LABEL(ret, endlabel);
@@ -2880,7 +2899,6 @@
     VALUE block = 0;
     VALUE parent_block = iseqobj->compile_data->current_block;
     iseqobj->compile_data->current_block = Qfalse;
-    
 #if SUPPORT_GOTO
     /* only joke */
     {
@@ -2961,6 +2979,7 @@
     if(parent_block){
       if(parent_block & 1){
         flag |= VM_CALL_ARGS_BLOCKARG_BIT;
+        //dump_disasm_list((LINK_ANCHOR *)(parent_block & (~1)));
         ADD_SEQ(ret, (LINK_ANCHOR *)(parent_block & (~1)));
       }
       else{
@@ -3383,9 +3402,9 @@
     LABEL * retry_end_l = NEW_LABEL(nd_line(node));
     DECL_ANCHOR(current_block);
     
-    iseqobj->compile_data->current_block = (VALUE)current_block | 1;
     COMPILE(current_block, "block pass proc", node->nd_body);
     
+    iseqobj->compile_data->current_block = (VALUE)current_block | 1;
     ADD_LABEL(ret, retry_label);
     COMPILE_ (ret, "iter caller (NODE_BLOCK_PASS)", node->nd_iter, poped);
     ADD_LABEL(ret, retry_end_l);

Copied: trunk/test.rb (from rev 245, trunk/test1.rb)
===================================================================
--- trunk/test1.rb	2005-08-16 20:25:28 UTC (rev 245)
+++ trunk/test.rb	2005-08-18 04:01:48 UTC (rev 247)
@@ -0,0 +1,23 @@
+def m *args
+  p args
+end
+
+
+__END__
+def iter
+  yield 1,2
+end
+
+iter{|x, *a|
+  p a
+}
+
+
+__END__
+__END__
+a = 1
+END{
+  p a
+  p :POSTEXE
+}
+p :FINISH

Deleted: trunk/test1.rb
===================================================================
--- trunk/test1.rb	2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/test1.rb	2005-08-18 04:01:48 UTC (rev 247)
@@ -1,14 +0,0 @@
-      ary = 1
-      p [:x, *ary]
-__END__
-[:x, *]
-__END__
-ary = [1, 2]
-p [:x, *ary]
-
-__END__
-def m
-  return 1, *[]
-end
-a, b = m
-p [a, b]

Copied: trunk/test2.rb (from rev 243, trunk/test.rb)

Modified: trunk/vm.c
===================================================================
--- trunk/vm.c	2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/vm.c	2005-08-18 04:01:48 UTC (rev 247)
@@ -384,7 +384,7 @@
           argv = RARRAY(argv[0])->ptr;
         }
       }
-
+      
       th_set_finish_env(th);
       th_set_env(th, block->iseq, FRAME_MAGIC_BLOCK,
                  block->self, GC_GUARDED_PTR(block->dfp),

Modified: trunk/yarvtest/test_syn.rb
===================================================================
--- trunk/yarvtest/test_syn.rb	2005-08-18 03:58:46 UTC (rev 246)
+++ trunk/yarvtest/test_syn.rb	2005-08-18 04:01:48 UTC (rev 247)
@@ -177,6 +177,17 @@
         :ng
       end
     }
+    ae %q{
+      def test(arg)
+        case 1
+        when 2
+          3
+        end
+        return arg
+      end
+      
+      test(100)
+    }
   end
 
   def test_when
@@ -213,16 +224,11 @@
       else
         :elseok
       end)
+      
     ae %q{
-      def test(arg)
-        case 1
-        when 2
-          3
-        end
-        return arg
+      case
+      when 1
       end
-      
-      test(100)
     }
   end
 


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

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