diff options
Diffstat (limited to 'apl9.h')
-rw-r--r-- | apl9.h | 26 |
1 files changed, 15 insertions, 11 deletions
@@ -68,7 +68,7 @@ typedef struct Datum Datum; typedef struct Symbol Symbol; typedef struct Symtab Symtab; typedef struct QuadnameDef QuadnameDef; -typedef struct ErrorHandler ErrorHandler; +typedef struct ErrorGuard ErrorGuard; typedef struct DfnFrame DfnFrame; typedef struct ThreadData ThreadData; typedef struct Mail Mail; @@ -208,10 +208,14 @@ struct QuadnameDef opdyad dyadop; }; -struct ErrorHandler +struct ErrorGuard { - Rune *msg; + u64int code; /* a bitmask of errors */ + int active; /* can the guard be used? */ jmp_buf jmp; + Statement *guard; + DfnFrame *frame; /* the frame to replace with upon activation of error guard */ + ErrorGuard *next; }; struct DfnFrame @@ -222,6 +226,7 @@ struct DfnFrame Array *right; Datum *lefto; Datum *righto; + ErrorGuard *errorguards; /* a linked list of error handlers */ DfnFrame *prev; /* prev in the call stack */ DfnFrame *chain; /* prev in the lexical scope */ }; @@ -232,6 +237,8 @@ struct ThreadData DfnFrame *currentdfn; Mail *mail; Mail *lastmail; + int lasterror; + Rune *lasterrormsg; QLock lock; Rendez empty; }; @@ -284,6 +291,8 @@ Symbol *getsym(Rune *, int); void initsymtab(void); DfnFrame *getcurrentdfn(void); DfnFrame *pushdfnframe(Rune *, DfnFrame *, Datum *, Datum *, Array *, Array *); +DfnFrame *dupdfnframe(DfnFrame *); +void freedfnframe(DfnFrame *, int); void popdfnframe(void); vlong globalIO(void); void globalIOset(vlong); @@ -306,6 +315,8 @@ void freeoperator(Operator); void freestatement(Statement); Function dupfunction(Function); Operator dupoperator(Operator); +void freeerrorguards(ErrorGuard *); +void freeerrorguard(ErrorGuard *); /* functions.c */ Array *runfunc(Function, Array *,Array *); @@ -317,14 +328,8 @@ void initquadnames(void); Datum *quadnamedatum(QuadnameDef); /* error.c */ +ErrorGuard *newerrorguard(Array *, Statement *); void throwerror(Rune *, int); -#define SETUPERROR(e) {\ - jmp_buf old;\ - memcpy(old, globalerror.jmp, sizeof(jmp_buf));\ - e = setjmp(globalerror.jmp);\ - if(e != 0)\ - memcpy(globalerror.jmp, old, sizeof(jmp_buf));\ -} /* inverse.c */ Function inverse(Function); @@ -474,7 +479,6 @@ extern int arrayalloccounts; /* memory.c */ extern int datumalloccounts; /* memory.c */ extern QuadnameDef quadnames[]; /* quadnames.c */ extern int printprecision; /* print.c */ -extern ErrorHandler globalerror; /* error.c */ extern Rune *errorstrs[]; /* error.c */ extern int needsnewline; /* quadnames.c */ extern int mainstacksize; /* concurrency.c */
\ No newline at end of file |