summaryrefslogtreecommitdiff
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
commit30cce03efe9635a1c2f2be287cd159b034cbb807 (patch)
tree2712adb9558b3074907d44bb3c76a40f74d1619d /st.c
parentb467b54e012f5cd23673366cb8c291b4a16b1e0d (diff)
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: svn+ssh://ci.ruby-lang.org/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 6e42270a96..c6821467b3 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) {