diff options
-rw-r--r-- | Cargo.lock | 12 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | ext/web/01_dom_exception.js | 65 | ||||
-rw-r--r-- | tests/testdata/run/eval_context_throw_dom_exception.js.out | 3 | ||||
-rw-r--r-- | tests/unit/dom_exception_test.ts | 8 |
5 files changed, 33 insertions, 57 deletions
diff --git a/Cargo.lock b/Cargo.lock index 7be41f3b9..18a9ed6cd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1303,9 +1303,9 @@ dependencies = [ [[package]] name = "deno_core" -version = "0.283.0" +version = "0.284.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f5043f9f636a3fe021e63e41c946499e1706d7565126065c60912fe5c77e54e" +checksum = "f4a5c809e81be26fcfbbce4275573251f6a156137b67059889e9e38f73e75b63" dependencies = [ "anyhow", "bincode", @@ -1753,9 +1753,9 @@ dependencies = [ [[package]] name = "deno_ops" -version = "0.159.0" +version = "0.160.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b26cc5277982de16514282447f8674f9048d4f1b2c0d55c088d0a7d3bf6db385" +checksum = "517e54d41a2da6a69b8f534294334d79d9115ddd43aea88a5ceefdb717e6d85e" dependencies = [ "proc-macro-rules", "proc-macro2", @@ -5754,9 +5754,9 @@ dependencies = [ [[package]] name = "serde_v8" -version = "0.192.0" +version = "0.193.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b616df6c4ff5643dd503cbfe119175ebebfd4132512e33de4971f1e91d5739" +checksum = "21ec612dfc7ab70330b5405e8015b25e637bbfe1d79c4bd173557933aea66e76" dependencies = [ "num-bigint", "serde", diff --git a/Cargo.toml b/Cargo.toml index 4088950d3..464dc9798 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -44,7 +44,7 @@ repository = "https://github.com/denoland/deno" [workspace.dependencies] deno_ast = { version = "=0.38.2", features = ["transpiling"] } -deno_core = { version = "0.283.0" } +deno_core = { version = "0.284.0" } deno_bench_util = { version = "0.148.0", path = "./bench_util" } deno_lockfile = "0.20.0" diff --git a/ext/web/01_dom_exception.js b/ext/web/01_dom_exception.js index 82e8f867f..f49337db5 100644 --- a/ext/web/01_dom_exception.js +++ b/ext/web/01_dom_exception.js @@ -9,12 +9,12 @@ import { primordials } from "ext:core/mod.js"; const { - ArrayPrototypeSlice, - Error, ErrorPrototype, + ErrorCaptureStackTrace, ObjectDefineProperty, ObjectCreate, ObjectEntries, + ObjectHasOwn, ObjectPrototypeIsPrototypeOf, ObjectSetPrototypeOf, Symbol, @@ -27,7 +27,6 @@ import { createFilteredInspectProxy } from "ext:deno_console/01_console.js"; const _name = Symbol("name"); const _message = Symbol("message"); const _code = Symbol("code"); -const _error = Symbol("error"); // Defined in WebIDL 4.3. // https://webidl.spec.whatwg.org/#idl-DOMException @@ -113,8 +112,7 @@ class DOMException { this[_code] = code; this[webidl.brand] = webidl.brand; - this[_error] = new Error(message); - this[_error].name = "DOMException"; + ErrorCaptureStackTrace(this, DOMException); } get message() { @@ -133,50 +131,27 @@ class DOMException { } [SymbolFor("Deno.privateCustomInspect")](inspect, inspectOptions) { - if (ObjectPrototypeIsPrototypeOf(DOMExceptionPrototype, this)) { - return this[_error].stack; - } else { - return inspect( - createFilteredInspectProxy({ - object: this, - evaluate: false, - keys: [ - "message", - "name", - "code", - ], - }), - inspectOptions, - ); + if (ObjectHasOwn(this, "stack")) { + const stack = this.stack; + if (typeof stack === "string") { + return stack; + } } + return inspect( + createFilteredInspectProxy({ + object: this, + evaluate: ObjectPrototypeIsPrototypeOf(DOMExceptionPrototype, this), + keys: [ + "message", + "name", + "code", + ], + }), + inspectOptions, + ); } } -ObjectDefineProperty(DOMException.prototype, "stack", { - get() { - return this[_error].stack; - }, - set(value) { - this[_error].stack = value; - }, - configurable: true, -}); - -// `DOMException` isn't a native error, so `Error.prepareStackTrace()` is -// not called when accessing `.stack`, meaning our structured stack trace -// hack doesn't apply. This patches it in. -ObjectDefineProperty(DOMException.prototype, "__callSiteEvals", { - get() { - // Call the stack getter so `__callSiteEvals` get populated. - this[_error].stack; - // To be extra sure, use an empty array if `__callSiteEvals` is still not there, - // eg. if the user overrides `Error.prepareStackTrace`. - const callSiteEvals = this[_error].__callSiteEvals ?? []; - return ArrayPrototypeSlice(callSiteEvals, 1); - }, - configurable: true, -}); - ObjectSetPrototypeOf(DOMException.prototype, ErrorPrototype); webidl.configureInterface(DOMException); diff --git a/tests/testdata/run/eval_context_throw_dom_exception.js.out b/tests/testdata/run/eval_context_throw_dom_exception.js.out index 39f5a8174..24ea0cffc 100644 --- a/tests/testdata/run/eval_context_throw_dom_exception.js.out +++ b/tests/testdata/run/eval_context_throw_dom_exception.js.out @@ -1,6 +1,5 @@ { - thrown: DOMException: foo - at new DOMException (ext:deno_web/01_dom_exception.js:[WILDCARD]) + thrown: Error: foo at [WILDCARD] at Object.evalContext (ext:core/01_core.js:[WILDCARD]) at file:///[WILDCARD]/eval_context_throw_dom_exception.js:1:48, diff --git a/tests/unit/dom_exception_test.ts b/tests/unit/dom_exception_test.ts index 806248caa..4e894f5fc 100644 --- a/tests/unit/dom_exception_test.ts +++ b/tests/unit/dom_exception_test.ts @@ -23,8 +23,10 @@ Deno.test(function nameToCodeMappingPrototypeAccess() { Reflect.deleteProperty(objectPrototype, "pollution"); }); -Deno.test(function callSitesEvalsDoesntThrow() { +Deno.test(function hasStackAccessor() { const e2 = new DOMException("asdf"); - // @ts-ignore no types for `__callSiteEvals` but it's observable. - assert(Array.isArray(e2.__callSiteEvals)); + const desc = Object.getOwnPropertyDescriptor(e2, "stack"); + assert(desc); + assert(typeof desc.get === "function"); + assert(typeof desc.set === "function"); }); |