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

ruby-changes:37587

From: naruse <ko1@a...>
Date: Fri, 20 Feb 2015 22:53:52 +0900 (JST)
Subject: [ruby-changes:37587] naruse:r49668 (ruby_2_2): merge revision(s) 49386:

naruse	2015-02-20 22:53:23 +0900 (Fri, 20 Feb 2015)

  New Revision: 49668

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=49668

  Log:
    merge revision(s) 49386:
    
    hash.c: move Hash specific functions
    
    * hash.c (rb_ident_hash): move compare_by_identity specific
      function from st.c.
    
    * hash.c (rb_ident_hash_new): ditto from thread.c.
    
    * st.c (st_numhash): remove ruby's Hash specific implementation.
    
    * thread.c (recursive_list_access): use rb_ident_hash_new().

  Modified directories:
    branches/ruby_2_2/
  Modified files:
    branches/ruby_2_2/hash.c
    branches/ruby_2_2/internal.h
    branches/ruby_2_2/st.c
    branches/ruby_2_2/thread.c
    branches/ruby_2_2/version.h
Index: ruby_2_2/st.c
===================================================================
--- ruby_2_2/st.c	(revision 49667)
+++ ruby_2_2/st.c	(revision 49668)
@@ -1750,26 +1750,6 @@ st_numcmp(st_data_t x, st_data_t y) https://github.com/ruby/ruby/blob/trunk/ruby_2_2/st.c#L1750
 st_index_t
 st_numhash(st_data_t n)
 {
-    /*
-     * This hash function is lightly-tuned for Ruby.  Further tuning
-     * should be possible.  Notes:
-     *
-     * - (n >> 3) alone is great for heap objects and OK for fixnum,
-     *   however symbols perform poorly.
-     * - (n >> (RUBY_SPECIAL_SHIFT+3)) was added to make symbols hash well,
-     *   n.b.: +3 to remove ID scope, +1 worked well initially, too
-     * - (n << 3) was finally added to avoid losing bits for fixnums
-     * - avoid expensive modulo instructions, it is currently only
-     *   shifts and bitmask operations.
-     * - flonum (on 64-bit) is pathologically bad, mix the actual
-     *   float value in, but do not use the float value as-is since
-     *   many integers get interpreted as 2.0 or -2.0 [Bug #10761]
-     */
-#ifdef USE_FLONUM /* RUBY */
-    if (FLONUM_P(n)) {
-	n ^= (st_data_t)rb_float_value(n);
-    }
-#endif
-
-    return (st_index_t)((n>>(RUBY_SPECIAL_SHIFT+3)|(n<<3)) ^ (n>>3));
+    enum {s1 = 11, s2 = 3};
+    return (st_index_t)((n>>s1|(n<<s2)) ^ (n>>s2));
 }
Index: ruby_2_2/thread.c
===================================================================
--- ruby_2_2/thread.c	(revision 49667)
+++ ruby_2_2/thread.c	(revision 49668)
@@ -4680,14 +4680,6 @@ rb_thread_shield_destroy(VALUE self) https://github.com/ruby/ruby/blob/trunk/ruby_2_2/thread.c#L4680
 }
 
 static VALUE
-ident_hash_new(void)
-{
-    VALUE hash = rb_hash_new();
-    rb_hash_tbl_raw(hash)->type = &st_hashtype_num;
-    return hash;
-}
-
-static VALUE
 threadptr_recursive_hash(rb_thread_t *th)
 {
     return th->local_storage_recursive_hash;
@@ -4714,7 +4706,7 @@ recursive_list_access(VALUE sym) https://github.com/ruby/ruby/blob/trunk/ruby_2_2/thread.c#L4706
     VALUE hash = threadptr_recursive_hash(th);
     VALUE list;
     if (NIL_P(hash) || !RB_TYPE_P(hash, T_HASH)) {
-	hash = ident_hash_new();
+	hash = rb_ident_hash_new();
 	threadptr_recursive_hash_set(th, hash);
 	list = Qnil;
     }
@@ -4722,7 +4714,7 @@ recursive_list_access(VALUE sym) https://github.com/ruby/ruby/blob/trunk/ruby_2_2/thread.c#L4714
 	list = rb_hash_aref(hash, sym);
     }
     if (NIL_P(list) || !RB_TYPE_P(list, T_HASH)) {
-	list = ident_hash_new();
+	list = rb_ident_hash_new();
 	rb_hash_aset(hash, sym, list);
     }
     return list;
