summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cli/tests/integration/run_tests.rs6
-rw-r--r--cli/tests/testdata/error_cause_recursive_tail.ts5
-rw-r--r--cli/tests/testdata/error_cause_recursive_tail.ts.out12
-rw-r--r--core/error.rs6
4 files changed, 26 insertions, 3 deletions
diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs
index f9daa7aa7..004acb469 100644
--- a/cli/tests/integration/run_tests.rs
+++ b/cli/tests/integration/run_tests.rs
@@ -3374,6 +3374,12 @@ itest!(error_cause {
exit_code: 1,
});
+itest!(error_cause_recursive_tail {
+ args: "run error_cause_recursive_tail.ts",
+ output: "error_cause_recursive_tail.ts.out",
+ exit_code: 1,
+});
+
itest!(error_cause_recursive {
args: "run run/error_cause_recursive.ts",
output: "run/error_cause_recursive.ts.out",
diff --git a/cli/tests/testdata/error_cause_recursive_tail.ts b/cli/tests/testdata/error_cause_recursive_tail.ts
new file mode 100644
index 000000000..51e7fa6d9
--- /dev/null
+++ b/cli/tests/testdata/error_cause_recursive_tail.ts
@@ -0,0 +1,5 @@
+const foo = new Error("foo");
+const bar = new Error("bar", { cause: foo });
+const baz = new Error("baz", { cause: bar });
+foo.cause = bar;
+throw baz;
diff --git a/cli/tests/testdata/error_cause_recursive_tail.ts.out b/cli/tests/testdata/error_cause_recursive_tail.ts.out
new file mode 100644
index 000000000..6aaecdb80
--- /dev/null
+++ b/cli/tests/testdata/error_cause_recursive_tail.ts.out
@@ -0,0 +1,12 @@
+[WILDCARD]
+error: Uncaught Error: baz
+const baz = new Error("baz", { cause: bar });
+ ^
+ at file:///[WILDCARD]/error_cause_recursive_tail.ts:3:13
+Caused by: Error: bar
+ at file:///[WILDCARD]/error_cause_recursive_tail.ts:2:13
+Caused by: Error: foo
+ at file:///[WILDCARD]/error_cause_recursive_tail.ts:1:13
+Caused by: Error: bar
+ at file:///[WILDCARD]/error_cause_recursive_tail.ts:2:13
+[WILDCARD]
diff --git a/core/error.rs b/core/error.rs
index 7af6ad375..626f9b6f2 100644
--- a/core/error.rs
+++ b/core/error.rs
@@ -209,7 +209,7 @@ impl JsError {
fn inner_from_v8_exception<'a>(
scope: &'a mut v8::HandleScope,
exception: v8::Local<'a, v8::Value>,
- mut seen: HashSet<v8::Local<'a, v8::Value>>,
+ mut seen: HashSet<v8::Local<'a, v8::Object>>,
) -> Self {
// Create a new HandleScope because we're creating a lot of new local
// handles below.
@@ -254,10 +254,10 @@ impl JsError {
}
});
let cause = cause.and_then(|cause| {
- if cause.is_undefined() || seen.contains(&cause) {
+ if cause.is_undefined() || seen.contains(&exception) {
None
} else {
- seen.insert(cause);
+ seen.insert(exception);
Some(Box::new(JsError::inner_from_v8_exception(
scope, cause, seen,
)))