summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--error.c2
-rw-r--r--eval.c2
-rw-r--r--functions.c2
-rw-r--r--lexer.c2
-rw-r--r--memory.c5
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");