summaryrefslogtreecommitdiff
path: root/apl9.h
diff options
context:
space:
mode:
Diffstat (limited to 'apl9.h')
-rw-r--r--apl9.h26
1 files changed, 15 insertions, 11 deletions
diff --git a/apl9.h b/apl9.h
index d115ea3..88135c6 100644
--- a/apl9.h
+++ b/apl9.h
@@ -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