rewrite error handling module in scheme
This commit is contained in:
@@ -18,6 +18,7 @@
|
||||
/* #define PIC_USE_WRITE 1 */
|
||||
/* #define PIC_USE_EVAL 1 */
|
||||
/* #define PIC_USE_FILE 1 */
|
||||
/* #define PIC_USE_ERROR 1 */
|
||||
|
||||
/**
|
||||
* I/O configuration
|
||||
|
||||
+4
-34
@@ -59,7 +59,8 @@ typedef struct {
|
||||
*/
|
||||
|
||||
typedef void *(*pic_allocf)(void *userdata, void *ptr, size_t n);
|
||||
pic_state *pic_open(pic_allocf f, void *userdata);
|
||||
typedef void (*pic_panicf)(pic_state *, const char *msg, int n, pic_value *args);
|
||||
pic_state *pic_open(pic_allocf allocf, void *userdata, pic_panicf panicf);
|
||||
void pic_close(pic_state *);
|
||||
|
||||
|
||||
@@ -291,39 +292,6 @@ pic_value pic_fmemopen(pic_state *, const char *buf, int len, const char *mode);
|
||||
int pic_fgetbuf(pic_state *, pic_value port, const char **buf, int *len); /* deprecated */
|
||||
|
||||
|
||||
/*
|
||||
* error handling
|
||||
*/
|
||||
|
||||
typedef void (*pic_panicf)(pic_state *, const char *msg);
|
||||
pic_panicf pic_atpanic(pic_state *, pic_panicf f);
|
||||
PIC_NORETURN void pic_panic(pic_state *, const char *msg);
|
||||
pic_value pic_raise_continuable(pic_state *pic, pic_value err);
|
||||
PIC_NORETURN void pic_raise(pic_state *, pic_value v);
|
||||
PIC_NORETURN void pic_error(pic_state *, const char *msg, int n, ...);
|
||||
|
||||
#define pic_try pic_try_(PIC_GENSYM(jmp))
|
||||
#define pic_try_(jmp) \
|
||||
do { \
|
||||
extern PIC_JMPBUF *pic_prepare_try(pic_state *); \
|
||||
extern void pic_enter_try(pic_state *); \
|
||||
extern void pic_exit_try(pic_state *); \
|
||||
extern pic_value pic_abort_try(pic_state *); \
|
||||
PIC_JMPBUF *jmp = pic_prepare_try(pic); \
|
||||
if (PIC_SETJMP(*jmp) == 0) { \
|
||||
pic_enter_try(pic);
|
||||
#define pic_catch(e) pic_catch_(e, PIC_GENSYM(label))
|
||||
#define pic_catch_(e, label) \
|
||||
pic_exit_try(pic); \
|
||||
} else { \
|
||||
e = pic_abort_try(pic); \
|
||||
goto label; \
|
||||
} \
|
||||
} while (0); \
|
||||
if (0) \
|
||||
label:
|
||||
|
||||
|
||||
/*
|
||||
* core language features
|
||||
*/
|
||||
@@ -338,6 +306,8 @@ void pic_defvar(pic_state *, const char *name, pic_value v);
|
||||
pic_value pic_funcall(pic_state *, const char *name, int n, ...);
|
||||
pic_value pic_values(pic_state *, int n, ...);
|
||||
pic_value pic_vvalues(pic_state *, int n, va_list);
|
||||
PIC_NORETURN void pic_error(pic_state *, const char *msg, int n, ...);
|
||||
PIC_NORETURN void pic_verror(pic_state *pic, const char *msg, int n, va_list ap);
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -11,12 +11,36 @@ extern "C" {
|
||||
|
||||
#if PIC_USE_LIBC
|
||||
void *pic_default_allocf(void *, void *, size_t);
|
||||
void pic_default_panicf(pic_state *, const char *, int, pic_value *);
|
||||
#endif
|
||||
|
||||
#if PIC_USE_FILE
|
||||
pic_value pic_fopen(pic_state *, FILE *, const char *mode);
|
||||
#endif
|
||||
|
||||
#if PIC_USE_ERROR
|
||||
# define pic_try pic_try_(PIC_GENSYM(jmp))
|
||||
# define pic_try_(jmp) \
|
||||
do { \
|
||||
extern PIC_JMPBUF *pic_prepare_try(pic_state *); \
|
||||
extern void pic_enter_try(pic_state *); \
|
||||
extern void pic_exit_try(pic_state *); \
|
||||
extern pic_value pic_abort_try(pic_state *); \
|
||||
PIC_JMPBUF *jmp = pic_prepare_try(pic); \
|
||||
if (PIC_SETJMP(*jmp) == 0) { \
|
||||
pic_enter_try(pic);
|
||||
# define pic_catch(e) pic_catch_(e, PIC_GENSYM(label))
|
||||
# define pic_catch_(e, label) \
|
||||
pic_exit_try(pic); \
|
||||
} else { \
|
||||
e = pic_abort_try(pic); \
|
||||
goto label; \
|
||||
} \
|
||||
} while (0); \
|
||||
if (0) \
|
||||
label:
|
||||
#endif
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -28,12 +28,19 @@
|
||||
# define PIC_USE_FILE 1
|
||||
#endif
|
||||
|
||||
#ifndef PIC_USE_ERROR
|
||||
# define PIC_USE_ERROR 1
|
||||
#endif
|
||||
|
||||
#if !PIC_USE_LIBC && PIC_USE_FILE
|
||||
# error PIC_USE_FILE requires PIC_USE_LIBC
|
||||
#endif
|
||||
#if !PIC_USE_LIBC && PIC_USE_CALLCC
|
||||
# error PIC_USE_CALLCC requires PIC_USE_LIBC
|
||||
#endif
|
||||
#if !PIC_USE_CALLCC && PIC_USE_ERROR
|
||||
# error PIC_USE_ERROR requires PIC_USE_CALLCC
|
||||
#endif
|
||||
|
||||
#if PIC_USE_CALLCC
|
||||
# include <setjmp.h>
|
||||
|
||||
@@ -31,7 +31,6 @@ enum {
|
||||
PIC_TYPE_RECORD = 23,
|
||||
PIC_TYPE_ATTR = 24,
|
||||
PIC_TYPE_PORT = 25,
|
||||
PIC_TYPE_ERROR = 26,
|
||||
PIC_TYPE_IREP = 27,
|
||||
PIC_TYPE_FRAME = 28,
|
||||
PIC_TYPE_PROC_FUNC = 29,
|
||||
@@ -222,7 +221,6 @@ DEFPRED(pic_false_p, PIC_TYPE_FALSE)
|
||||
DEFPRED(pic_str_p, PIC_TYPE_STRING)
|
||||
DEFPRED(pic_vec_p, PIC_TYPE_VECTOR)
|
||||
DEFPRED(pic_blob_p, PIC_TYPE_BLOB)
|
||||
DEFPRED(pic_error_p, PIC_TYPE_ERROR)
|
||||
DEFPRED(pic_dict_p, PIC_TYPE_DICT)
|
||||
DEFPRED(pic_attr_p, PIC_TYPE_ATTR)
|
||||
DEFPRED(pic_rec_p, PIC_TYPE_RECORD)
|
||||
|
||||
Reference in New Issue
Block a user