Global generation
This commit is contained in:
+35
-20
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user