From c594fceeb627c5b3f8adf90f46762e1b0b410405 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 23 Jul 2023 01:26:38 +0700 Subject: [PATCH] add ticks for empty resources --- CHANGELOG.md | 1 + .../internals/add-disposable-resource.js | 23 ++++++++++++++----- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 084996c9ce8f..273aa800b57b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ - Moved back into [the initial proposal](https://github.com/tc39/proposal-explicit-resource-management) -> moved to stage 3, [proposal-explicit-resource-management/154](https://github.com/tc39/proposal-explicit-resource-management/pull/154) - Added `/actual/` namespace entries, disabled forced replacement - Ignore return value of `[@@dispose]()` method when hint is `async-dispose`, [proposal-explicit-resource-management/180](https://github.com/tc39/proposal-explicit-resource-management/pull/180) + - Added ticks for empty resources, [proposal-explicit-resource-management/163](https://github.com/tc39/proposal-explicit-resource-management/pull/163) - Added some methods from [`Float16Array` stage 3 proposal](https://github.com/tc39/proposal-float16array): - There are some reason why I don't want to add `Float16Array` right now, however, make sense to add some methods from this proposal. - Methods: diff --git a/packages/core-js/internals/add-disposable-resource.js b/packages/core-js/internals/add-disposable-resource.js index 2e9899b8baee..a1a732bf6567 100644 --- a/packages/core-js/internals/add-disposable-resource.js +++ b/packages/core-js/internals/add-disposable-resource.js @@ -3,6 +3,7 @@ var call = require('../internals/function-call'); var uncurryThis = require('../internals/function-uncurry-this'); var bind = require('../internals/function-bind-context'); var anObject = require('../internals/an-object'); +var aCallable = require('../internals/a-callable'); var isNullOrUndefined = require('../internals/is-null-or-undefined'); var getMethod = require('../internals/get-method'); var wellKnownSymbol = require('../internals/well-known-symbol'); @@ -12,8 +13,10 @@ var DISPOSE = wellKnownSymbol('dispose'); var push = uncurryThis([].push); +// `GetDisposeMethod` abstract operation +// https://tc39.es/proposal-explicit-resource-management/#sec-getdisposemethod var getDisposeMethod = function (V, hint) { - if (hint == 'async-dispose') { + if (hint === 'async-dispose') { var method = getMethod(V, ASYNC_DISPOSE); if (method !== undefined) return method; method = getMethod(V, DISPOSE); @@ -26,16 +29,24 @@ var getDisposeMethod = function (V, hint) { // `CreateDisposableResource` abstract operation // https://tc39.es/proposal-explicit-resource-management/#sec-createdisposableresource var createDisposableResource = function (V, hint, method) { - return bind(method || getDisposeMethod(V, hint), V); + if (arguments.length < 3 && !isNullOrUndefined(V)) { + method = aCallable(getDisposeMethod(anObject(V), hint)); + } + + return method === undefined ? function () { + return undefined; + } : bind(method, V); }; // `AddDisposableResource` abstract operation -// https://tc39.es/proposal-explicit-resource-management/#sec-adddisposableresource-disposable-v-hint-disposemethod +// https://tc39.es/proposal-explicit-resource-management/#sec-adddisposableresource module.exports = function (disposable, V, hint, method) { var resource; - if (!method) { - if (isNullOrUndefined(V)) return; - resource = createDisposableResource(anObject(V), hint); + if (arguments.length < 4) { + // When `V`` is either `null` or `undefined` and hint is `async-dispose`, + // we record that the resource was evaluated to ensure we will still perform an `Await` when resources are later disposed. + if (isNullOrUndefined(V) && hint === 'sync-dispose') return; + resource = createDisposableResource(V, hint); } else { resource = createDisposableResource(undefined, hint, method); }