summaryrefslogtreecommitdiffstats
path: root/st.c
diff options
context:
space:
mode:
authoryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-10-28 16:06:26 +0000
committeryugui <yugui@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2009-10-28 16:06:26 +0000
commit3aff54f55b5bbd2c2b2575946e2ae8e5fd91e4bb (patch)
tree2712adb9558b3074907d44bb3c76a40f74d1619d /st.c
parent1c95a727236683606898184a6369305eb530ffbe (diff)
downloadruby-3aff54f55b5bbd2c2b2575946e2ae8e5fd91e4bb.tar.gz
ruby-3aff54f55b5bbd2c2b2575946e2ae8e5fd91e4bb.tar.xz
ruby-3aff54f55b5bbd2c2b2575946e2ae8e5fd91e4bb.zip
merges r24637 from trunk into ruby_1_9_1.
-- * st.c (st_delete_safe): deals with packed entries. [ruby-core:25080] * st.c (st_cleanup_safe): ditto. [ruby-core:25081] git-svn-id: http://svn.ruby-lang.org/repos/ruby/branches/ruby_1_9_1@25543 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'st.c')
-rw-r--r--st.c28
1 files changed, 28 insertions, 0 deletions
diff --git a/st.c b/st.c
index 6e42270a9..c6821467b 100644
--- a/st.c
+++ b/st.c
@@ -573,6 +573,19 @@ st_delete_safe(register st_table *table, register st_data_t *key, st_data_t *val
unsigned int hash_val;
register st_table_entry *ptr;
+ if (table->entries_packed) {
+ st_index_t i;
+ for (i = 0; i < table->num_entries; i++) {
+ if ((st_data_t)table->bins[i*2] == *key) {
+ if (value != 0) *value = (st_data_t)table->bins[i*2+1];
+ table->bins[i*2] = (void *)never;
+ return 1;
+ }
+ }
+ if (value != 0) *value = 0;
+ return 0;
+ }
+
hash_val = do_hash_bin(*key, table);
ptr = table->bins[hash_val];
@@ -596,6 +609,21 @@ st_cleanup_safe(st_table *table, st_data_t never)
st_table_entry *ptr, **last, *tmp;
int i;
+ if (table->entries_packed) {
+ st_index_t i = 0, j = 0;
+ while ((st_data_t)table->bins[i*2] != never) {
+ if (i++ == table->num_entries) return;
+ }
+ for (j = i; ++i < table->num_entries;) {
+ if ((st_data_t)table->bins[i*2] == never) continue;
+ table->bins[j*2] = table->bins[i*2];
+ table->bins[j*2+1] = table->bins[i*2+1];
+ j++;
+ }
+ table->num_entries = j;
+ return;
+ }
+
for (i = 0; i < table->num_bins; i++) {
ptr = *(last = &table->bins[i]);
while (ptr != 0) {