Ignore:
Timestamp:
Jan 21, 2021, 6:51:26 PM (4 years ago)
Author:
[email protected]
Message:

[JSC] JSPromise should not propagate TerminatedExecutionError
https://bugs.webkit.org/show_bug.cgi?id=220820
<rdar://problem/72929399>

Reviewed by Mark Lam.

JSTests:

  • stress/terminated-execution-error-in-promise.js: Added.

(let.x.get toString):
(import.x.then):

Source/JavaScriptCore:

TerminatedExecutionError is uncatcheable exception to finish JS execution as soon as possible.
We should not propagate TerminatedExecutionError in JSPromise's rejection.
In this patch, we do not reject promise if exception is TerminatedExecutionError.

  • API/JSAPIGlobalObject.mm:

(JSC::JSAPIGlobalObject::moduleLoaderImportModule):
(JSC::JSAPIGlobalObject::moduleLoaderFetch):

  • API/JSContext.mm:

(-[JSContext evaluateJSScript:]):

  • jsc.cpp:

(GlobalObject::moduleLoaderImportModule):
(GlobalObject::moduleLoaderFetch):
(runWithOptions):

  • runtime/Completion.cpp:

(JSC::rejectPromise):
(JSC::loadAndEvaluateModule):
(JSC::loadModule):

  • runtime/JSGlobalObjectFunctions.cpp:

(JSC::JSC_DEFINE_HOST_FUNCTION):

  • runtime/JSModuleLoader.cpp:

(JSC::reject):
(JSC::JSModuleLoader::importModule):
(JSC::JSModuleLoader::resolve):
(JSC::JSModuleLoader::fetch):
(JSC::JSC_DEFINE_HOST_FUNCTION):

  • wasm/js/JSWebAssembly.cpp:

(JSC::reject):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/runtime/JSGlobalObjectFunctions.cpp

    r271568 r271731  
    800800
    801801    auto catchScope = DECLARE_CATCH_SCOPE(vm);
    802     auto reject = [&] (JSValue rejectionReason) {
     802
     803    auto reject = [&](Exception* exception) {
     804        if (UNLIKELY(isTerminatedExecutionException(vm, exception)))
     805            return promise;
     806        JSValue error = exception->value();
    803807        catchScope.clearException();
    804         promise->reject(globalObject, rejectionReason);
    805         catchScope.clearException();
    806         return JSValue::encode(promise);
     808        promise->reject(globalObject, error);
     809        return promise;
    807810    };
    808811
     
    811814    auto* specifier = callFrame->uncheckedArgument(0).toString(globalObject);
    812815    if (Exception* exception = catchScope.exception())
    813         return reject(exception->value());
     816        return JSValue::encode(reject(exception));
    814817
    815818    // We always specify parameters as undefined. Once dynamic import() starts accepting fetching parameters,
     
    818821    auto* internalPromise = globalObject->moduleLoader()->importModule(globalObject, specifier, parameters, sourceOrigin);
    819822    if (Exception* exception = catchScope.exception())
    820         return reject(exception->value());
     823        return JSValue::encode(reject(exception));
     824
    821825    promise->resolve(globalObject, internalPromise);
    822 
    823     catchScope.clearException();
    824826    return JSValue::encode(promise);
    825827}
Note: See TracChangeset for help on using the changeset viewer.