Initial tricolor gc

This commit is contained in:
2026-01-22 01:31:20 -08:00
parent 656846ddc0
commit 1a0906206a
7 changed files with 239 additions and 197 deletions
+7
View File
@@ -14,7 +14,9 @@ LispVal *make_hash_table_no_gc(LispVal *hash_fn, LispVal *eq_fn) {
LispHashTable *obj =
lisp_alloc_object_no_gc(sizeof(LispHashTable), TYPE_HASH_TABLE);
obj->eq_fn = eq_fn;
MARK_OBJECT_ADDED(eq_fn, obj);
obj->hash_fn = hash_fn;
MARK_OBJECT_ADDED(hash_fn, obj);
obj->count = 0;
obj->size = INITIAL_SIZE;
obj->data = lisp_malloc0(sizeof(struct HashTableBucket) * obj->size);
@@ -33,7 +35,9 @@ DEFUN(make_hash_table, "make-hash-table", (LispVal * hash_fn, LispVal *eq_fn),
LispHashTable *obj =
lisp_alloc_object(sizeof(LispHashTable), TYPE_HASH_TABLE);
obj->eq_fn = eq_fn;
MARK_OBJECT_ADDED(eq_fn, obj);
obj->hash_fn = hash_fn;
MARK_OBJECT_ADDED(hash_fn, obj);
obj->count = 0;
obj->size = INITIAL_SIZE;
obj->data = lisp_malloc0(sizeof(struct HashTableBucket) * obj->size);
@@ -114,6 +118,7 @@ DEFUN(puthash, "puthash", (LispVal * ht, LispVal *key, LispVal *val),
LispHashTable *obj = ht;
if (obj->cache_bucket && key == obj->cache_bucket->key) {
obj->cache_bucket->value = val;
MARK_OBJECT_ADDED(val, ht);
return Qnil;
}
maybe_rehash(ht);
@@ -122,8 +127,10 @@ DEFUN(puthash, "puthash", (LispVal * ht, LispVal *key, LispVal *val),
if (HT_BUCKET_EMPTY_P(b)) {
b->hash = hash;
b->key = key;
MARK_OBJECT_ADDED(key, ht);
}
b->value = val;
MARK_OBJECT_ADDED(val, ht);
++((LispHashTable *) ht)->count;
obj->cache_bucket = b;
return Qnil;