diff options
author | Divy Srivastava <dj.srivastava23@gmail.com> | 2022-10-27 07:58:27 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-10-27 16:58:27 +0200 |
commit | 115cc1e6ae00cfd9283c1549060892e0c00dcbc4 (patch) | |
tree | 695d3d5715439796c48780df49039f1803d6aae3 /core/01_core.js | |
parent | 02187966c108fd50354c8de57bab443a5b262373 (diff) |
Revert "perf(core): generate inlined wrappers for async ops (#16428)" (#16443)
Diffstat (limited to 'core/01_core.js')
-rw-r--r-- | core/01_core.js | 88 |
1 files changed, 22 insertions, 66 deletions
diff --git a/core/01_core.js b/core/01_core.js index 5df11c382..7bee019d9 100644 --- a/core/01_core.js +++ b/core/01_core.js @@ -28,7 +28,7 @@ SymbolFor, setQueueMicrotask, } = window.__bootstrap.primordials; - const { ops } = window.Deno.core; + const ops = window.Deno.core.ops; const errorMap = {}; // Builtin v8 / JS errors @@ -159,63 +159,21 @@ return res; } - function rollPromiseId() { - return nextPromiseId++; - } - - // Generate async op wrappers. See core/bindings.rs - function initializeAsyncOps() { - function genAsyncOp(op, name, args) { - return new Function( - "setPromise", - "getPromise", - "promiseIdSymbol", - "rollPromiseId", - "handleOpCallTracing", - "op", - "unwrapOpResult", - "PromisePrototypeThen", - ` - return function ${name}(${args}) { - const id = rollPromiseId(); - let promise = PromisePrototypeThen(setPromise(id), unwrapOpResult); - try { - op(id, ${args}); - } catch (err) { - // Cleanup the just-created promise - getPromise(id); - // Rethrow the error - throw err; - } - handleOpCallTracing("${name}", id, promise); - promise[promiseIdSymbol] = id; - return promise; - } - `, - )( - setPromise, - getPromise, - promiseIdSymbol, - rollPromiseId, - handleOpCallTracing, - op, - unwrapOpResult, - PromisePrototypeThen, - ); - } - - // { <name>: <argc>, ... } - for (const ele of Object.entries(ops.asyncOpsInfo())) { - if (!ele) continue; - const [name, argc] = ele; - const op = ops[name]; - const args = Array.from({ length: argc }, (_, i) => `arg${i}`).join(", "); - ops[name] = genAsyncOp(op, name, args); + function opAsync(opName, ...args) { + const promiseId = nextPromiseId++; + let p = setPromise(promiseId); + try { + ops[opName](promiseId, ...args); + } catch (err) { + // Cleanup the just-created promise + getPromise(promiseId); + // Rethrow the error + throw err; } - } - - function handleOpCallTracing(opName, promiseId, p) { + p = PromisePrototypeThen(p, unwrapOpResult); if (opCallTracingEnabled) { + // Capture a stack trace by creating a new `Error` object. We remove the + // first 6 characters (the `Error\n` prefix) to get just the stack trace. const stack = StringPrototypeSlice(new Error().stack, 6); MapPrototypeSet(opCallTraces, promiseId, { opName, stack }); p = PromisePrototypeFinally( @@ -223,10 +181,9 @@ () => MapPrototypeDelete(opCallTraces, promiseId), ); } - } - - function opAsync(opName, ...args) { - return ops[opName](...args); + // Save the id on the promise so it can later be ref'ed or unref'ed + p[promiseIdSymbol] = promiseId; + return p; } function refOp(promiseId) { @@ -346,7 +303,6 @@ // Extra Deno.core.* exports const core = ObjectAssign(globalThis.Deno.core, { opAsync, - initializeAsyncOps, resources, metrics, registerErrorBuilder, @@ -366,11 +322,11 @@ setPromiseHooks, close: (rid) => ops.op_close(rid), tryClose: (rid) => ops.op_try_close(rid), - read: (rid, buffer) => ops.op_read(rid, buffer), - readAll: (rid) => ops.op_read_all(rid), - write: (rid, buffer) => ops.op_write(rid, buffer), - writeAll: (rid, buffer) => ops.op_write_all(rid, buffer), - shutdown: (rid) => ops.op_shutdown(rid), + read: opAsync.bind(null, "op_read"), + readAll: opAsync.bind(null, "op_read_all"), + write: opAsync.bind(null, "op_write"), + writeAll: opAsync.bind(null, "op_write_all"), + shutdown: opAsync.bind(null, "op_shutdown"), print: (msg, isErr) => ops.op_print(msg, isErr), setMacrotaskCallback: (fn) => ops.op_set_macrotask_callback(fn), setNextTickCallback: (fn) => ops.op_set_next_tick_callback(fn), |