Diff
Modified: trunk/Source/_javascript_Core/ChangeLog (270282 => 270283)
--- trunk/Source/_javascript_Core/ChangeLog 2020-12-01 03:59:26 UTC (rev 270282)
+++ trunk/Source/_javascript_Core/ChangeLog 2020-12-01 04:47:41 UTC (rev 270283)
@@ -1,3 +1,23 @@
+2020-11-30 Yusuke Suzuki <ysuz...@apple.com>
+
+ Making module entry promise-like by setting "then"
+ https://bugs.webkit.org/show_bug.cgi?id=216695
+
+ Reviewed by Saam Barati.
+
+ Setting then: @undefined to make entry promise-like.
+ We also optimize @InternalPromise.internalAll a bit.
+
+ * builtins/InternalPromiseConstructor.js:
+ (internalAll.newResolveElement):
+ (internalAll):
+ * builtins/ModuleLoader.js:
+ (globalPrivate.newRegistryEntry):
+ (requestImportModule):
+ (async requestImportModule): Deleted.
+ * builtins/PromiseOperations.js:
+ (globalPrivate.fulfillPromiseWithFirstResolvingFunctionCallCheck):
+
2020-11-30 Sergey Rubanov <chi...@gmail.com>
Add support for the Wasm i64 sign-extension-ops proposal
Modified: trunk/Source/_javascript_Core/builtins/InternalPromiseConstructor.js (270282 => 270283)
--- trunk/Source/_javascript_Core/builtins/InternalPromiseConstructor.js 2020-12-01 03:59:26 UTC (rev 270282)
+++ trunk/Source/_javascript_Core/builtins/InternalPromiseConstructor.js 2020-12-01 04:47:41 UTC (rev 270283)
@@ -36,7 +36,11 @@
"use strict";
- var promiseCapability = @newPromiseCapability(@InternalPromise);
+ var constructor = @InternalPromise;
+ var promise = @createPromise(constructor, /* isInternalPromise */ true);
+ var reject = (reason) => {
+ return @rejectPromiseWithFirstResolvingFunctionCallCheck(promise, reason);
+ };
var values = [];
var index = 0;
@@ -55,7 +59,7 @@
--remainingElementsCount;
if (remainingElementsCount === 0)
- return promiseCapability.@resolve.@call(@undefined, values);
+ return @fulfillPromiseWithFirstResolvingFunctionCallCheck(promise, values);
return @undefined;
}
@@ -63,24 +67,18 @@
try {
if (array.length === 0)
- promiseCapability.@resolve.@call(@undefined, values);
+ @fulfillPromiseWithFirstResolvingFunctionCallCheck(promise, values);
else {
for (var index = 0, length = array.length; index < length; ++index) {
var value = array[index];
@putByValDirect(values, index, @undefined);
-
- var nextPromiseCapability = @newPromiseCapability(@InternalPromise);
- nextPromiseCapability.@resolve.@call(@undefined, value);
- var nextPromise = nextPromiseCapability.@promise;
-
- var resolveElement = newResolveElement(index);
++remainingElementsCount;
- nextPromise.then(resolveElement, promiseCapability.@reject);
+ @resolveWithoutPromise(value, newResolveElement(index), reject);
}
}
} catch (error) {
- promiseCapability.@reject.@call(@undefined, error);
+ reject(error);
}
- return promiseCapability.@promise;
+ return promise;
}
Modified: trunk/Source/_javascript_Core/builtins/ModuleLoader.js (270282 => 270283)
--- trunk/Source/_javascript_Core/builtins/ModuleLoader.js 2020-12-01 03:59:26 UTC (rev 270282)
+++ trunk/Source/_javascript_Core/builtins/ModuleLoader.js 2020-12-01 04:47:41 UTC (rev 270283)
@@ -99,6 +99,7 @@
linkError: @undefined,
linkSucceeded: true,
evaluated: false,
+ then: @undefined,
};
}
@@ -363,13 +364,25 @@
return await this.linkAndEvaluateModule(key, fetcher);
}
-async function requestImportModule(key, parameters, fetcher)
+function requestImportModule(key, parameters, fetcher)
{
"use strict";
- var entry = await this.requestSatisfy(this.ensureRegistered(key), parameters, fetcher, new @Set);
- this.linkAndEvaluateModule(entry.key, fetcher);
- return this.getModuleNamespaceObject(entry.module);
+ var constructor = @InternalPromise;
+ var promise = @createPromise(constructor, /* isInternalPromise */ true);
+ @resolveWithoutPromise(this.requestSatisfy(this.ensureRegistered(key), parameters, fetcher, new @Set),
+ (entry) => {
+ try {
+ this.linkAndEvaluateModule(entry.key, fetcher);
+ @fulfillPromiseWithFirstResolvingFunctionCallCheck(promise, this.getModuleNamespaceObject(entry.module));
+ } catch (error) {
+ @rejectPromiseWithFirstResolvingFunctionCallCheck(promise, error);
+ }
+ },
+ (reason) => {
+ @rejectPromiseWithFirstResolvingFunctionCallCheck(promise, reason);
+ });
+ return promise;
}
function dependencyKeysIfEvaluated(key)
Modified: trunk/Source/_javascript_Core/builtins/PromiseOperations.js (270282 => 270283)
--- trunk/Source/_javascript_Core/builtins/PromiseOperations.js 2020-12-01 03:59:26 UTC (rev 270282)
+++ trunk/Source/_javascript_Core/builtins/PromiseOperations.js 2020-12-01 04:47:41 UTC (rev 270283)
@@ -237,6 +237,17 @@
}
@globalPrivate
+function fulfillPromiseWithFirstResolvingFunctionCallCheck(promise, value)
+{
+ @assert(@isPromise(promise));
+ var flags = @getPromiseInternalField(promise, @promiseFieldFlags);
+ if (flags & @promiseFlagsIsFirstResolvingFunctionCalled)
+ return;
+ @putPromiseInternalField(promise, @promiseFieldFlags, flags | @promiseFlagsIsFirstResolvingFunctionCalled);
+ return @fulfillPromise(promise, value);
+}
+
+@globalPrivate
function rejectPromiseWithFirstResolvingFunctionCallCheck(promise, reason)
{
@assert(@isPromise(promise));