[前][次][番号順一覧][スレッド一覧]

ruby-changes:2285

From: ko1@a...
Date: 26 Oct 2007 02:05:26 +0900
Subject: [ruby-changes:2285] matz - Ruby:r13776 (trunk): * hash.c (rb_hash_s_create): check and convert argument hash

matz	2007-10-26 02:05:09 +0900 (Fri, 26 Oct 2007)

  New Revision: 13776

  Modified files:
    trunk/ChangeLog
    trunk/hash.c

  Log:
    * hash.c (rb_hash_s_create): check and convert argument hash
      using #to_hash.
    
    * hash.c (rb_hash_s_create): Hash#[] now takes assocs as source of
      hash conversion.

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/hash.c?r1=13776&r2=13775
  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi/trunk/ChangeLog?r1=13776&r2=13775

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 13775)
+++ ChangeLog	(revision 13776)
@@ -3,6 +3,12 @@
 	* array.c (rb_ary_assoc): check and convert inner arrays (assocs)
 	  using #to_ary.
 
+	* hash.c (rb_hash_s_create): check and convert argument hash
+	  using #to_hash.
+
+	* hash.c (rb_hash_s_create): Hash#[] now takes assocs as source of
+	  hash conversion.
+
 Thu Oct 25 14:19:33 2007  Nobuyoshi Nakada  <nobu@r...>
 
 	* io.c (rb_io_tell, rb_io_seek): check errno too.  [ruby-dev:32093]
Index: hash.c
===================================================================
--- hash.c	(revision 13775)
+++ hash.c	(revision 13776)
@@ -21,6 +21,8 @@
 #include <crt_externs.h>
 #endif
 
+static VALUE rb_hash_s_try_convert(VALUE, VALUE);
+
 #define HASH_DELETED  FL_USER1
 #define HASH_PROC_DEFAULT FL_USER2
 
@@ -315,18 +317,34 @@
 static VALUE
 rb_hash_s_create(int argc, VALUE *argv, VALUE klass)
 {
-    VALUE hash;
+    VALUE hash, tmp;
     int i;
 
-    if (argc == 1 && TYPE(argv[0]) == T_HASH) {
-	hash = hash_alloc(klass);
-        if (RHASH(argv[0])->ntbl) {
-            RHASH(hash)->ntbl = st_copy(RHASH(argv[0])->ntbl);
-        }
+    if (argc == 1) {
+	tmp = rb_hash_s_try_convert(Qnil, argv[0]);
+	if (!NIL_P(tmp)) {
+	    hash = hash_alloc(klass);
+	    if (RHASH(argv[0])->ntbl) {
+		RHASH(hash)->ntbl = st_copy(RHASH(argv[0])->ntbl);
+	    }
+	    return hash;
+	}
 
-	return hash;
+	tmp = rb_check_array_type(argv[0]);
+	if (!NIL_P(tmp)) {
+	    long i;
+
+	    hash = hash_alloc(klass);
+	    for (i = 0; i < RARRAY_LEN(tmp); ++i) {
+		VALUE v = rb_check_array_type(RARRAY_PTR(tmp)[i]);
+		
+		if (NIL_P(v)) continue;
+		if (RARRAY_LEN(v) < 1 || 2 < RARRAY_LEN(v)) continue;
+		rb_hash_aset(hash, RARRAY_PTR(v)[0], RARRAY_PTR(v)[1]);
+	    }
+	    return hash;
+	}
     }
-
     if (argc % 2 != 0) {
 	rb_raise(rb_eArgError, "odd number of arguments for Hash");
     }

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml

[前][次][番号順一覧][スレッド一覧]