Global generation

This commit is contained in:
2026-01-18 03:11:17 -08:00
parent 94d5749d31
commit c0b18cda5a
16 changed files with 571 additions and 57 deletions
+35 -20
View File
@@ -95,6 +95,10 @@ typedef struct {
ObjectGCInfo gc;
} LispObject;
static ALWAYS_INLINE void MAKE_OBJ_IMMORTAL(LispVal *obj) {
((LispObject *) obj)->gc.immortal = true;
}
static ALWAYS_INLINE LispValType TYPE_OF(LispVal *val) {
if (FIXNUMP(val)) {
return TYPE_FIXNUM;
@@ -125,12 +129,6 @@ static ALWAYS_INLINE bool LISP_TYPEP(LispVal *val, LispValType type) {
} \
struct __ignored
DEFOBJTYPE(String, STRING, STRINGP, {
size_t length;
char *data;
bool owned;
});
DEFOBJTYPE(Symbol, SYMBOL, SYMBOLP, {
LispVal *name; // string
LispVal *function;
@@ -143,22 +141,33 @@ DEFOBJTYPE(Vector, VECTOR, VECTORP, {
LispVal **data;
});
#define DECLARE_SYMBOL(cname) \
extern const char *Q##cname##_name; \
// Defined here instead of in function.h so that headers don't have to include
// it just to define functions
#define DECLARE_SYMBOL(cname) \
extern const char *internal_Q##cname##_name; \
extern const size_t internal_Q##cname##_name_len; \
extern LispVal *Q##cname
#define DECLARE_FUNCTION(cname, cargs) \
DECLARE_SYMBOL(cname); \
extern const char F##cname_name; \
#define DECLARE_FUNCTION(cname, cargs) \
DECLARE_SYMBOL(cname); \
extern const char *internal_F##cname##_argstr; \
extern const size_t internal_F##cname##_argstr_len; \
extern const char *internal_F##cname##_docstr; \
extern const size_t internal_F##cname##_docstr_len; \
LispVal *F##cname cargs
#define DEFINE_SYMBOL(cname, lisp_name) \
const char *Q##cname##_name = lisp_name; \
#define DEFINE_SYMBOL(cname, lisp_name) \
const char *internal_Q##cname##_name = lisp_name; \
const size_t internal_Q##cname##_name_len = sizeof(lisp_name) - 1; \
LispVal *Q##cname
#define DEFUN(cname, lisp_name, cargs, lisp_args, doc) \
DEFINE_SYMBOL(cname, lisp_name); \
LispVal *Q##cname; \
#define DEFUN(cname, lisp_name, cargs, lisp_args, doc) \
DEFINE_SYMBOL(cname, lisp_name); \
const char *internal_F##cname##_argstr = lisp_args; \
const size_t internal_F##cname##_argstr_len = sizeof(lisp_args) - 1; \
const char *internal_F##cname##_docstr = doc; \
const size_t internal_F##cname##_docstr_len = sizeof(doc) - 1; \
LispVal *Q##cname; \
LispVal *F##cname cargs
DECLARE_SYMBOL(nil);
@@ -169,13 +178,19 @@ static ALWAYS_INLINE bool NILP(LispVal *val) {
return val == Qnil;
}
// Some core functions
DECLARE_FUNCTION(id, (LispVal * obj));
DECLARE_FUNCTION(eq, (LispVal * obj1, LispVal *obj2));
// TODO probably move these to another file
LispVal *make_lisp_string(const char *data, size_t length, bool take,
bool copy);
LispVal *make_vector(LispVal **data, size_t length, bool take);
#define LISP_LITSTR(litstr) \
(make_lisp_string(litstr, sizeof(litstr) - 1, false, false))
DECLARE_FUNCTION(make_symbol, (LispVal * name));
DECLARE_FUNCTION(intern, (LispVal * name));
// TODO these are actually special-forms
DECLARE_SYMBOL(quote);
DECLARE_SYMBOL(backquote);
DECLARE_SYMBOL(comma);
DECLARE_SYMBOL(comma_at);
#endif