Title: [270283] trunk/Source/_javascript_Core
Revision
270283
Author
ysuz...@apple.com
Date
2020-11-30 20:47:41 -0800 (Mon, 30 Nov 2020)

Log Message

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):

Modified Paths

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));
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to