emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

scratch/igc 1edd9d7c001 4/5: Implement key-or-value-weak hash tables


From: Pip Cet
Subject: scratch/igc 1edd9d7c001 4/5: Implement key-or-value-weak hash tables
Date: Tue, 9 Jul 2024 02:13:09 -0400 (EDT)

branch: scratch/igc
commit 1edd9d7c001497e2416379901822cc510249fc54
Author: Pip Cet <pipcet@protonmail.com>
Commit: Pip Cet <pipcet@protonmail.com>

    Implement key-or-value-weak hash tables
    
    * src/fns.c (allocate_weak_hash_table)
    (maybe_resize_weak_hash_table): Handle `Weak_Key_Or_Value' casee
    (weak_hash_put): Call `Figc__add_extra_dependency'.
    (Fputhash): Call `Figc__remove_extra_dependency',
    `Figc__add_extra_dependency'.
    * src/igc.c (fix_weak_hash_table_strong_part)
    (fix_weak_hash_table_weak_part)
    (igc_alloc_weak_hash_table_strong_part)
    (igc_alloc_weak_hash_table_weak_part): Handle `Weak_Key_Or_Value' case
---
 src/fns.c | 22 +++++++++++++++++++++-
 src/igc.c |  7 ++++++-
 2 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/src/fns.c b/src/fns.c
index 221e239c639..7df28588e2c 100644
--- a/src/fns.c
+++ b/src/fns.c
@@ -5508,6 +5508,7 @@ allocate_weak_hash_table (hash_table_weakness_t weak, 
ssize_t size, ssize_t inde
       ret->strong->index = ret->strong->entries + 3 * size;
       break;
     case Weak_Key_And_Value:
+    case Weak_Key_Or_Value:
       ret->strong->key = ret->weak->entries;
       ret->strong->value = ret->weak->entries + size;
       ret->strong->index = ret->strong->entries + 2 * size;
@@ -5661,6 +5662,7 @@ maybe_resize_weak_hash_table (struct Lisp_Weak_Hash_Table 
*h)
          strong->index = strong->entries + 3 * new_size;
          break;
        case Weak_Key_And_Value:
+       case Weak_Key_Or_Value:
          strong->key = weak->entries;
          strong->value = weak->entries + new_size;
          strong->index = strong->entries + 2 * new_size;
@@ -5742,6 +5744,12 @@ weak_hash_put (struct Lisp_Weak_Hash_Table *h, 
Lisp_Object key, Lisp_Object valu
   /* Increment count after resizing because resizing may fail.  */
   maybe_resize_weak_hash_table (h);
 
+  if (h->strong->weakness == Weak_Key_Or_Value)
+    {
+      /* This might add a key -> key dependency, which is fine.  */
+      Figc__add_extra_dependency (key, value, make_lisp_weak_hash_table (h));
+      Figc__add_extra_dependency (value, key, make_lisp_weak_hash_table (h));
+    }
   /* Store key/value in the key_and_value vector.  */
   ptrdiff_t i = XFIXNUM (h->strong->next_free);
   //eassert (hash_unused_entry_key_p (HASH_KEY (h, i)));
@@ -6546,7 +6554,19 @@ VALUE.  In any case, return VALUE.  */)
       Lisp_Object hash = weak_hash_from_key (wh, key);
       ptrdiff_t i = weak_hash_lookup_with_hash (wh, key, hash);
       if (i >= 0)
-       set_weak_hash_value_slot (wh, i, value);
+       {
+         if (wh->strong->weakness == Weak_Key_Or_Value)
+           {
+             Figc__remove_extra_dependency (key, value, table);
+             Figc__remove_extra_dependency (value, key, table);
+           }
+         set_weak_hash_value_slot (wh, i, value);
+         if (wh->strong->weakness == Weak_Key_Or_Value)
+           {
+             Figc__add_extra_dependency (key, value, table);
+             Figc__add_extra_dependency (value, key, table);
+           }
+       }
       else
        weak_hash_put (wh, key, value, hash);
       return value;
diff --git a/src/igc.c b/src/igc.c
index 916b3a84316..330be3fe088 100644
--- a/src/igc.c
+++ b/src/igc.c
@@ -2025,6 +2025,7 @@ fix_weak_hash_table_strong_part (mps_ss_t ss, struct 
Lisp_Weak_Hash_Table_Strong
            limit = 3 * XFIXNUM (t->table_size);
            break;
          case Weak_Key_And_Value:
+         case Weak_Key_Or_Value:
            limit = 2 * XFIXNUM (t->table_size);
            break;
          default:
@@ -2060,6 +2061,7 @@ fix_weak_hash_table_weak_part (mps_ss_t ss, struct 
Lisp_Weak_Hash_Table_Weak_Par
            limit = XFIXNUM (t->table_size);
            break;
          case Weak_Key_And_Value:
+         case Weak_Key_Or_Value:
            limit = 2 * XFIXNUM (t->table_size);
            break;
          default:
@@ -2080,7 +2082,8 @@ fix_weak_hash_table_weak_part (mps_ss_t ss, struct 
Lisp_Weak_Hash_Table_Weak_Par
                    .weak = w,
                  };
                weak_hash_splat_from_table
-                 (&pseudo_h, ((t->weakness == Weak_Key_And_Value) ?
+                 (&pseudo_h, ((t->weakness == Weak_Key_And_Value ||
+                               t->weakness == Weak_Key_Or_Value) ?
                               (i % XFIXNUM (t->table_size)) : i));
              }
          }
@@ -3965,6 +3968,7 @@ igc_alloc_weak_hash_table_strong_part 
(hash_table_weakness_t weak,
       total_size = 3 * size + ((ptrdiff_t)1 << index_bits);
       break;
     case Weak_Key_And_Value:
+    case Weak_Key_Or_Value:
       total_size = 2 * size + ((ptrdiff_t)1 << index_bits);
       break;
     default:
@@ -3989,6 +3993,7 @@ igc_alloc_weak_hash_table_weak_part 
(hash_table_weakness_t weak,
       total_size = size;
       break;
     case Weak_Key_And_Value:
+    case Weak_Key_Or_Value:
       total_size = 2 * size;
       break;
     default:



reply via email to

[Prev in Thread] Current Thread [Next in Thread]