summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/weak-table.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/libguile/weak-table.c b/libguile/weak-table.c
index f6f8dd68b..1bb513b17 100644
--- a/libguile/weak-table.c
+++ b/libguile/weak-table.c
@@ -686,6 +686,16 @@ weak_table_put_x (scm_t_weak_table *table, unsigned long hash,
}
}
+ /* Fast path for updated values for existing entries of weak-key
+ tables. */
+ if (table->kind == SCM_WEAK_TABLE_KIND_KEY &&
+ entries[k].hash == hash &&
+ entries[k].key == SCM_UNPACK (key))
+ {
+ entries[k].value = SCM_UNPACK (value);
+ return;
+ }
+
if (entries[k].hash)
unregister_disappearing_links (&entries[k], table->kind);
else