Exceptions!!!

This commit is contained in:
2026-09-02 01:54:14 -07:00
parent 17c11d90ea
commit 07060a17fe
13 changed files with 396 additions and 60 deletions
+34
View File
@@ -256,6 +256,8 @@ DEFOBJTYPE(Vector, VECTOR, VECTORP, {
extern const char *internal_F##cname##_docstr; \
extern const size_t internal_F##cname##_docstr_len; \
LispVal *F##cname cargs
#define MAKE_CONDITION_CLASS(cname) \
extern LispVal **internal_Q##cname##_parent_condition_class
#define DEFINE_SYMBOL(cname, lisp_name) \
const char *internal_Q##cname##_name = lisp_name; \
@@ -279,6 +281,8 @@ DEFOBJTYPE(Vector, VECTOR, VECTORP, {
LispVal *F##cname cargs
#define DEFSPECIAL(cname, lisp_name, cargs, lisp_args, doc) \
DEFUN(cname, lisp_name, cargs, lisp_args, doc)
#define DEFINE_CONDITION_CLASS(cname, parent_cname) \
LispVal **internal_Q##cname##_parent_condition_class = &Q##parent_cname
#define REGISTER_GLOBAL_SYMBOL(cname) \
{ \
@@ -309,6 +313,11 @@ DEFOBJTYPE(Vector, VECTOR, VECTORP, {
((LispFunction *) ((LispSymbol *) Q##cname)->function) \
->impl.native.no_eval_args = true; \
}
#define REGISTER_GLOBAL_CONDITION_CLASS(cname) \
{ \
Fput(Q##cname, Qcondition_class, \
*internal_Q##cname##_parent_condition_class); \
}
DECLARE_SYMBOL(nil);
DECLARE_SYMBOL(t);
@@ -384,12 +393,37 @@ static ALWAYS_INLINE void SET_SYMBOL_VALUE(LispVal *sym, LispVal *value) {
*s->value.native = value;
break;
}
MARK_OBJECT_ADDED(value, sym);
}
// needed for conditions
DECLARE_SYMBOL(fixnum);
DECLARE_SYMBOL(float);
// cons declared in list.h
DECLARE_SYMBOL(string);
DECLARE_SYMBOL(symbol);
DECLARE_SYMBOL(vector);
DECLARE_SYMBOL(hash_table);
DECLARE_SYMBOL(function);
LispVal *symbol_for_type(LispValType type);
// condition stuff
DECLARE_SYMBOL(condition_class);
DECLARE_FUNCTION(condition_class_p, (LispVal * val));
DECLARE_FUNCTION(condition_subclass_p, (LispVal * child, LispVal *parent));
DECLARE_FUNCTION(condition_printer, (LispVal * val));
DECLARE_SYMBOL(kw_success);
DECLARE_FUNCTION(signal, (LispVal * name, LispVal *data));
DECLARE_FUNCTION(condition_case,
(LispVal * var, LispVal *form, LispVal *handlers));
DECLARE_FUNCTION(error, (LispVal * data));
MAKE_CONDITION_CLASS(error);
DECLARE_SYMBOL(type_error);
MAKE_CONDITION_CLASS(type_error);
// Defined in lisp code (eventually) but used in read.c
DECLARE_SYMBOL(backquote);