Index: ruby_2_2/hash.c
===================================================================
--- ruby_2_2/hash.c	(revision 49667)
+++ ruby_2_2/hash.c	(revision 49668)
@@ -177,7 +177,39 @@ static const struct st_hash_type objhash https://github.com/ruby/ruby/blob/trunk/ruby_2_2/hash.c#L177
     rb_any_hash,
 };
 
-#define identhash st_hashtype_num
+#define rb_ident_cmp st_numcmp
+
+static st_index_t
+rb_ident_hash(st_data_t n)
+{
+    /*
+     * This hash function is lightly-tuned for Ruby.  Further tuning
+     * should be possible.  Notes:
+     *
+     * - (n >> 3) alone is great for heap objects and OK for fixnum,
+     *   however symbols perform poorly.
+     * - (n >> (RUBY_SPECIAL_SHIFT+3)) was added to make symbols hash well,
+     *   n.b.: +3 to remove ID scope, +1 worked well initially, too
+     * - (n << 3) was finally added to avoid losing bits for fixnums
+     * - avoid expensive modulo instructions, it is currently only
+     *   shifts and bitmask operations.
+     * - flonum (on 64-bit) is pathologically bad, mix the actual
+     *   float value in, but do not use the float value as-is since
+     *   many integers get interpreted as 2.0 or -2.0 [Bug #10761]
+     */
+#ifdef USE_FLONUM /* RUBY */
+    if (FLONUM_P(n)) {
+	n ^= (st_data_t)rb_float_value(n);
+    }
+#endif
+
+    return (st_index_t)((n>>(RUBY_SPECIAL_SHIFT+3)|(n<<3)) ^ (n>>3));
+}
+
+static const struct st_hash_type identhash = {
+    rb_ident_cmp,
+    rb_ident_hash,
+};
 
 typedef int st_foreach_func(st_data_t, st_data_t, st_data_t);
 
@@ -2507,6 +2539,14 @@ rb_hash_compare_by_id_p(VALUE hash) https://github.com/ruby/ruby/blob/trunk/ruby_2_2/hash.c#L2539
     return Qfalse;
 }
 
+VALUE
+rb_ident_hash_new(void)
+{
+    VALUE hash = rb_hash_new();
+    RHASH(hash)->ntbl = st_init_table(&identhash);
+    return hash;
+}
+
 st_table *
 rb_init_identtable(void)
 {
Index: ruby_2_2/internal.h
===================================================================
--- ruby_2_2/internal.h	(revision 49667)
+++ ruby_2_2/internal.h	(revision 49668)
@@ -704,6 +704,7 @@ struct st_table *rb_hash_tbl_raw(VALUE h https://github.com/ruby/ruby/blob/trunk/ruby_2_2/internal.h#L704
 VALUE rb_hash_has_key(VALUE hash, VALUE key);
 VALUE rb_hash_set_default_proc(VALUE hash, VALUE proc);
 long rb_objid_hash(st_index_t index);
+VALUE rb_ident_hash_new(void);
 st_table *rb_init_identtable(void);
 st_table *rb_init_identtable_with_size(st_index_t size);
 
@@ -957,9 +958,6 @@ extern int ruby_enable_coredump; https://github.com/ruby/ruby/blob/trunk/ruby_2_2/internal.h#L958
 int rb_get_next_signal(void);
 int rb_sigaltstack_size(void);
 
-/* st.c */
-extern const struct st_hash_type st_hashtype_num;
-
 /* strftime.c */
 #ifdef RUBY_ENCODING_H
 size_t rb_strftime_timespec(char *s, size_t maxsize, const char *format, rb_encoding *enc,
Index: ruby_2_2/version.h
===================================================================
--- ruby_2_2/version.h	(revision 49667)
+++ ruby_2_2/version.h	(revision 49668)
@@ -1,6 +1,6 @@ https://github.com/ruby/ruby/blob/trunk/ruby_2_2/version.h#L1
 #define RUBY_VERSION "2.2.0"
 #define RUBY_RELEASE_DATE "2015-02-20"
-#define RUBY_PATCHLEVEL 69
+#define RUBY_PATCHLEVEL 70
 
 #define RUBY_RELEASE_YEAR 2015
 #define RUBY_RELEASE_MONTH 2

Property changes on: ruby_2_2
___________________________________________________________________
Modified: svn:mergeinfo
   Merged /trunk:r49386


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

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