From fd3f483368ec3c52e00260ae2941b6c0552473cf Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Wed, 11 May 2022 10:21:28 +0000 Subject: Fix more bugs --- error.c | 2 +- eval.c | 2 +- functions.c | 2 +- lexer.c | 2 ++ memory.c | 5 +++++ 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/error.c b/error.c index e12318a..e1a0120 100644 --- a/error.c +++ b/error.c @@ -37,7 +37,7 @@ throwerror(Rune *msg, int err) td->lasterror = err; if(td->lasterrormsg) free(td->lasterrormsg); - td->lasterrormsg = runestrdup(msg); + td->lasterrormsg = msg ? runestrdup(msg) : nil; while(frame != nil){ for(ErrorGuard *eg = frame->errorguards; eg != nil; eg = eg->next){ diff --git a/eval.c b/eval.c index cfe5854..cd9b95a 100644 --- a/eval.c +++ b/eval.c @@ -384,7 +384,7 @@ train(Datum *left, Datum *right) result->func.type = FunctypeTrain; result->func.left = nil; if(left->func.type == FunctypeTrain) - result->func = left->func; + result->func = dupfunction(left->func); else{ result->func.train.nfuncs = 1; result->func.train.funcs = emalloc(sizeof(Function)); diff --git a/functions.c b/functions.c index f73ff29..2e95316 100644 --- a/functions.c +++ b/functions.c @@ -1404,7 +1404,7 @@ fnDrop(Array *left, Array *right) if(GetSize(left) > GetRank(right)) throwerror(nil, ELength); else if(GetSize(left) == GetRank(right)) - left = fnSame(left); + left = duparray(left); else{ Array *old = left; left = allocarray(AtypeInt, 1, GetRank(right)); diff --git a/lexer.c b/lexer.c index 9ce251a..1a6fd0f 100644 --- a/lexer.c +++ b/lexer.c @@ -84,6 +84,8 @@ lexline(InputStream *input, int toplevel) case L'⍝': while(peek != '\n' && !inputEOF(input)) peek = getrune(input); + if(stmt->ntoks == 0) + continue; goto end; case L'⍬': stmt->toks[stmt->ntoks] = allocdatum(ArrayTag, 0); diff --git a/memory.c b/memory.c index 806d5df..bdec236 100644 --- a/memory.c +++ b/memory.c @@ -243,6 +243,11 @@ dupfunction(Function f) break; case FunctypeHybrid: break; + case FunctypeTrain: + g.train.funcs = emalloc(sizeof(Function) * g.train.nfuncs); + for(int i = 0; i < g.train.nfuncs; i++) + g.train.funcs[i] = dupfunction(f.train.funcs[i]); + break; default: print("Missing case in dupfunction: %d\n", f.type); threadexitsall("dupfunction"); -- cgit v1.2.3