mirror of
https://github.com/zebrajr/node.git
synced 2025-12-06 12:20:27 +01:00
async_hooks: refactor to avoid unsafe array iteration
PR-URL: https://github.com/nodejs/node/pull/37125 Reviewed-By: Zijian Liu <lxxyxzj@gmail.com> Reviewed-By: Darshan Sen <raisinten@gmail.com>
This commit is contained in:
parent
814f97186f
commit
f8853dd8cc
|
|
@ -89,7 +89,7 @@ class AsyncHook {
|
|||
// enable()/disable() are run during their execution. The following
|
||||
// references are reassigned to the tmp arrays if a hook is currently being
|
||||
// processed.
|
||||
const [hooks_array, hook_fields] = getHookArrays();
|
||||
const { 0: hooks_array, 1: hook_fields } = getHookArrays();
|
||||
|
||||
// Each hook is only allowed to be added once.
|
||||
if (ArrayPrototypeIncludes(hooks_array, this))
|
||||
|
|
@ -118,7 +118,7 @@ class AsyncHook {
|
|||
}
|
||||
|
||||
disable() {
|
||||
const [hooks_array, hook_fields] = getHookArrays();
|
||||
const { 0: hooks_array, 1: hook_fields } = getHookArrays();
|
||||
|
||||
const index = ArrayPrototypeIndexOf(hooks_array, this);
|
||||
if (index === -1)
|
||||
|
|
@ -195,8 +195,7 @@ class AsyncResource {
|
|||
emitBefore(asyncId, this[trigger_async_id_symbol], this);
|
||||
|
||||
try {
|
||||
const ret = thisArg === undefined ?
|
||||
fn(...args) :
|
||||
const ret =
|
||||
ReflectApply(fn, thisArg, args);
|
||||
|
||||
return ret;
|
||||
|
|
@ -308,7 +307,7 @@ class AsyncLocalStorage {
|
|||
run(store, callback, ...args) {
|
||||
// Avoid creation of an AsyncResource if store is already active
|
||||
if (ObjectIs(store, this.getStore())) {
|
||||
return callback(...args);
|
||||
return ReflectApply(callback, null, args);
|
||||
}
|
||||
const resource = new AsyncResource('AsyncLocalStorage',
|
||||
defaultAlsResourceOpts);
|
||||
|
|
@ -316,17 +315,17 @@ class AsyncLocalStorage {
|
|||
// It is ok because emitDestroy only schedules calling the hook
|
||||
return resource.emitDestroy().runInAsyncScope(() => {
|
||||
this.enterWith(store);
|
||||
return callback(...args);
|
||||
return ReflectApply(callback, null, args);
|
||||
});
|
||||
}
|
||||
|
||||
exit(callback, ...args) {
|
||||
if (!this.enabled) {
|
||||
return callback(...args);
|
||||
return ReflectApply(callback, null, args);
|
||||
}
|
||||
this.disable();
|
||||
try {
|
||||
return callback(...args);
|
||||
return ReflectApply(callback, null, args);
|
||||
} finally {
|
||||
this._enable();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -421,14 +421,14 @@ function clearDefaultTriggerAsyncId() {
|
|||
|
||||
function defaultTriggerAsyncIdScope(triggerAsyncId, block, ...args) {
|
||||
if (triggerAsyncId === undefined)
|
||||
return block(...args);
|
||||
return ReflectApply(block, null, args);
|
||||
// CHECK(NumberIsSafeInteger(triggerAsyncId))
|
||||
// CHECK(triggerAsyncId > 0)
|
||||
const oldDefaultTriggerAsyncId = async_id_fields[kDefaultTriggerAsyncId];
|
||||
async_id_fields[kDefaultTriggerAsyncId] = triggerAsyncId;
|
||||
|
||||
try {
|
||||
return block(...args);
|
||||
return ReflectApply(block, null, args);
|
||||
} finally {
|
||||
async_id_fields[kDefaultTriggerAsyncId] = oldDefaultTriggerAsyncId;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user