feat(core): cleaner opcall stack traces (#12358)

This commit is contained in:
Aaron O'Mullan 2021-10-07 18:39:27 +02:00 committed by GitHub
parent ab2e0a465e
commit 370c27e09a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 17 additions and 7 deletions

View file

@ -1,4 +1,9 @@
import { assertStringIncludes, unitTest, unreachable } from "./test_util.ts";
import {
assert,
assertStringIncludes,
unitTest,
unreachable,
} from "./test_util.ts";
unitTest(async function sendAsyncStackTrace() {
const buf = new Uint8Array(10);
@ -11,6 +16,10 @@ unitTest(async function sendAsyncStackTrace() {
console.log(s);
assertStringIncludes(s, "opcall_test.ts");
assertStringIncludes(s, "read");
assert(
!s.includes("deno:core"),
"opcall stack traces should NOT include deno:core internals such as unwrapOpResult",
);
}
});

View file

@ -12,6 +12,7 @@
Map,
Array,
ArrayPrototypeFill,
ErrorCaptureStackTrace,
Promise,
ObjectFreeze,
ObjectFromEntries,
@ -113,12 +114,12 @@
if (res?.$err_class_name) {
const className = res.$err_class_name;
const errorBuilder = errorMap[className];
if (!errorBuilder) {
throw new Error(
`Unregistered error class: "${className}"\n ${res.message}\n Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`,
);
}
throw errorBuilder(res.message);
const err = errorBuilder ? errorBuilder(res.message) : new Error(
`Unregistered error class: "${className}"\n ${res.message}\n Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`,
);
// Strip unwrapOpResult() and errorBuilder() calls from stack trace
ErrorCaptureStackTrace(err, unwrapOpResult);
throw err;
}
return res;
}