diff --git a/eval.c b/eval.c index 8e36896..aaa2d98 100644 --- a/eval.c +++ b/eval.c @@ -449,6 +449,10 @@ extern List *eval(List *list0, Binding *binding0, int flags) { char *error = checkexecutable(name); if (error != NULL) fail("$&whatis", "%s: %s", name, error); + if (funcname != NULL) { + Term *fn = mkstr(funcname); + list = mklist(fn, list->next); + } list = forkexec(name, list, flags & eval_inchild); RefPop(name); goto done; @@ -463,6 +467,8 @@ extern List *eval(List *list0, Binding *binding0, int flags) { goto done; } + if (fn != NULL) + funcname = getstr(list->term); list = append(fn, list->next); goto restart; diff --git a/test/testrun.c b/test/testrun.c index 68b4fe9..32e5124 100644 --- a/test/testrun.c +++ b/test/testrun.c @@ -29,5 +29,8 @@ int main(int argc, char **argv) { return print0(); case 's': return dosleep(); + case 'a': + printf("%s\n", argv[0]); + return 0; } } diff --git a/test/tests/trip.es b/test/tests/trip.es index 8dccc0d..69dc473 100644 --- a/test/tests/trip.es +++ b/test/tests/trip.es @@ -236,6 +236,15 @@ test 'exit with signal codes' { 'die from a thrown signal even if we would ignore it externally' } +test '$0 assignment' { + local (path = .) + assert {~ `{testrun a} 'testrun'} '$0 from hacked path is ok' + local (fn %pathsearch bin {result ./testrun a}) + assert {~ `testrun 'testrun'} '$0 from hacked pathsearch is ok' + let (fn-testrun = ./testrun) + assert {~ `{testrun a} 'testrun'} '$0 from function is ok' +} + test 'backslash' { assert {~ `` \n {echo h\ i} 'h i'}