aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog9
-rw-r--r--hash.c15
-rw-r--r--include/ruby/st.h1
-rw-r--r--st.c31
4 files changed, 12 insertions, 44 deletions
diff --git a/ChangeLog b/ChangeLog
index 2acf6822a8..447ad6b5d8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,15 +10,6 @@ Thu Oct 10 21:36:16 2013 Masaki Matsushita <glass.saga@gmail.com>
* array.c (rb_ary_compact_bang): use ary_resize_smaller().
-Thu Oct 10 21:00:38 2013 Masaki Matsushita <glass.saga@gmail.com>
-
- * st.c (st_keys): define st_keys() for performance improvement of
- Hash#keys and Array#uniq.
-
- * st.h: ditto.
-
- * hash.c (rb_hash_keys): use st_keys().
-
Thu Oct 10 17:25:28 2013 Koichi Sasada <ko1@atdot.net>
* vm.c (vm_exec): support :b_return event for "lambda{return}.call".
diff --git a/hash.c b/hash.c
index 2cedeefb10..83d179964f 100644
--- a/hash.c
+++ b/hash.c
@@ -1663,6 +1663,13 @@ rb_hash_to_h(VALUE hash)
return hash;
}
+static int
+keys_i(VALUE key, VALUE value, VALUE ary)
+{
+ rb_ary_push(ary, key);
+ return ST_CONTINUE;
+}
+
/*
* call-seq:
* hsh.keys -> array
@@ -1678,10 +1685,12 @@ rb_hash_to_h(VALUE hash)
VALUE
rb_hash_keys(VALUE hash)
{
- st_table *table = RHASH(hash)->ntbl;
+ VALUE ary;
+
+ ary = rb_ary_new_capa(RHASH_SIZE(hash));
+ rb_hash_foreach(hash, keys_i, ary);
- if (!table) return rb_ary_new();
- return st_keys(table);
+ return ary;
}
static int
diff --git a/include/ruby/st.h b/include/ruby/st.h
index 5968a1fc22..e71301b519 100644
--- a/include/ruby/st.h
+++ b/include/ruby/st.h
@@ -112,7 +112,6 @@ int st_update(st_table *table, st_data_t key, st_update_callback_func *func, st_
int st_foreach(st_table *, int (*)(ANYARGS), st_data_t);
int st_foreach_check(st_table *, int (*)(ANYARGS), st_data_t, st_data_t);
int st_reverse_foreach(st_table *, int (*)(ANYARGS), st_data_t);
-VALUE st_keys(st_table *table);
void st_add_direct(st_table *, st_data_t, st_data_t);
void st_free_table(st_table *);
void st_cleanup_safe(st_table *, st_data_t);
diff --git a/st.c b/st.c
index 43e2d71d24..6e3df628a7 100644
--- a/st.c
+++ b/st.c
@@ -1091,37 +1091,6 @@ st_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)
return 0;
}
-VALUE
-st_keys(st_table *table)
-{
- st_table_entry *ptr = NULL;
- st_data_t key, never = (st_data_t)Qundef;
- VALUE keys = rb_ary_new_capa(table->num_entries);
-
- if (table->entries_packed) {
- st_index_t i;
-
- for (i = 0; i < table->real_entries; i++) {
- key = PKEY(table, i);
- if (key == never) continue;
- rb_ary_push(keys, (VALUE)key);
- }
- }
- else {
- ptr = table->head;
- }
-
- if (ptr != 0) {
- do {
- key = ptr->key;
- if (key != never) rb_ary_push(keys, (VALUE)key);
- ptr = ptr->fore;
- } while (ptr && table->head);
- }
-
- return keys;
-}
-
#if 0 /* unused right now */
int
st_reverse_foreach(st_table *table, int (*func)(ANYARGS), st_data_t arg)