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

yarv-diff:96

From: ko1 atdot.net
Date: 9 Sep 2005 10:38:44 -0000
Subject: [yarv-diff:96] r252 - in trunk: . yarvtest

Author: ko1
Date: 2005-09-09 19:38:43 +0900 (Fri, 09 Sep 2005)
New Revision: 252

Modified:
   trunk/ChangeLog
   trunk/compile.c
   trunk/insns.def
   trunk/test.rb
   trunk/yarvtest/test_massign.rb
Log:
	* insns.def, compile.c : add splatarray

	* yarvtest/test_massign.rb : add tests for above



Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog	2005-08-31 13:58:43 UTC (rev 251)
+++ trunk/ChangeLog	2005-09-09 10:38:43 UTC (rev 252)
@@ -4,6 +4,13 @@
 #  from Mon, 03 May 2004 01:24:19 +0900
 #
 
+2005-09-09(Fri) 19:32:11 +0900  Koichi Sasada  <ko1 atdot.net>
+
+	* insns.def, compile.c : add splatarray
+
+	* yarvtest/test_massign.rb : add tests for above
+
+
 2005-08-31(Wed) 22:55:15 +0900  Koichi Sasada  <ko1 atdot.net>
 
 	* yarvcore.c (yarvcore_eval_parsed): fix to return value

Modified: trunk/compile.c
===================================================================
--- trunk/compile.c	2005-08-31 13:58:43 UTC (rev 251)
+++ trunk/compile.c	2005-09-09 10:38:43 UTC (rev 252)
@@ -3379,6 +3379,7 @@
   }
   case NODE_SPLAT:{
     COMPILE(ret, "splat", node->nd_head);
+    ADD_INSN(ret, nd_line(node), splatarray);
     break;
   }
   case NODE_TO_ARY:{

Modified: trunk/insns.def
===================================================================
--- trunk/insns.def	2005-08-31 13:58:43 UTC (rev 251)
+++ trunk/insns.def	2005-09-09 10:38:43 UTC (rev 252)
@@ -563,18 +563,45 @@
 DEFINE_INSN
 concatarray
 ()
-(VALUE ary1, VALUE ary2)
+(VALUE ary1, VALUE ary2st)
 (VALUE ary)
 {
+  VALUE ary2 = ary2st;
+  
   if(CLASS_OF(ary2) != rb_cArray){
-    rb_ary_push(ary1, ary2);
-    ary = ary1;
+    ary2 = rb_Array(ary2);
   }
-  else{
-    ary = rb_ary_concat(ary1, ary2);
+  ary = rb_ary_concat(ary1, ary2);
+}
+
+
+/**
+  @c put
+  @e splat array
+  @j splat array
+ */
+DEFINE_INSN
+splatarray
+()
+(VALUE ary)
+(VALUE obj)
+{
+  int len;
+  obj = ary;
+  if(CLASS_OF(ary) != rb_cArray){
+    obj = rb_Array(ary);
   }
+  len = RARRAY(obj)->len;
+  
+  if(len == 0){
+    obj = Qnil;
+  }
+  else if(len == 1){
+    obj = rb_ary_entry(obj, 0);
+  }
 }
 
+
 /**
   @c put
   @e put new Hash.

Modified: trunk/test.rb
===================================================================
--- trunk/test.rb	2005-08-31 13:58:43 UTC (rev 251)
+++ trunk/test.rb	2005-09-09 10:38:43 UTC (rev 252)
@@ -1,4 +1,68 @@
-
 class C
+  def to_a
+    [:x]
+  end
 end
 
+a = *(C.new)
+p a #=> :x
+
+__END__
+
+a = *{:a=>1}.to_a; p a
+
+__END__
+p [a, b]
+
+__END__
+
+def m
+  return *[1]
+end
+a = m
+p a
+__END__
+a, = *[1]
+p a
+
+__END__
+
+def m
+  return *[1, 2]
+end
+a = m
+p a #=> [1, 2]
+
+__END__
+
+def m
+        return *1
+      end
+      a, b = m
+      [a, b]
+__END__
+def m
+        return *[1,2,3]
+      end
+      a, b = m
+      [a, b]
+__END__
+def m
+        return *[1]
+      end
+      a, b = m
+      p [a, b]
+
+__END__
+
+a = :a; b = :b; c = [1,2]
+x = a, b, c
+p x
+__END__
+a = *1
+p a
+
+__END__
+x, y=*{1=>2,3=>4}
+p [x, y]
+

Modified: trunk/yarvtest/test_massign.rb
===================================================================
--- trunk/yarvtest/test_massign.rb	2005-08-31 13:58:43 UTC (rev 251)
+++ trunk/yarvtest/test_massign.rb	2005-09-09 10:38:43 UTC (rev 252)
@@ -85,6 +85,14 @@
       x, y, *z = a, b
       [x, y]
     }
+    ae %q{ # only one item on rhs
+      *x = :x
+      x
+    }
+    ae %q{ # nil on rhs
+      *x = nil
+      x
+    }
   end
 
   def test_splat_r
@@ -119,6 +127,10 @@
       x, y = a, b, *c
       [x, y]
     }
+    ae %q{
+      x=*nil
+      x
+    }
   end
 
   def test_splat_b1
@@ -275,6 +287,12 @@
       a, b = m
       [a, b]
     }
+    ae %q{
+      def m
+        return *[1]
+      end
+      a = m
+    }
   end
 
   def test_mret_argscat
@@ -339,6 +357,31 @@
       [a, b1, b2, c, d, e]
     }
   end
+
+  # ignore
+  def _test_massign_value
+   # Value of this massign statement should be [1, 2, 3]
+   ae %q{
+     a, b, c = [1, 2, 3]
+   }
+ end
+
+ def test_nested_splat
+   # Somewhat obscure nested splat
+   ae %q{
+     a = *[*[1]]
+     a
+   }
+ end
+ 
+ def test_calls_to_a
+   # Should be result of calling to_a on arg, ie [[1, 2], [3, 4]]
+   ae %q{
+     x=*{1=>2,3=>4}
+     x
+   }
+ end
+
 end
 
 


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

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