Initial (bad) gc

This commit is contained in:
2026-01-21 20:52:18 -08:00
parent 4c04e71078
commit 656846ddc0
16 changed files with 650 additions and 79 deletions
+16 -9
View File
@@ -89,14 +89,16 @@ typedef enum {
} LispValType;
extern const char *LISP_TYPE_NAMES[N_LISP_TYPES];
#define LISP_OBJECT_ALIGNMENT (1 << LISP_TAG_BITS)
void *lisp_alloc_object(size_t size, LispValType type);
typedef struct {
LispValType type;
ObjectGCInfo gc;
} LispObject;
#define LISP_OBJECT_ALIGNMENT (1 << LISP_TAG_BITS)
LispVal *lisp_alloc_object_no_gc(size_t size, LispValType type);
LispVal *lisp_alloc_object(size_t size, LispValType type);
void lisp_release_object(LispVal *val);
static ALWAYS_INLINE bool OBJECTP(LispVal *val) {
return EXTRACT_TAG(val) == LISP_OBJECT_TAG;
}
@@ -111,15 +113,19 @@ static ALWAYS_INLINE bool OBJECT_MARKED_P(LispVal *val) {
return ((LispObject *) val)->gc.mark;
}
// ONLY APPLIES TO THE CALLING THREAD
static ALWAYS_INLINE bool OBJECT_HAS_LOCAL_REFERENCE_P(LispVal *val) {
assert(OBJECTP(val));
LispObject *obj = val;
return tss_get(obj->gc.has_local_ref);
}
static ALWAYS_INLINE void SET_OBJECT_HAS_LOCAL_REFERENCE(LispVal *val,
bool has_local_ref) {
assert(OBJECTP(val));
((LispObject *) val)->gc.has_local_ref = has_local_ref;
}
static ALWAYS_INLINE bool OBJECT_HAS_LOCAL_REFERENCE_P(LispVal *val) {
assert(OBJECTP(val));
return ((LispObject *) val)->gc.has_local_ref;
LispObject *obj = val;
tss_set(obj->gc.has_local_ref,
(void *) (uintptr_t) (has_local_ref ? 1 : 0));
}
static ALWAYS_INLINE LispValType TYPE_OF(LispVal *val) {
@@ -240,6 +246,7 @@ DEFOBJTYPE(Vector, VECTOR, VECTORP, {
Q##cname = Fintern(make_lisp_string(internal_Q##cname##_name, \
internal_Q##cname##_name_len, \
false, false)); \
lisp_gc_register_static_object(Q##cname); \
}
#define REGISTER_GLOBAL_FUNCTION(cname) \
{ \