diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2021-04-01 13:24:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-01 07:24:30 -0400 |
commit | 6eace4de5c825c42ac4efd0d9b912c4911664a6a (patch) | |
tree | ebc2e59c4c67e62125179517345a2f379da9e6dc /core/core.js | |
parent | f8aff8edcdb7330a8cc397e2af2ec445533ce970 (diff) |
perf(core): js errors as unions vs tuples to reduce allocs (#9947)
Diffstat (limited to 'core/core.js')
-rw-r--r-- | core/core.js | 24 |
1 files changed, 14 insertions, 10 deletions
diff --git a/core/core.js b/core/core.js index 7c39c1bae..f94ec8139 100644 --- a/core/core.js +++ b/core/core.js @@ -44,18 +44,23 @@ } function processResponse(res) { - // const [ok, err] = res; - if (res[1] === null) { - return res[0]; + if (!isErr(res)) { + return res; } - throw processErr(res[1]); + throw processErr(res); + } + + // .$err_class_name is a special key that should only exist on errors + function isErr(res) { + return !!(res && res.$err_class_name); } function processErr(err) { - const [ErrorClass, args] = getErrorClassAndArgs(err.className); + const className = err.$err_class_name; + const [ErrorClass, args] = getErrorClassAndArgs(className); if (!ErrorClass) { return new Error( - `Unregistered error class: "${err.className}"\n ${err.message}\n Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`, + `Unregistered error class: "${className}"\n ${err.message}\n Classes of errors returned from ops should be registered via Deno.core.registerErrorClass().`, ); } return new ErrorClass(err.message, ...args); @@ -82,13 +87,12 @@ } function opAsyncHandler(promiseId, res) { - // const [ok, err] = res; const promise = promiseTable.get(promiseId); promiseTable.delete(promiseId); - if (!res[1]) { - promise.resolve(res[0]); + if (!isErr(res)) { + promise.resolve(res); } else { - promise.reject(processErr(res[1])); + promise.reject(processErr(res)); } } |