Initial tricolor gc
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user