Exceptions!!!
This commit is contained in:
+34
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user