JSInternalPromise* loadModule(ExecState* exec, const SourceCode& source) { JSLockHolder lock(exec); RELEASE_ASSERT(exec->vm().atomicStringTable() == wtfThreadData().atomicStringTable()); RELEASE_ASSERT(!exec->vm().isCollectorBusy()); Symbol* key = createSymbolForEntryPointModule(exec->vm()); JSGlobalObject* globalObject = exec->vmEntryGlobalObject(); // Insert the given source code to the ModuleLoader registry as the fetched registry entry. globalObject->moduleLoader()->provide(exec, key, ModuleLoaderObject::Status::Fetch, source.view().toString()); if (exec->hadException()) return rejectPromise(exec, globalObject); return loadModule(lock, exec, globalObject, key, jsUndefined()); }
JSInternalPromise* loadAndEvaluateModule(ExecState* exec, const SourceCode& source, JSValue scriptFetcher) { VM& vm = exec->vm(); JSLockHolder lock(vm); auto scope = DECLARE_THROW_SCOPE(vm); RELEASE_ASSERT(vm.atomicStringTable() == wtfThreadData().atomicStringTable()); RELEASE_ASSERT(!vm.isCollectorBusyOnCurrentThread()); Symbol* key = createSymbolForEntryPointModule(vm); JSGlobalObject* globalObject = exec->vmEntryGlobalObject(); // Insert the given source code to the ModuleLoader registry as the fetched registry entry. globalObject->moduleLoader()->provide(exec, key, JSModuleLoader::Status::Fetch, source); RETURN_IF_EXCEPTION(scope, rejectPromise(exec, globalObject)); return loadAndEvaluateModule(lock, exec, globalObject, key, jsUndefined(), scriptFetcher); }
void evaluateModule(ExecState* exec, const SourceCode& source, NakedPtr<Exception>& returnedException) { JSLockHolder lock(exec); RELEASE_ASSERT(exec->vm().atomicStringTable() == wtfThreadData().atomicStringTable()); RELEASE_ASSERT(!exec->vm().isCollectorBusy()); CodeProfiling profile(source); JSGlobalObject* globalObject = exec->vmEntryGlobalObject(); // Generate the unique key for the source-provided module. PrivateName privateName(PrivateName::Description, "EntryPointModule"); Symbol* key = Symbol::create(exec->vm(), *privateName.uid()); ModuleLoaderObject* moduleLoader = globalObject->moduleLoader(); // Insert the given source code to the ModuleLoader registry as the fetched registry entry. moduleLoader->provide(exec, key, ModuleLoaderObject::Status::Fetch, source.toString()); if (exec->hadException()) { returnedException = exec->exception(); exec->clearException(); return; } // FIXME: Now, we don't implement the linking phase yet. // So here, we just call requestInstantiateAll to only perform the module loading. // At last, it should be replaced with requestReady. // https://bugs.webkit.org/show_bug.cgi?id=148172 moduleLoader->requestInstantiateAll(exec, key); // FIXME: We should also handle the asynchronous Syntax Errors that will be delivered by the rejected promise. // https://bugs.webkit.org/show_bug.cgi?id=148173 if (exec->hadException()) { returnedException = exec->exception(); exec->clearException(); return; } }
JSInternalPromise* evaluateModule(ExecState* exec, const SourceCode& source) { JSLockHolder lock(exec); RELEASE_ASSERT(exec->vm().atomicStringTable() == wtfThreadData().atomicStringTable()); RELEASE_ASSERT(!exec->vm().isCollectorBusy()); JSGlobalObject* globalObject = exec->vmEntryGlobalObject(); // Generate the unique key for the source-provided module. PrivateName privateName(PrivateName::Description, "EntryPointModule"); Symbol* key = Symbol::create(exec->vm(), *privateName.uid()); // Insert the given source code to the ModuleLoader registry as the fetched registry entry. globalObject->moduleLoader()->provide(exec, key, ModuleLoaderObject::Status::Fetch, source.toString()); if (exec->hadException()) { JSValue exception = exec->exception()->value(); exec->clearException(); JSInternalPromiseDeferred* deferred = JSInternalPromiseDeferred::create(exec, globalObject); deferred->reject(exec, exception); return deferred->promise(); } return evaluateModule(lock, exec, globalObject, key, jsUndefined()); }