aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-08-23 15:46:00 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-08-23 15:46:00 +0000
commit38f18aa6d418515e42b688fa9b3e4f3ab61bb89e (patch)
tree3859e7778e44814cdb00f2693dd5778d0e0cb88e
parent4a053bfdfd85915a2a659a337bd171bc22c49138 (diff)
* New primop: abort "error message".
-rw-r--r--src/libexpr/eval.cc4
-rw-r--r--src/libexpr/nixexpr.hh1
-rw-r--r--src/libexpr/primops.cc8
-rw-r--r--tests/lang/eval-fail-abort.nix1
4 files changed, 12 insertions, 2 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index ce38e2ab9..c4f5d7f5d 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -515,7 +515,7 @@ Expr evalExpr2(EvalState & state, Expr e)
try {
return concatStrings(state, args);
} catch (Error & e) {
- e.addPrefix(format("in a string concatenation: "));
+ e.addPrefix(format("in a string concatenation:\n"));
throw;
}
}
@@ -527,7 +527,7 @@ Expr evalExpr2(EvalState & state, Expr e)
ATermList l2 = evalList(state, e2);
return makeList(ATconcat(l1, l2));
} catch (Error & e) {
- e.addPrefix(format("in a list concatenation: "));
+ e.addPrefix(format("in a list concatenation:\n"));
throw;
}
}
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index 28ac35e60..3eb4d4cb2 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -11,6 +11,7 @@
MakeError(EvalError, Error)
MakeError(AssertionError, EvalError)
+MakeError(Abort, EvalError)
MakeError(TypeError, EvalError)
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index bc4db2d81..2bc5459d1 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -629,6 +629,13 @@ static Expr primDependencyClosure(EvalState & state, const ATermVector & args)
}
+static Expr primAbort(EvalState & state, const ATermVector & args)
+{
+ throw Abort(format("evaluation aborted with the following error message: %1%") %
+ evalString(state, args[0]));
+}
+
+
/* Apply a function to every element of a list. */
static Expr primMap(EvalState & state, const ATermVector & args)
{
@@ -700,6 +707,7 @@ void EvalState::addPrimOps()
addPrimOp("toString", 1, primToString);
addPrimOp("isNull", 1, primIsNull);
addPrimOp("dependencyClosure", 1, primDependencyClosure);
+ addPrimOp("abort", 1, primAbort);
addPrimOp("map", 2, primMap);
addPrimOp("removeAttrs", 2, primRemoveAttrs);
diff --git a/tests/lang/eval-fail-abort.nix b/tests/lang/eval-fail-abort.nix
new file mode 100644
index 000000000..75c51bceb
--- /dev/null
+++ b/tests/lang/eval-fail-abort.nix
@@ -0,0 +1 @@
+if true then abort "this should fail" else 1