summaryrefslogtreecommitdiff
path: root/eval.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-21 15:18:22 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-21 15:18:22 +0000
commit40c021d964bc60d2b60dd78022e180c964ea1b67 (patch)
treeaee97fdfef0378c94871579b8bc12cbdca583553 /eval.c
parent1ddd7de5b15f52c13a5c084445253655a94bd970 (diff)
Implement better error handling, but still no error guards
Diffstat (limited to 'eval.c')
-rw-r--r--eval.c49
1 files changed, 17 insertions, 32 deletions
diff --git a/eval.c b/eval.c
index e794a38..bfe211e 100644
--- a/eval.c
+++ b/eval.c
@@ -6,7 +6,6 @@
#define traceprint if(traceeval)print
-Rune *errormsg;
int traceeval;
typedef Datum (*evalfn)(Datum, Datum);
@@ -54,16 +53,9 @@ evalfn evalfns[11][11] = {
Datum *
eval(Statement *stmt, int toplevel)
{
- errormsg = nil;
-
/* start by looking up first variable if needed */
- if(stmt->ntoks > 0 && stmt->toks[stmt->ntoks-1].tag == NameTag){
- Datum *value = lookup(stmt->toks[stmt->ntoks-1]);
- if(value == nil)
- return nil;
- else
- stmt->toks[stmt->ntoks-1] = *value;
- }
+ if(stmt->ntoks > 0 && stmt->toks[stmt->ntoks-1].tag == NameTag)
+ stmt->toks[stmt->ntoks-1] = *lookup(stmt->toks[stmt->ntoks-1]);;
while(stmt->ntoks > 1){
int maxlevel = 0;
@@ -82,13 +74,8 @@ retry:
}
if(level == 0 && stmt->toks[offset-1].tag == NameTag){
- Datum *value = lookup(stmt->toks[offset-1]);
- if(value == nil)
- return nil;
- else{
- stmt->toks[offset-1] = *value;
- goto retry;
- }
+ stmt->toks[offset-1] = *lookup(stmt->toks[offset-1]);
+ goto retry;
}else if(level < maxlevel){
Datum left = stmt->toks[offset];
Datum right = stmt->toks[offset+1];
@@ -98,10 +85,9 @@ retry:
}else if(level > maxlevel)
maxlevel = level;
}
- if(maxlevel == 0){
- errormsg = L"No reduce rule. Syntax error.";
- return nil;
- }else{
+ if(maxlevel == 0)
+ throwerror(L"No reduce rule", EParse);
+ else{
Datum new = fn(stmt->toks[offset],stmt->toks[offset+1]);
traceprint("handler fn done\n");
if(stmt->toks[offset].tag == ArrayTag)
@@ -135,12 +121,13 @@ retry:
guardOK = 0;
else if(stmt->toks[0].array->intdata[0] != 0 && stmt->toks[0].array->intdata[0] != 1)
guardOK = 0;
- if(!guardOK){
- print("Guard expected single valued boolean\n");
- exits(nil);
+ if(!guardOK)
+ throwerror(L"Guard expected single valued boolean", EDomain);
+ else{
+ stop = 0;
+ if(stmt->toks[0].array->intdata[0] == 1)
+ return eval(stmt->guard, toplevel);
}
- if(stmt->toks[0].array->intdata[0] == 1)
- return eval(stmt->guard, toplevel);
}
if(stmt->next && !stop)
return eval(stmt->next, toplevel);
@@ -156,8 +143,8 @@ lookup(Datum var)
traceprint("VAR LOOKUP %S\n", var.symbol->name);
if(var.symbol->undefined){
- errormsg = runesmprint("Variable undefined: %S\n", var.symbol->name);
- return nil;
+ Rune *msg = runesmprint("Undefined name: %S", var.symbol->name);
+ throwerror(msg, EValue);
}
Datum *val;
@@ -240,10 +227,8 @@ assign(Datum left, Datum right)
{
if(left.symbol->setfn != nil){
int ok = left.symbol->setfn(right);
- if(!ok){
- print("Assignment failed\n");
- exits(nil);
- }
+ if(!ok)
+ throwerror(nil, ESyntax);
}else{
if(left.symbol->undefined == 0 && left.symbol->value.tag == ArrayTag)
freearray(left.symbol->value.array);