diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2022-02-22 20:41:56 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2022-02-22 20:41:56 +0000 |
commit | ae6471f1c94f51df540d95edc09c7749002f44e8 (patch) | |
tree | d810e349ef9926b256d73b0af5b2497a0d355555 /eval.c | |
parent | e8e6feeb95cdc3b81a2c17b5a342a3d0b170ccb4 (diff) |
Implement some form of error guards. It may not be perfect yet
Diffstat (limited to 'eval.c')
-rw-r--r-- | eval.c | 15 |
1 files changed, 13 insertions, 2 deletions
@@ -131,8 +131,19 @@ retry: if(!stmt->errorguard){ if(stmt->toks[0]->array->intdata[0] == 1) return eval(stmt->guard, toplevel); - }else - print("Not registering error guard for error codes: %S\n", ppdatum(stmt->toks[0])); + }else{ + ErrorGuard *eg = newerrorguard(stmt->toks[0]->array, stmt->guard); + if(setjmp(eg->jmp)){ + eg->active = 0; + + /* Replace the old dfnframe with the one in eg->frame */ + ThreadData *td = getthreaddata(); + DfnFrame *old = td->currentdfn; + td->currentdfn = eg->frame; + freedfnframe(old, 1); + return eval(eg->guard, toplevel); + } + } } } if(stmt->next && !stop) |