Changeset 273225 in webkit
- Timestamp:
- Feb 21, 2021 4:41:30 PM (17 months ago)
- Location:
- trunk
- Files:
-
- 48 edited
-
JSTests/ChangeLog (modified) (1 diff)
-
JSTests/test262/config.yaml (modified) (2 diffs)
-
Source/JavaScriptCore/API/JSAPIGlobalObject.h (modified) (1 diff)
-
Source/JavaScriptCore/API/JSAPIGlobalObject.mm (modified) (2 diffs)
-
Source/JavaScriptCore/ChangeLog (modified) (1 diff)
-
Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj (modified) (11 diffs)
-
Source/JavaScriptCore/builtins/ModuleLoader.js (modified) (5 diffs)
-
Source/JavaScriptCore/bytecode/BytecodeGeneratorification.cpp (modified) (3 diffs)
-
Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp (modified) (3 diffs)
-
Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h (modified) (2 diffs)
-
Source/JavaScriptCore/bytecode/BytecodeList.rb (modified) (1 diff)
-
Source/JavaScriptCore/bytecode/BytecodeUseDef.cpp (modified) (1 diff)
-
Source/JavaScriptCore/bytecode/UnlinkedModuleProgramCodeBlock.h (modified) (1 diff)
-
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp (modified) (13 diffs)
-
Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h (modified) (2 diffs)
-
Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp (modified) (5 diffs)
-
Source/JavaScriptCore/interpreter/Interpreter.cpp (modified) (6 diffs)
-
Source/JavaScriptCore/interpreter/Interpreter.h (modified) (1 diff)
-
Source/JavaScriptCore/parser/ASTBuilder.h (modified) (2 diffs)
-
Source/JavaScriptCore/parser/Nodes.cpp (modified) (1 diff)
-
Source/JavaScriptCore/parser/Nodes.h (modified) (2 diffs)
-
Source/JavaScriptCore/parser/Parser.cpp (modified) (5 diffs)
-
Source/JavaScriptCore/parser/ParserModes.h (modified) (1 diff)
-
Source/JavaScriptCore/parser/ParserTokens.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/AbstractModuleRecord.cpp (modified) (4 diffs)
-
Source/JavaScriptCore/runtime/AbstractModuleRecord.h (modified) (4 diffs)
-
Source/JavaScriptCore/runtime/JSAsyncGenerator.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/JSGenerator.h (modified) (6 diffs)
-
Source/JavaScriptCore/runtime/JSGlobalObject.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/JSModuleLoader.cpp (modified) (4 diffs)
-
Source/JavaScriptCore/runtime/JSModuleLoader.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/JSModuleRecord.cpp (modified) (4 diffs)
-
Source/JavaScriptCore/runtime/JSModuleRecord.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/ModuleProgramExecutable.h (modified) (1 diff)
-
Source/JavaScriptCore/runtime/OptionsList.h (modified) (3 diffs)
-
Source/JavaScriptCore/runtime/SymbolTable.cpp (modified) (2 diffs)
-
Source/JavaScriptCore/runtime/SymbolTable.h (modified) (1 diff)
-
Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.cpp (modified) (1 diff)
-
Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.h (modified) (2 diffs)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/bindings/js/JSDOMGlobalObject.cpp (modified) (1 diff)
-
Source/WebCore/bindings/js/JSDOMGlobalObject.h (modified) (1 diff)
-
Source/WebCore/bindings/js/ScriptController.cpp (modified) (3 diffs)
-
Source/WebCore/bindings/js/ScriptController.h (modified) (1 diff)
-
Source/WebCore/bindings/js/ScriptModuleLoader.cpp (modified) (2 diffs)
-
Source/WebCore/bindings/js/ScriptModuleLoader.h (modified) (1 diff)
-
Source/WebCore/workers/WorkerOrWorkletScriptController.cpp (modified) (1 diff)
-
Source/WebCore/workers/WorkerOrWorkletScriptController.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/JSTests/ChangeLog
r273218 r273225 1 2021-02-21 Keith Miller <keith_miller@apple.com> 2 3 Implement the Top-level await proposal 4 https://bugs.webkit.org/show_bug.cgi?id=202484 5 6 Reviewed by Yusuke Suzuki. 7 8 * test262/config.yaml: 9 1 10 2021-02-21 Yusuke Suzuki <ysuzuki@apple.com> 2 11 -
trunk/JSTests/test262/config.yaml
r273218 r273225 15 15 TypedArray.prototype.at: useAtMethod 16 16 String.prototype.at: useAtMethod 17 top-level-await: useTopLevelAwait 17 18 skip: 18 19 features: … … 27 28 # FIXME: https://bugs.webkit.org/show_bug.cgi?id=222142 28 29 - regexp-match-indices 29 30 - top-level-await31 30 paths: 32 31 files: -
trunk/Source/JavaScriptCore/API/JSAPIGlobalObject.h
r264617 r273225 66 66 static JSInternalPromise* moduleLoaderFetch(JSGlobalObject*, JSModuleLoader*, JSValue, JSValue, JSValue); 67 67 static JSObject* moduleLoaderCreateImportMetaProperties(JSGlobalObject*, JSModuleLoader*, JSValue, JSModuleRecord*, JSValue); 68 static JSValue moduleLoaderEvaluate(JSGlobalObject*, JSModuleLoader*, JSValue, JSValue, JSValue );68 static JSValue moduleLoaderEvaluate(JSGlobalObject*, JSModuleLoader*, JSValue, JSValue, JSValue, JSValue, JSValue); 69 69 70 70 JSValue loadAndEvaluateJSScriptModule(const JSLockHolder&, JSScript *); -
trunk/Source/JavaScriptCore/API/JSAPIGlobalObject.mm
r271766 r273225 240 240 } 241 241 242 JSValue JSAPIGlobalObject::moduleLoaderEvaluate(JSGlobalObject* globalObject, JSModuleLoader* moduleLoader, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher )242 JSValue JSAPIGlobalObject::moduleLoaderEvaluate(JSGlobalObject* globalObject, JSModuleLoader* moduleLoader, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher, JSValue sentValue, JSValue resumeMode) 243 243 { 244 244 VM& vm = globalObject->vm(); … … 259 259 260 260 scope.release(); 261 JSValue result = moduleLoader->evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher); 261 // FIXME: We should update the delegate callbacks for async modules. https://bugs.webkit.org/show_bug.cgi?id=222253 262 JSValue result = moduleLoader->evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher, sentValue, resumeMode); 262 263 263 264 if ([moduleLoaderDelegate respondsToSelector:@selector(didEvaluateModule:)]) -
trunk/Source/JavaScriptCore/ChangeLog
r273222 r273225 1 2021-02-21 Keith Miller <keith_miller@apple.com> 2 3 Implement the Top-level await proposal 4 https://bugs.webkit.org/show_bug.cgi?id=202484 5 6 Reviewed by Yusuke Suzuki. 7 8 This patch adds support for the TLA proposal. The bulk of this patch is adding a couple of main parts. 9 10 1) converting the AbstractModuleRecord to contain many of same internal fields as JSGenerator so much of the async codegen can be shared. 11 2) having the link phase of the module loader record whether a module subgraph is async. 12 3) teaching the module loader that evaluating a module may require more than one vm entry and forwarding the awaited value as well as the resume mode to the VM. 13 14 One thing particularly interesting about this patch is that moduleEvaluation now *sometimes* (when a strongly connected subgraph is async) will return a promise. This happened to already be awaited when called from loadAndEvaluateModule (unnecessarily before) but now also needs to be handled by requestImportModule. 15 16 No new tests because every test I came up with was subsumed by tests already in test262. 17 18 * API/JSAPIGlobalObject.h: 19 * API/JSAPIGlobalObject.mm: 20 (JSC::JSAPIGlobalObject::moduleLoaderEvaluate): 21 * JavaScriptCore.xcodeproj/project.pbxproj: 22 * builtins/ModuleLoader.js: 23 (globalPrivate.newRegistryEntry): 24 (link): 25 (async requestImportModule): 26 (moduleEvaluation): Deleted. 27 (requestImportModule): Deleted. 28 * bytecode/BytecodeGeneratorification.cpp: 29 (JSC::BytecodeGeneratorification::run): 30 (JSC::performGeneratorification): 31 * bytecode/BytecodeIntrinsicRegistry.cpp: 32 (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry): 33 * bytecode/BytecodeIntrinsicRegistry.h: 34 * bytecode/BytecodeList.rb: 35 * bytecode/BytecodeUseDef.cpp: 36 (JSC::computeUsesForBytecodeIndexImpl): 37 * bytecode/UnlinkedModuleProgramCodeBlock.h: 38 * bytecompiler/BytecodeGenerator.cpp: 39 (JSC::BytecodeGenerator::generate): 40 (JSC::BytecodeGenerator::BytecodeGenerator): 41 (JSC::BytecodeGenerator::emitWillLeaveCallFrameDebugHook): 42 (JSC::BytecodeGenerator::emitGenericEnumeration): 43 (JSC::BytecodeGenerator::emitYieldPoint): 44 (JSC::BytecodeGenerator::emitYield): 45 (JSC::BytecodeGenerator::emitDelegateYield): 46 (JSC::BytecodeGenerator::emitGeneratorStateChange): 47 * bytecompiler/BytecodeGenerator.h: 48 (JSC::BytecodeGenerator::generatorStateRegister): 49 (JSC::BytecodeGenerator::generatorValueRegister): 50 (JSC::BytecodeGenerator::generatorResumeModeRegister): 51 (JSC::BytecodeGenerator::generatorFrameRegister): 52 * bytecompiler/NodesCodegen.cpp: 53 (JSC::abstractModuleRecordInternalFieldIndex): 54 (JSC::BytecodeIntrinsicNode::emit_intrinsic_getAbstractModuleRecordInternalField): 55 (JSC::FunctionNode::emitBytecode): 56 * interpreter/Interpreter.cpp: 57 (JSC::Interpreter::executeModuleProgram): 58 * interpreter/Interpreter.h: 59 * parser/ASTBuilder.h: 60 (JSC::ASTBuilder::createAwait): 61 (JSC::ASTBuilder::usesAwait): 62 * parser/Nodes.cpp: 63 (JSC::ModuleProgramNode::ModuleProgramNode): 64 * parser/Nodes.h: 65 * parser/Parser.cpp: 66 (JSC::JSToken::dump const): 67 (JSC::Parser<LexerType>::parseForStatement): 68 (JSC::Parser<LexerType>::parseAwaitExpression): 69 (JSC::Parser<LexerType>::parsePrimaryExpression): 70 (JSC::Parser<LexerType>::parseUnaryExpression): 71 * parser/ParserModes.h: 72 * parser/ParserTokens.h: 73 * runtime/AbstractModuleRecord.cpp: 74 (JSC::AbstractModuleRecord::finishCreation): 75 (JSC::AbstractModuleRecord::link): 76 (JSC::AbstractModuleRecord::evaluate): 77 * runtime/AbstractModuleRecord.h: 78 (JSC::AbstractModuleRecord::initialValues): 79 (JSC::AbstractModuleRecord::internalField): 80 (JSC::AbstractModuleRecord::internalField const): 81 * runtime/JSAsyncGenerator.h: 82 * runtime/JSGenerator.h: 83 * runtime/JSGlobalObject.h: 84 * runtime/JSModuleLoader.cpp: 85 (JSC::JSModuleLoader::evaluate): 86 (JSC::JSModuleLoader::evaluateNonVirtual): 87 (JSC::JSC_DEFINE_HOST_FUNCTION): 88 * runtime/JSModuleLoader.h: 89 * runtime/JSModuleRecord.cpp: 90 (JSC::JSModuleRecord::link): 91 (JSC::JSModuleRecord::evaluate): 92 * runtime/JSModuleRecord.h: 93 * runtime/ModuleProgramExecutable.h: 94 * runtime/OptionsList.h: 95 * runtime/SymbolTable.cpp: 96 (JSC::SymbolTable::dump const): 97 * runtime/SymbolTable.h: 98 * wasm/js/WebAssemblyModuleRecord.cpp: 99 (JSC::WebAssemblyModuleRecord::link): 100 (JSC::WebAssemblyModuleRecord::linkImpl): 101 * wasm/js/WebAssemblyModuleRecord.h: 102 1 103 2021-02-21 Yusuke Suzuki <ysuzuki@apple.com> 2 104 -
trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj
r273138 r273225 1847 1847 E34E657520668EAA00FB81AC /* ParseHash.h in Headers */ = {isa = PBXBuildFile; fileRef = E34E657320668E8D00FB81AC /* ParseHash.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1848 1848 E34EDBF71DB5FFC900DC87A5 /* FrameTracers.h in Headers */ = {isa = PBXBuildFile; fileRef = E34EDBF61DB5FFC100DC87A5 /* FrameTracers.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1849 E34F930E2322D882002B8DB4 /* JSGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = E34F930C2322D881002B8DB4 /* JSGenerator.h */; };1849 E34F930E2322D882002B8DB4 /* JSGenerator.h in Headers */ = {isa = PBXBuildFile; fileRef = E34F930C2322D881002B8DB4 /* JSGenerator.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1850 1850 E350708A1DC49BBF0089BCD6 /* DOMJITSignature.h in Headers */ = {isa = PBXBuildFile; fileRef = E35070891DC49BB60089BCD6 /* DOMJITSignature.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1851 1851 E353C11D24AA4CB7003FBDF3 /* IntlDisplayNames.h in Headers */ = {isa = PBXBuildFile; fileRef = E353C11724AA4CB6003FBDF3 /* IntlDisplayNames.h */; }; … … 9098 9098 AD4937C41DDBE6140077C807 /* AbstractModuleRecord.h in Headers */, 9099 9099 0F55F0F514D1063C00AC7649 /* AbstractPC.h in Headers */, 9100 FE912B4F2531193300FABDDF /* AbstractSlotVisitor.h in Headers */, 9101 FE912B5125311AD100FABDDF /* AbstractSlotVisitorInlines.h in Headers */, 9100 9102 534E034E1E4D4B1600213F64 /* AccessCase.h in Headers */, 9101 9103 E3BFD0BC1DAF808E0065DEA2 /* AccessCaseSnippetParams.h in Headers */, … … 9322 9324 E35E89FD25C50F870071EE1E /* BigInt64Array.h in Headers */, 9323 9325 86976E5F1FA3E8BC00E7C4E1 /* BigIntConstructor.h in Headers */, 9324 FE041553252EC0730091EB5D /* SlotVisitorMacros.h in Headers */,9325 9326 866739D213BFDE710023D87C /* BigInteger.h in Headers */, 9326 9327 861816771FB7924200ECC4EC /* BigIntObject.h in Headers */, … … 9604 9605 0FD8A32617D51F5700CA2C40 /* DFGOSREntrypointCreationPhase.h in Headers */, 9605 9606 0FC0976A1468A6F700CF2442 /* DFGOSRExit.h in Headers */, 9606 FE912B4F2531193300FABDDF /* AbstractSlotVisitor.h in Headers */,9607 9607 0F235BEC17178E7300690C7F /* DFGOSRExitBase.h in Headers */, 9608 9608 0FFB921C16D02F110055A5DB /* DFGOSRExitCompilationInfo.h in Headers */, … … 9891 9891 A513E5CB185F9624007E95AD /* InjectedScriptManager.h in Headers */, 9892 9892 A5840E21187B7B8600843B10 /* InjectedScriptModule.h in Headers */, 9893 FE287D02252FB2E800D723F9 /* VerifierSlotVisitor.h in Headers */,9894 9893 A513E5C7185F9446007E95AD /* InjectedScriptSource.h in Headers */, 9895 9894 9959E9321BD18279001AA413 /* inline-and-minify-stylesheets-and-scripts.py in Headers */, … … 10031 10030 840480131021A1D9008E7F01 /* JSAPIValueWrapper.h in Headers */, 10032 10031 C2CF39C216E15A8100DD69BE /* JSAPIWrapperObject.h in Headers */, 10033 FE336B5325DB497D0098F034 /* MarkingConstraintExecutorPair.h in Headers */,10034 10032 BC18C4170E16F5CD00B34460 /* JSArray.h in Headers */, 10035 10033 0F2B66E317B6B5AB00A7AE3F /* JSArrayBuffer.h in Headers */, … … 10068 10066 BC18C41E0E16F5CD00B34460 /* JSContextRef.h in Headers */, 10069 10067 A5EA70EE19F5B5C40098F5EC /* JSContextRefInspectorSupport.h in Headers */, 10070 6BCCEC0425D1FA27000F391D /* VerifierSlotVisitorInlines.h in Headers */,10071 10068 A5D2E665195E174000A518E7 /* JSContextRefInternal.h in Headers */, 10072 10069 148CD1D8108CF902008163C6 /* JSContextRefPrivate.h in Headers */, … … 10200 10197 A7CA3AE817DA41AE006538AF /* JSWeakMap.h in Headers */, 10201 10198 A7482E93116A7CAD003B0712 /* JSWeakObjectMapRefInternal.h in Headers */, 10202 FE912B5125311AD100FABDDF /* AbstractSlotVisitorInlines.h in Headers */,10203 10199 A7482B9311671147003B0712 /* JSWeakObjectMapRefPrivate.h in Headers */, 10204 10200 539BFBB022AD3CDC0023F4C0 /* JSWeakObjectRef.h in Headers */, … … 10278 10274 0F7DF1351E2970DC0095951B /* MarkedSpaceInlines.h in Headers */, 10279 10275 0F660E381E0517BB0031462C /* MarkingConstraint.h in Headers */, 10276 FE336B5325DB497D0098F034 /* MarkingConstraintExecutorPair.h in Headers */, 10280 10277 0F660E3A1E0517C10031462C /* MarkingConstraintSet.h in Headers */, 10281 10278 0F9DAA091FD1C3CF0079C5B2 /* MarkingConstraintSolver.h in Headers */, … … 10474 10471 14BA78F113AAB88F005B7C2C /* SlotVisitor.h in Headers */, 10475 10472 C2160FE715F7E95E00942DFC /* SlotVisitorInlines.h in Headers */, 10473 FE041553252EC0730091EB5D /* SlotVisitorMacros.h in Headers */, 10476 10474 A709F2F017A0AC0400512E98 /* SlowPathCall.h in Headers */, 10477 10475 0F5B4A331C84F0D600F1B17E /* SlowPathReturnType.h in Headers */, … … 10592 10590 0F6C73511AC9F99F00BE1682 /* VariableWriteFireDetail.h in Headers */, 10593 10591 0FE0502D1AA9095600D33B33 /* VarOffset.h in Headers */, 10592 FE287D02252FB2E800D723F9 /* VerifierSlotVisitor.h in Headers */, 10593 6BCCEC0425D1FA27000F391D /* VerifierSlotVisitorInlines.h in Headers */, 10594 10594 0F426A491460CBB700131F8F /* VirtualRegister.h in Headers */, 10595 10595 0F4D8C741FC7A97A001D32AC /* VisitCounter.h in Headers */, -
trunk/Source/JavaScriptCore/builtins/ModuleLoader.js
r270283 r273225 101 101 evaluated: false, 102 102 then: @undefined, 103 isAsync: false, 104 completionPromise: @undefined, 103 105 }; 104 106 } … … 287 289 // we can call moduleDeclarationInstantiation with the correct order 288 290 // without constructing the dependency graph by calling dependencyGraph. 291 var hasAsyncDependency = false; 289 292 var dependencies = entry.dependencies; 290 for (var i = 0, length = dependencies.length; i < length; ++i) 291 this.link(dependencies[i], fetcher); 292 293 this.moduleDeclarationInstantiation(entry.module, fetcher); 293 for (var i = 0, length = dependencies.length; i < length; ++i) { 294 var dependency = dependencies[i]; 295 this.link(dependency, fetcher); 296 hasAsyncDependency ||= dependency.isAsync; 297 } 298 299 entry.isAsync = this.moduleDeclarationInstantiation(entry.module, fetcher) || hasAsyncDependency; 294 300 } catch (error) { 295 301 entry.linkSucceeded = false; … … 304 310 { 305 311 // http://www.ecma-international.org/ecma-262/6.0/#sec-moduleevaluation 306 307 312 "use strict"; 308 313 … … 313 318 // The contents of the [[RequestedModules]] is cloned into entry.dependencies. 314 319 var dependencies = entry.dependencies; 315 for (var i = 0, length = dependencies.length; i < length; ++i) 316 this.moduleEvaluation(dependencies[i], fetcher); 317 318 this.evaluate(entry.key, entry.module, fetcher); 320 321 if (!entry.isAsync) { 322 // Since linking sets isAsync for any strongly connected component with an async module we should only get here if all our dependencies are also sync. 323 for (var i = 0, length = dependencies.length; i < length; ++i) { 324 var dependency = dependencies[i]; 325 @assert(!dependency.isAsync); 326 this.moduleEvaluation(dependency, fetcher); 327 } 328 329 this.evaluate(entry.key, entry.module, fetcher); 330 } else { 331 return (async function asyncModuleEvaluation(entry, dependencies) { 332 for (var i = 0, length = dependencies.length; i < length; ++i) 333 await this.moduleEvaluation(dependencies[i], fetcher); 334 335 var resumeMode = 0; 336 while (true) { 337 var awaitedValue = this.evaluate(entry.key, entry.module, fetcher, awaitedValue, resumeMode); 338 if (@getAbstractModuleRecordInternalField(entry.module, @abstractModuleRecordFieldState) == @GeneratorStateExecuting) 339 return; 340 341 try { 342 awaitedValue = await awaitedValue; 343 resumeMode = 0; 344 } catch (e) { 345 awaitedValue = e; 346 resumeMode = 2; 347 } 348 } 349 }).@call(this, entry, dependencies); 350 } 319 351 } 320 352 … … 365 397 } 366 398 367 function requestImportModule(key, parameters, fetcher) 368 { 369 "use strict"; 370 371 var constructor = @InternalPromise; 372 var promise = @createPromise(constructor, /* isInternalPromise */ true); 373 @resolveWithoutPromise(this.requestSatisfy(this.ensureRegistered(key), parameters, fetcher, new @Set), 374 (entry) => { 375 try { 376 this.linkAndEvaluateModule(entry.key, fetcher); 377 @fulfillPromiseWithFirstResolvingFunctionCallCheck(promise, this.getModuleNamespaceObject(entry.module)); 378 } catch (error) { 379 @rejectPromiseWithFirstResolvingFunctionCallCheck(promise, error); 380 } 381 }, 382 (reason) => { 383 @rejectPromiseWithFirstResolvingFunctionCallCheck(promise, reason); 384 }); 385 return promise; 399 async function requestImportModule(key, parameters, fetcher) 400 { 401 "use strict"; 402 403 var entry = await this.requestSatisfy(this.ensureRegistered(key), parameters, fetcher, new @Set); 404 await this.linkAndEvaluateModule(entry.key, fetcher); 405 return this.getModuleNamespaceObject(entry.module); 386 406 } 387 407 -
trunk/Source/JavaScriptCore/bytecode/BytecodeGeneratorification.cpp
r264049 r273225 218 218 auto nextToEnterPoint = enterPoint().next(); 219 219 unsigned switchTableIndex = m_codeBlock->numberOfSwitchJumpTables(); 220 VirtualRegister state = virtualRegisterForArgumentIncludingThis(static_cast<int32_t>(JSGenerator:: GeneratorArgument::State));220 VirtualRegister state = virtualRegisterForArgumentIncludingThis(static_cast<int32_t>(JSGenerator::Argument::State)); 221 221 auto& jumpTable = m_codeBlock->addSwitchJumpTable(); 222 222 jumpTable.min = 0; … … 233 233 234 234 for (const YieldData& data : m_yields) { 235 VirtualRegister scope = virtualRegisterForArgumentIncludingThis(static_cast<int32_t>(JSGenerator:: GeneratorArgument::Frame));235 VirtualRegister scope = virtualRegisterForArgumentIncludingThis(static_cast<int32_t>(JSGenerator::Argument::Frame)); 236 236 237 237 auto instruction = m_instructions.at(data.point); … … 294 294 void performGeneratorification(BytecodeGenerator& bytecodeGenerator, UnlinkedCodeBlockGenerator* codeBlock, InstructionStreamWriter& instructions, SymbolTable* generatorFrameSymbolTable, int generatorFrameSymbolTableIndex) 295 295 { 296 if (UNLIKELY(Options::dumpBytecodesBeforeGeneratorification())) 296 if (UNLIKELY(Options::dumpBytecodesBeforeGeneratorification())) { 297 dataLogLn("Bytecodes before generatorification"); 297 298 CodeBlockBytecodeDumper<UnlinkedCodeBlockGenerator>::dumpBlock(codeBlock, instructions, WTF::dataFile()); 299 } 298 300 299 301 BytecodeGeneratorification pass(bytecodeGenerator, codeBlock, instructions, generatorFrameSymbolTable, generatorFrameSymbolTableIndex); 300 302 pass.run(); 303 304 if (UNLIKELY(Options::dumpBytecodesBeforeGeneratorification())) { 305 dataLogLn("Bytecodes after generatorification"); 306 CodeBlockBytecodeDumper<UnlinkedCodeBlockGenerator>::dumpBlock(codeBlock, instructions, WTF::dataFile()); 307 } 301 308 } 302 309 -
trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp
r266323 r273225 28 28 #include "BytecodeIntrinsicRegistry.h" 29 29 30 #include "AbstractModuleRecord.h" 30 31 #include "BuiltinNames.h" 31 32 #include "BytecodeGenerator.h" … … 87 88 m_generatorFieldThis.set(m_vm, jsNumber(static_cast<unsigned>(JSGenerator::Field::This))); 88 89 m_generatorFieldFrame.set(m_vm, jsNumber(static_cast<unsigned>(JSGenerator::Field::Frame))); 89 m_GeneratorResumeModeNormal.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::NormalMode)));90 m_GeneratorResumeModeThrow.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::ThrowMode)));91 m_GeneratorResumeModeReturn.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::ReturnMode)));92 m_GeneratorStateCompleted.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorState::Completed)));93 m_GeneratorStateExecuting.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorState::Executing)));90 m_GeneratorResumeModeNormal.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode))); 91 m_GeneratorResumeModeThrow.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ThrowMode))); 92 m_GeneratorResumeModeReturn.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ReturnMode))); 93 m_GeneratorStateCompleted.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::State::Completed))); 94 m_GeneratorStateExecuting.set(m_vm, jsNumber(static_cast<int32_t>(JSGenerator::State::Executing))); 94 95 m_arrayIteratorFieldIteratedObject.set(m_vm, jsNumber(static_cast<int32_t>(JSArrayIterator::Field::IteratedObject))); 95 96 m_arrayIteratorFieldIndex.set(m_vm, jsNumber(static_cast<int32_t>(JSArrayIterator::Field::Index))); … … 113 114 m_AsyncGeneratorSuspendReasonNone.set(m_vm, jsNumber(static_cast<int32_t>(JSAsyncGenerator::AsyncGeneratorSuspendReason::None))); 114 115 m_useIntlDateTimeFormatDayPeriod.set(m_vm, jsBoolean(Options::useIntlDateTimeFormatDayPeriod())); 116 m_abstractModuleRecordFieldState.set(m_vm, jsNumber(static_cast<int32_t>(AbstractModuleRecord::Field::State))); 115 117 } 116 118 -
trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h
r271343 r273225 48 48 macro(getGeneratorInternalField) \ 49 49 macro(getAsyncGeneratorInternalField) \ 50 macro(getAbstractModuleRecordInternalField) \ 50 51 macro(getArrayIteratorInternalField) \ 51 52 macro(getStringIteratorInternalField) \ … … 153 154 macro(AsyncGeneratorSuspendReasonNone) \ 154 155 macro(useIntlDateTimeFormatDayPeriod) \ 156 macro(abstractModuleRecordFieldState) \ 155 157 156 158 #define JSC_COMMON_BYTECODE_INTRINSIC_CONSTANTS_CUSTOM_EACH_NAME(macro) \ -
trunk/Source/JavaScriptCore/bytecode/BytecodeList.rb
r272823 r273225 1298 1298 op :yield, 1299 1299 args: { 1300 generator: VirtualRegister,1301 1300 yieldPoint: unsigned, 1302 1301 argument: VirtualRegister, -
trunk/Source/JavaScriptCore/bytecode/BytecodeUseDef.cpp
r272580 r273225 292 292 USES(OpPutInternalField, base, value) 293 293 294 USES(OpYield, generator,argument)294 USES(OpYield, argument) 295 295 296 296 case op_iterator_open: { -
trunk/Source/JavaScriptCore/bytecode/UnlinkedModuleProgramCodeBlock.h
r252390 r273225 83 83 } 84 84 85 bool isAsync() const { return codeFeatures() & AwaitFeature; } 86 85 87 private: 86 88 friend CachedModuleCodeBlock; -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r273135 r273225 32 32 #include "BytecodeGenerator.h" 33 33 34 #include "AbstractModuleRecord.h" 34 35 #include "BuiltinExecutables.h" 35 36 #include "BuiltinNames.h" … … 280 281 281 282 282 if ( isGeneratorOrAsyncFunctionBodyParseMode(m_codeBlock->parseMode()))283 if (m_isAsync) 283 284 performGeneratorification(*this, m_codeBlock.get(), m_writer, m_generatorFrameSymbolTable.get(), m_generatorFrameSymbolTableIndex); 284 285 … … 386 387 387 388 if (isGeneratorOrAsyncFunctionBodyParseMode(parseMode)) { 389 m_isAsync = true; 388 390 // Generator and AsyncFunction never provides "arguments". "arguments" reference will be resolved in an upper generator function scope. 389 391 needsArguments = false; … … 435 437 436 438 if (isGeneratorOrAsyncFunctionBodyParseMode(parseMode)) 437 m_generatorRegister = &m_parameters[ 1];439 m_generatorRegister = &m_parameters[static_cast<unsigned>(JSGenerator::Argument::Generator)]; 438 440 439 441 allocateAndEmitScope(); … … 952 954 }; 953 955 956 if (moduleProgramNode->usesAwait()) { 957 m_isAsync = true; 958 initializeNextParameter(); // |this| 959 for (unsigned i = 0; i < JSGenerator::Argument::NumberOfArguments; ++i) 960 initializeNextParameter(); 961 m_generatorRegister = &m_parameters[static_cast<unsigned>(AbstractModuleRecord::Argument::Generator)]; 962 } 963 954 964 emitEnter(); 955 965 … … 960 970 m_calleeRegister.setIndex(CallFrameSlot::callee); 961 971 962 m_codeBlock->setNumParameters( 1); // Allocate space for "this"972 m_codeBlock->setNumParameters(static_cast<unsigned>(AbstractModuleRecord::Argument::NumberOfArguments) + 1); // Allocate space for "this" + async module arguments. 963 973 964 974 // Now declare all variables. … … 984 994 // We keep the symbol table in the constant pool. 985 995 RegisterID* constantSymbolTable = nullptr; 986 if (shouldEmitTypeProfilerHooks() )996 if (shouldEmitTypeProfilerHooks() || moduleProgramNode->usesAwait()) 987 997 constantSymbolTable = addConstantValue(moduleEnvironmentSymbolTable); 988 998 else 989 999 constantSymbolTable = addConstantValue(moduleEnvironmentSymbolTable->cloneScopePart(m_vm)); 1000 1001 if (moduleProgramNode->usesAwait()) { 1002 m_generatorFrameSymbolTable.set(m_vm, moduleEnvironmentSymbolTable); 1003 m_generatorFrameSymbolTableIndex = constantSymbolTable->index(); 1004 emitPutInternalField(generatorRegister(), static_cast<unsigned>(AbstractModuleRecord::Field::Frame), generatorFrameRegister()); 1005 } 990 1006 991 1007 pushTDZVariables(lexicalVariables, TDZCheckOptimization::Optimize, TDZRequirement::UnderTDZ); … … 3730 3746 void BytecodeGenerator::emitWillLeaveCallFrameDebugHook() 3731 3747 { 3732 RELEASE_ASSERT(m_scopeNode->isFunctionNode());3733 3748 emitDebugHook(WillLeaveCallFrame, m_scopeNode->lastLine(), m_scopeNode->startOffset(), m_scopeNode->lineStartOffset()); 3734 3749 } … … 4181 4196 bool isForAwait = forLoopNode ? forLoopNode->isForAwait() : false; 4182 4197 auto shouldEmitAwait = isForAwait ? EmitAwait::Yes : EmitAwait::No; 4183 ASSERT(!isForAwait || isAsyncFunctionParseMode(parseMode()));4198 ASSERT(!isForAwait || (isAsyncFunctionParseMode(parseMode()) || isModuleParseMode(parseMode()))); 4184 4199 4185 4200 RefPtr<RegisterID> subject = newTemporary(); … … 4741 4756 OpNop::emit<OpcodeSize::Narrow>(this); 4742 4757 #endif 4743 OpYield::emit(this, generatorFrameRegister(),yieldPointIndex, argument);4758 OpYield::emit(this, yieldPointIndex, argument); 4744 4759 4745 4760 // Restore the try contexts, which start offset is updated to the merge point. … … 4754 4769 Ref<Label> normalLabel = newLabel(); 4755 4770 RefPtr<RegisterID> condition = newTemporary(); 4756 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::NormalMode))));4771 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)))); 4757 4772 emitJumpIfTrue(condition.get(), normalLabel.get()); 4758 4773 4759 4774 Ref<Label> throwLabel = newLabel(); 4760 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::ThrowMode))));4775 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ThrowMode)))); 4761 4776 emitJumpIfTrue(condition.get(), throwLabel.get()); 4762 4777 // Return. … … 4942 4957 { 4943 4958 RefPtr<RegisterID> condition = newTemporary(); 4944 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::NormalMode))));4959 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)))); 4945 4960 emitJumpIfTrue(condition.get(), normalLabel.get()); 4946 4961 4947 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::ReturnMode))));4962 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ReturnMode)))); 4948 4963 emitJumpIfTrue(condition.get(), returnLabel.get()); 4949 4964 … … 5049 5064 void BytecodeGenerator::emitGeneratorStateChange(int32_t state) 5050 5065 { 5066 // FIXME: It seems like this will create a lot of constants if there are many yield points. Maybe we should op_inc the old state. https://bugs.webkit.org/show_bug.cgi?id=222254 5051 5067 RegisterID* completedState = emitLoad(nullptr, jsNumber(state)); 5052 5068 static_assert(static_cast<unsigned>(JSGenerator::Field::State) == static_cast<unsigned>(JSAsyncGenerator::Field::State)); 5053 emitPutInternalField(generatorRegister(), static_cast<unsigned>(JSGenerator::Field::State), completedState);5069 emitPutInternalField(generatorRegister(), isModuleParseMode(parseMode()) ? static_cast<unsigned>(AbstractModuleRecord::Field::State) : static_cast<unsigned>(JSGenerator::Field::State), completedState); 5054 5070 } 5055 5071 -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r273135 r273225 1059 1059 RegisterID* emitYield(RegisterID* argument, JSAsyncGenerator::AsyncGeneratorSuspendReason = JSAsyncGenerator::AsyncGeneratorSuspendReason::Yield); 1060 1060 RegisterID* emitDelegateYield(RegisterID* argument, ThrowableExpressionData*); 1061 RegisterID* generatorStateRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator:: GeneratorArgument::State)]; }1062 RegisterID* generatorValueRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator:: GeneratorArgument::Value)]; }1063 RegisterID* generatorResumeModeRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator:: GeneratorArgument::ResumeMode)]; }1064 RegisterID* generatorFrameRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator:: GeneratorArgument::Frame)]; }1061 RegisterID* generatorStateRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::Argument::State)]; } 1062 RegisterID* generatorValueRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::Argument::Value)]; } 1063 RegisterID* generatorResumeModeRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::Argument::ResumeMode)]; } 1064 RegisterID* generatorFrameRegister() { return &m_parameters[static_cast<int32_t>(JSGenerator::Argument::Frame)]; } 1065 1065 1066 1066 CodeType codeType() const { return m_codeType; } … … 1328 1328 Vector<TryContext> m_tryContextStack; 1329 1329 unsigned m_yieldPoints { 0 }; 1330 bool m_isAsync { false }; 1330 1331 1331 1332 Strong<SymbolTable> m_generatorFrameSymbolTable; -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r273135 r273225 29 29 #include "NodeConstructors.h" 30 30 31 #include "AbstractModuleRecord.h" 31 32 #include "BuiltinNames.h" 32 33 #include "BytecodeGenerator.h" … … 1390 1391 } 1391 1392 1393 static AbstractModuleRecord::Field abstractModuleRecordInternalFieldIndex(BytecodeIntrinsicNode* node) 1394 { 1395 ASSERT(node->entry().type() == BytecodeIntrinsicRegistry::Type::Emitter); 1396 if (node->entry().emitter() == &BytecodeIntrinsicNode::emit_intrinsic_abstractModuleRecordFieldState) 1397 return AbstractModuleRecord::Field::State; 1398 RELEASE_ASSERT_NOT_REACHED(); 1399 return AbstractModuleRecord::Field::State; 1400 } 1401 1392 1402 static JSArrayIterator::Field arrayIteratorInternalFieldIndex(BytecodeIntrinsicNode* node) 1393 1403 { … … 1470 1480 unsigned index = static_cast<unsigned>(asyncGeneratorInternalFieldIndex(static_cast<BytecodeIntrinsicNode*>(node->m_expr))); 1471 1481 ASSERT(index < JSAsyncGenerator::numberOfInternalFields); 1482 ASSERT(!node->m_next); 1483 1484 return generator.emitGetInternalField(generator.finalDestination(dst), base.get(), index); 1485 } 1486 1487 RegisterID* BytecodeIntrinsicNode::emit_intrinsic_getAbstractModuleRecordInternalField(BytecodeGenerator& generator, RegisterID* dst) 1488 { 1489 ArgumentListNode* node = m_args->m_listNode; 1490 RefPtr<RegisterID> base = generator.emitNode(node); 1491 node = node->m_next; 1492 RELEASE_ASSERT(node->m_expr->isBytecodeIntrinsicNode()); 1493 unsigned index = static_cast<unsigned>(abstractModuleRecordInternalFieldIndex(static_cast<BytecodeIntrinsicNode*>(node->m_expr))); 1494 ASSERT(index < AbstractModuleRecord::numberOfInternalFields); 1472 1495 ASSERT(!node->m_next); 1473 1496 … … 4941 4964 generator.move(args.argumentRegister(argumentCount++), generator.promiseRegister()); 4942 4965 generator.emitLoad(args.argumentRegister(argumentCount++), jsUndefined()); 4943 generator.emitLoad(args.argumentRegister(argumentCount++), jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::NormalMode)));4966 generator.emitLoad(args.argumentRegister(argumentCount++), jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode))); 4944 4967 // JSTextPosition(int _line, int _offset, int _lineStartOffset) 4945 4968 JSTextPosition divot(firstLine(), startOffset(), lineStartOffset()); … … 4958 4981 { 4959 4982 RefPtr<RegisterID> condition = generator.newTemporary(); 4960 generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::NormalMode))));4983 generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)))); 4961 4984 generator.emitJumpIfTrue(condition.get(), generatorBodyLabel.get()); 4962 4985 4963 4986 Ref<Label> throwLabel = generator.newLabel(); 4964 generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator:: GeneratorResumeMode::ThrowMode))));4987 generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ThrowMode)))); 4965 4988 generator.emitJumpIfTrue(condition.get(), throwLabel.get()); 4966 4989 -
trunk/Source/JavaScriptCore/interpreter/Interpreter.cpp
r272580 r273225 31 31 #include "Interpreter.h" 32 32 33 #include "AbstractModuleRecord.h" 33 34 #include "BatchedTransitionOptimizer.h" 34 35 #include "Bytecodes.h" … … 50 51 #include "JSLexicalEnvironment.h" 51 52 #include "JSModuleEnvironment.h" 53 #include "JSModuleRecord.h" 52 54 #include "JSString.h" 53 55 #include "LLIntThunks.h" … … 1202 1204 } 1203 1205 1204 JSValue Interpreter::executeModuleProgram( ModuleProgramExecutable* executable, JSGlobalObject* lexicalGlobalObject, JSModuleEnvironment* scope)1206 JSValue Interpreter::executeModuleProgram(JSModuleRecord* record, ModuleProgramExecutable* executable, JSGlobalObject* lexicalGlobalObject, JSModuleEnvironment* scope, JSValue sentValue, JSValue resumeMode) 1205 1207 { 1206 1208 VM& vm = scope->vm(); … … 1232 1234 scope->flattenDictionaryObject(vm); 1233 1235 1236 const unsigned numberOfArguments = static_cast<unsigned>(AbstractModuleRecord::Argument::NumberOfArguments); 1234 1237 JSCallee* callee = JSCallee::create(vm, globalObject, scope); 1235 1238 ModuleProgramCodeBlock* codeBlock; … … 1241 1244 return checkedReturn(compileError); 1242 1245 codeBlock = jsCast<ModuleProgramCodeBlock*>(tempCodeBlock); 1243 ASSERT(codeBlock->numParameters() == 1); // 1 parameter for 'this'.1246 ASSERT(codeBlock->numParameters() == numberOfArguments + 1); 1244 1247 } 1245 1248 … … 1249 1252 DisallowGC disallowGC; // Ensure no GC happens. GC can replace CodeBlock in Executable. 1250 1253 jitCode = executable->generatedJITCode(); 1254 1255 JSValue args[numberOfArguments] = { 1256 record, 1257 record->internalField(JSModuleRecord::Field::State).get(), 1258 sentValue, 1259 resumeMode, 1260 scope, 1261 }; 1251 1262 // The |this| of the module is always `undefined`. 1252 1263 // http://www.ecma-international.org/ecma-262/6.0/#sec-module-environment-records-hasthisbinding 1253 1264 // http://www.ecma-international.org/ecma-262/6.0/#sec-module-environment-records-getthisbinding 1254 protoCallFrame.init(codeBlock, globalObject, callee, jsUndefined(), 1); 1255 } 1265 protoCallFrame.init(codeBlock, globalObject, callee, jsUndefined(), numberOfArguments + 1, args); 1266 } 1267 1268 record->internalField(JSModuleRecord::Field::State).set(vm, record, jsNumber(static_cast<int>(JSModuleRecord::State::Executing))); 1256 1269 1257 1270 // Execute the code: -
trunk/Source/JavaScriptCore/interpreter/Interpreter.h
r260744 r273225 106 106 107 107 JSValue executeProgram(const SourceCode&, JSGlobalObject*, JSObject* thisObj); 108 JSValue executeModuleProgram( ModuleProgramExecutable*, JSGlobalObject*, JSModuleEnvironment*);108 JSValue executeModuleProgram(JSModuleRecord*, ModuleProgramExecutable*, JSGlobalObject*, JSModuleEnvironment*, JSValue sentValue, JSValue resumeMode); 109 109 JSValue executeCall(JSGlobalObject*, JSObject* function, const CallData&, JSValue thisValue, const ArgList&); 110 110 JSObject* executeConstruct(JSGlobalObject*, JSObject* function, const CallData&, const ArgList&, JSValue newTarget); -
trunk/Source/JavaScriptCore/parser/ASTBuilder.h
r271265 r273225 401 401 { 402 402 ASSERT(argument); 403 usesAwait(); 403 404 AwaitExprNode* node = new (m_parserArena) AwaitExprNode(location, argument); 404 405 setExceptionLocation(node, start, divot, end); … … 1100 1101 } 1101 1102 void usesNewTarget() { m_scope.m_features |= NewTargetFeature; } 1103 void usesAwait() { m_scope.m_features |= AwaitFeature; } 1102 1104 ExpressionNode* createIntegerLikeNumber(const JSTokenLocation& location, double d) 1103 1105 { -
trunk/Source/JavaScriptCore/parser/Nodes.cpp
r272580 r273225 178 178 , m_startColumn(startColumn) 179 179 , m_endColumn(endColumn) 180 , m_usesAwait(features & AwaitFeature) 180 181 , m_moduleScopeData(*WTFMove(moduleScopeData)) 181 182 { -
trunk/Source/JavaScriptCore/parser/Nodes.h
r272883 r273225 1991 1991 unsigned startColumn() const { return m_startColumn; } 1992 1992 unsigned endColumn() const { return m_endColumn; } 1993 bool usesAwait() const { return m_usesAwait; } 1993 1994 1994 1995 static constexpr bool scopeIsFunction = false; … … 2003 2004 unsigned m_startColumn; 2004 2005 unsigned m_endColumn; 2006 bool m_usesAwait; 2005 2007 Ref<ModuleScopeData> m_moduleScopeData; 2006 2008 }; -
trunk/Source/JavaScriptCore/parser/Parser.cpp
r273107 r273225 208 208 Parser<LexerType>::~Parser() 209 209 { 210 } 211 212 void JSToken::dump(PrintStream& out) const 213 { 214 out.print(*m_data.cooked); 210 215 } 211 216 … … 1353 1358 1354 1359 if (match(AWAIT)) { 1355 semanticFailIfFalse(currentScope()->isAsyncFunction() , "for-await-of can only be used in an async function or async generator");1360 semanticFailIfFalse(currentScope()->isAsyncFunction() || (isModuleParseMode(sourceParseMode()) && Options::useTopLevelAwait()), "for-await-of can only be used in an async function or async generator"); 1356 1361 isAwaitFor = true; 1357 1362 next(); … … 4145 4150 { 4146 4151 ASSERT(match(AWAIT)); 4147 ASSERT(currentScope()->isAsyncFunction()); 4152 ASSERT(currentScope()->isAsyncFunction() || isModuleParseMode(sourceParseMode())); 4153 ASSERT(isAsyncFunctionParseMode(sourceParseMode()) || isModuleParseMode(sourceParseMode())); 4148 4154 ASSERT(m_parserState.functionParsePhase != FunctionParsePhase::Parameters); 4149 4155 JSTokenLocation location(tokenLocation()); … … 4815 4821 if (m_parserState.functionParsePhase == FunctionParsePhase::Parameters) 4816 4822 semanticFailIfFalse(m_parserState.allowAwait, "Cannot use 'await' within a parameter default expression"); 4817 else if (currentFunctionScope()->isAsyncFunctionBoundary() )4823 else if (currentFunctionScope()->isAsyncFunctionBoundary() || (isModuleParseMode(sourceParseMode()) && Options::useTopLevelAwait())) 4818 4824 return parseAwaitExpression(context); 4819 4825 … … 5339 5345 unsigned lastOperator = 0; 5340 5346 5341 if (UNLIKELY(match(AWAIT) && currentFunctionScope()->isAsyncFunctionBoundary()))5347 if (UNLIKELY(match(AWAIT) && (currentFunctionScope()->isAsyncFunctionBoundary() || (isModuleParseMode(sourceParseMode())) && Options::useTopLevelAwait()))) 5342 5348 return parseAwaitExpression(context); 5343 5349 -
trunk/Source/JavaScriptCore/parser/ParserModes.h
r272580 r273225 323 323 const CodeFeatures NoEvalCacheFeature = 1 << 11; 324 324 const CodeFeatures NonSimpleParameterListFeature = 1 << 12; 325 326 const CodeFeatures AllFeatures = EvalFeature | ArgumentsFeature | WithFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature | ArrowFunctionFeature | ArrowFunctionContextFeature | SuperCallFeature | SuperPropertyFeature | NewTargetFeature | NoEvalCacheFeature | NonSimpleParameterListFeature; 325 const CodeFeatures AwaitFeature = 1 << 13; 326 327 const CodeFeatures AllFeatures = EvalFeature | ArgumentsFeature | WithFeature | ThisFeature | StrictModeFeature | ShadowsArgumentsFeature | ArrowFunctionFeature | ArrowFunctionContextFeature | SuperCallFeature | SuperPropertyFeature | NewTargetFeature | NoEvalCacheFeature | NonSimpleParameterListFeature | AwaitFeature; 327 328 328 329 typedef uint8_t InnerArrowFunctionCodeFeatures; -
trunk/Source/JavaScriptCore/parser/ParserTokens.h
r271509 r273225 284 284 JSTextPosition m_startPosition; 285 285 JSTextPosition m_endPosition; 286 287 void dump(PrintStream&) const; 286 288 }; 287 289 -
trunk/Source/JavaScriptCore/runtime/AbstractModuleRecord.cpp
r273138 r273225 29 29 #include "Error.h" 30 30 #include "JSCInlines.h" 31 #include "JSInternalFieldObjectImplInlines.h" 31 32 #include "JSMap.h" 32 33 #include "JSModuleEnvironment.h" … … 53 54 Base::finishCreation(vm); 54 55 ASSERT(inherits(vm, info())); 56 57 auto values = initialValues(); 58 ASSERT(values.size() == numberOfInternalFields); 59 for (unsigned index = 0; index < values.size(); ++index) 60 Base::internalField(index).set(vm, this, values[index]); 55 61 56 62 auto scope = DECLARE_THROW_SCOPE(vm); … … 809 815 } 810 816 811 voidAbstractModuleRecord::link(JSGlobalObject* globalObject, JSValue scriptFetcher)817 Synchronousness AbstractModuleRecord::link(JSGlobalObject* globalObject, JSValue scriptFetcher) 812 818 { 813 819 VM& vm = globalObject->vm(); … … 819 825 #endif 820 826 RELEASE_ASSERT_NOT_REACHED(); 821 } 822 823 JS_EXPORT_PRIVATE JSValue AbstractModuleRecord::evaluate(JSGlobalObject* globalObject) 827 return Synchronousness::Sync; 828 } 829 830 JS_EXPORT_PRIVATE JSValue AbstractModuleRecord::evaluate(JSGlobalObject* globalObject, JSValue sentValue, JSValue resumeMode) 824 831 { 825 832 VM& vm = globalObject->vm(); 826 833 if (auto* jsModuleRecord = jsDynamicCast<JSModuleRecord*>(vm, this)) 827 return jsModuleRecord->evaluate(globalObject );834 return jsModuleRecord->evaluate(globalObject, sentValue, resumeMode); 828 835 #if ENABLE(WEBASSEMBLY) 829 836 if (auto* wasmModuleRecord = jsDynamicCast<WebAssemblyModuleRecord*>(vm, this)) -
trunk/Source/JavaScriptCore/runtime/AbstractModuleRecord.h
r273138 r273225 27 27 28 28 #include "Identifier.h" 29 #include "JSDestructibleObject.h" 29 #include "JSGenerator.h" 30 #include "JSInternalFieldObjectImpl.h" 30 31 #include <wtf/ListHashSet.h> 31 32 … … 38 39 // Based on the Source Text Module Record 39 40 // http://www.ecma-international.org/ecma-262/6.0/#sec-source-text-module-records 40 class AbstractModuleRecord : public JS NonFinalObject{41 class AbstractModuleRecord : public JSInternalFieldObjectImpl<4> { 41 42 friend class LLIntOffsetsExtractor; 42 43 public: 43 using Base = JS NonFinalObject;44 using Base = JSInternalFieldObjectImpl<4>; 44 45 45 46 static constexpr bool needsDestruction = true; … … 49 50 { 50 51 RELEASE_ASSERT_NOT_REACHED(); 52 } 53 54 using Argument = JSGenerator::Argument; 55 using State = JSGenerator::State; 56 using ResumeMode = JSGenerator::ResumeMode; 57 58 enum class Field : uint32_t { 59 State, 60 Next, 61 This, 62 Frame, 63 }; 64 65 static_assert(numberOfInternalFields == 4); 66 static std::array<JSValue, numberOfInternalFields> initialValues() 67 { 68 return { { 69 jsNumber(static_cast<int32_t>(State::Init)), 70 jsUndefined(), 71 jsUndefined(), 72 jsUndefined(), 73 } }; 51 74 } 52 75 … … 130 153 } 131 154 132 void link(JSGlobalObject*, JSValue scriptFetcher); 133 JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*); 155 Synchronousness link(JSGlobalObject*, JSValue scriptFetcher); 156 JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*, JSValue sentValue, JSValue resumeMode); 157 WriteBarrier<Unknown>& internalField(Field field) { return Base::internalField(static_cast<uint32_t>(field)); } 158 WriteBarrier<Unknown> internalField(Field field) const { return Base::internalField(static_cast<uint32_t>(field)); } 134 159 135 160 protected: -
trunk/Source/JavaScriptCore/runtime/JSAsyncGenerator.h
r273138 r273225 55 55 AwaitingReturn = -5, 56 56 }; 57 static_assert(static_cast<int32_t>(AsyncGeneratorState::Completed) == static_cast<int32_t>(JSGenerator:: GeneratorState::Completed));58 static_assert(static_cast<int32_t>(AsyncGeneratorState::Executing) == static_cast<int32_t>(JSGenerator:: GeneratorState::Executing));57 static_assert(static_cast<int32_t>(AsyncGeneratorState::Completed) == static_cast<int32_t>(JSGenerator::State::Completed)); 58 static_assert(static_cast<int32_t>(AsyncGeneratorState::Executing) == static_cast<int32_t>(JSGenerator::State::Executing)); 59 59 60 60 enum class AsyncGeneratorSuspendReason : int32_t { -
trunk/Source/JavaScriptCore/runtime/JSGenerator.h
r273138 r273225 47 47 } 48 48 49 enum class GeneratorResumeMode : int32_t {49 enum class ResumeMode : int32_t { 50 50 NormalMode = 0, 51 51 ReturnMode = 1, … … 53 53 }; 54 54 55 enum class GeneratorState : int32_t {55 enum class State : int32_t { 56 56 Completed = -1, 57 57 Executing = -2, … … 60 60 61 61 // [this], @generator, @generatorState, @generatorValue, @generatorResumeMode, @generatorFrame. 62 enum class GeneratorArgument : int32_t {62 enum class Argument : int32_t { 63 63 ThisValue = 0, 64 64 Generator = 1, … … 67 67 ResumeMode = 4, 68 68 Frame = 5, 69 NumberOfArguments = Frame, 69 70 }; 70 71 … … 83 84 return { { 84 85 jsNull(), 85 jsNumber(static_cast<int32_t>( GeneratorState::Init)),86 jsNumber(static_cast<int32_t>(State::Init)), 86 87 jsUndefined(), 87 88 jsUndefined(), … … 102 103 }; 103 104 105 OVERLOAD_RELATIONAL_OPERATORS_FOR_ENUM_CLASS_WITH_INTEGRALS(JSGenerator::Argument); 106 104 107 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/JSGlobalObject.h
r273138 r273225 231 231 ModuleLoaderCreateImportMetaPropertiesPtr moduleLoaderCreateImportMetaProperties; 232 232 233 typedef JSValue (*ModuleLoaderEvaluatePtr)(JSGlobalObject*, JSModuleLoader*, JSValue , JSValue, JSValue);233 typedef JSValue (*ModuleLoaderEvaluatePtr)(JSGlobalObject*, JSModuleLoader*, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher, JSValue awaitedValue, JSValue resumeMode); 234 234 ModuleLoaderEvaluatePtr moduleLoaderEvaluate; 235 235 -
trunk/Source/JavaScriptCore/runtime/JSModuleLoader.cpp
r271766 r273225 308 308 } 309 309 310 JSValue JSModuleLoader::evaluate(JSGlobalObject* globalObject, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher )310 JSValue JSModuleLoader::evaluate(JSGlobalObject* globalObject, JSValue key, JSValue moduleRecordValue, JSValue scriptFetcher, JSValue sentValue, JSValue resumeMode) 311 311 { 312 312 dataLogLnIf(Options::dumpModuleLoadingState(), "Loader [evaluate] ", printableModuleKey(globalObject, key)); 313 313 314 314 if (globalObject->globalObjectMethodTable()->moduleLoaderEvaluate) 315 return globalObject->globalObjectMethodTable()->moduleLoaderEvaluate(globalObject, this, key, moduleRecordValue, scriptFetcher );316 317 return evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher );318 } 319 320 JSValue JSModuleLoader::evaluateNonVirtual(JSGlobalObject* globalObject, JSValue, JSValue moduleRecordValue, JSValue )315 return globalObject->globalObjectMethodTable()->moduleLoaderEvaluate(globalObject, this, key, moduleRecordValue, scriptFetcher, sentValue, resumeMode); 316 317 return evaluateNonVirtual(globalObject, key, moduleRecordValue, scriptFetcher, sentValue, resumeMode); 318 } 319 320 JSValue JSModuleLoader::evaluateNonVirtual(JSGlobalObject* globalObject, JSValue, JSValue moduleRecordValue, JSValue, JSValue sentValue, JSValue resumeMode) 321 321 { 322 322 if (auto* moduleRecord = jsDynamicCast<AbstractModuleRecord*>(globalObject->vm(), moduleRecordValue)) 323 return moduleRecord->evaluate(globalObject );323 return moduleRecord->evaluate(globalObject, sentValue, resumeMode); 324 324 return jsUndefined(); 325 325 } … … 365 365 RELEASE_AND_RETURN(scope, JSValue::encode(JSWebAssembly::instantiate(globalObject, promise, moduleKey, jsSourceCode))); 366 366 #endif 367 368 dataLogLnIf(Options::dumpModuleLoadingState(), "loader [parsing] ", moduleKey); 367 369 368 370 ParserError error; … … 410 412 dataLogLnIf(Options::dumpModuleLoadingState(), "Loader [link] ", moduleRecord->moduleKey()); 411 413 412 moduleRecord->link(globalObject, callFrame->argument(1));414 auto sync = moduleRecord->link(globalObject, callFrame->argument(1)); 413 415 RETURN_IF_EXCEPTION(scope, encodedJSValue()); 414 416 415 return JSValue::encode(js Undefined());417 return JSValue::encode(jsBoolean(sync == Synchronousness::Async)); 416 418 } 417 419 … … 482 484 if (!loader) 483 485 return JSValue::encode(jsUndefined()); 484 return JSValue::encode(loader->evaluate(globalObject, callFrame->argument(0), callFrame->argument(1), callFrame->argument(2) ));486 return JSValue::encode(loader->evaluate(globalObject, callFrame->argument(0), callFrame->argument(1), callFrame->argument(2), callFrame->argument(3), callFrame->argument(4))); 485 487 } 486 488 -
trunk/Source/JavaScriptCore/runtime/JSModuleLoader.h
r260415 r273225 85 85 86 86 // Additional platform dependent hooked APIs. 87 JSValue evaluate(JSGlobalObject*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher );88 JSValue evaluateNonVirtual(JSGlobalObject*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher );87 JSValue evaluate(JSGlobalObject*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher, JSValue sentValue, JSValue resumeMode); 88 JSValue evaluateNonVirtual(JSGlobalObject*, JSValue key, JSValue moduleRecord, JSValue scriptFetcher, JSValue sentValue, JSValue resumeMode); 89 89 90 90 // Utility functions. -
trunk/Source/JavaScriptCore/runtime/JSModuleRecord.cpp
r273138 r273225 82 82 DEFINE_VISIT_CHILDREN(JSModuleRecord); 83 83 84 voidJSModuleRecord::link(JSGlobalObject* globalObject, JSValue scriptFetcher)84 Synchronousness JSModuleRecord::link(JSGlobalObject* globalObject, JSValue scriptFetcher) 85 85 { 86 86 VM& vm = globalObject->vm(); … … 91 91 if (!executable) { 92 92 throwSyntaxError(globalObject, scope); 93 return ;93 return Synchronousness::Sync; 94 94 } 95 95 instantiateDeclarations(globalObject, executable, scriptFetcher); 96 RETURN_IF_EXCEPTION(scope, void());96 RETURN_IF_EXCEPTION(scope, Synchronousness::Sync); 97 97 m_moduleProgramExecutable.set(vm, this, executable); 98 99 return executable->unlinkedModuleProgramCodeBlock()->isAsync() ? Synchronousness::Async : Synchronousness::Sync; 98 100 } 99 101 … … 239 241 } 240 242 241 JSValue JSModuleRecord::evaluate(JSGlobalObject* globalObject )243 JSValue JSModuleRecord::evaluate(JSGlobalObject* globalObject, JSValue sentValue, JSValue resumeMode) 242 244 { 243 245 if (!m_moduleProgramExecutable) … … 245 247 VM& vm = globalObject->vm(); 246 248 ModuleProgramExecutable* executable = m_moduleProgramExecutable.get(); 247 m_moduleProgramExecutable.clear(); 248 return vm.interpreter->executeModuleProgram(executable, globalObject, moduleEnvironment()); 249 JSValue resultOrAwaitedValue = vm.interpreter->executeModuleProgram(this, executable, globalObject, moduleEnvironment(), sentValue, resumeMode); 250 if (JSValue state = internalField(Field::State).get(); !state.isNumber() || state.asNumber() == static_cast<unsigned>(State::Executing)) 251 m_moduleProgramExecutable.clear(); 252 return resultOrAwaitedValue; 249 253 } 250 254 -
trunk/Source/JavaScriptCore/runtime/JSModuleRecord.h
r273138 r273225 55 55 static JSModuleRecord* create(JSGlobalObject*, VM&, Structure*, const Identifier&, const SourceCode&, const VariableEnvironment&, const VariableEnvironment&); 56 56 57 voidlink(JSGlobalObject*, JSValue scriptFetcher);58 JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject* );57 Synchronousness link(JSGlobalObject*, JSValue scriptFetcher); 58 JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*, JSValue sentValue, JSValue resumeMode); 59 59 60 60 const SourceCode& sourceCode() const { return m_sourceCode; } -
trunk/Source/JavaScriptCore/runtime/ModuleProgramExecutable.h
r273138 r273225 67 67 68 68 UnlinkedModuleProgramCodeBlock* unlinkedModuleProgramCodeBlock() { return m_unlinkedModuleProgramCodeBlock.get(); } 69 bool isAsync() const { return features() & AwaitFeature; } 69 70 70 71 SymbolTable* moduleEnvironmentSymbolTable() { return m_moduleEnvironmentSymbolTable.get(); } -
trunk/Source/JavaScriptCore/runtime/OptionsList.h
r273138 r273225 484 484 v(Bool, wasmLLIntTiersUpToBBQ, true, Normal, nullptr) \ 485 485 v(Size, webAssemblyBBQAirModeThreshold, isIOS() ? (10 * MB) : 0, Normal, "If 0, we always use BBQ Air. If Wasm module code size hits this threshold, we compile Wasm module with B3 BBQ mode.") \ 486 v(Bool, useWebAssemblyStreaming, true, Normal, "Allow to run WebAssembly's Streaming API") \487 486 v(Bool, useEagerWebAssemblyModuleHashing, false, Normal, "Unnamed WebAssembly modules are identified in backtraces through their hash, if available.") \ 488 v(Bool, useWebAssemblyReferences, true, Normal, "Allow types from the wasm references spec.") \489 v(Bool, useWebAssemblyMultiValues, true, Normal, "Allow types from the wasm mulit-values spec.") \490 v(Bool, useWebAssemblyThreading, true, Normal, "Allow instructions from the wasm threading spec.") \491 v(Bool, useWeakRefs, true, Normal, "Expose the WeakRef constructor.") \492 v(Bool, useIntlDateTimeFormatDayPeriod, true, Normal, "Expose the Intl.DateTimeFormat dayPeriod feature.") \493 v(Bool, useIntlDateTimeFormatRangeToParts, true, Normal, "Expose the Intl.DateTimeFormat#formatRangeToParts feature.") \494 v(Bool, useAtMethod, false, Normal, "Expose the at() method on Array, %TypedArray%, and String.") \495 v(Bool, useSharedArrayBuffer, false, Normal, nullptr) \496 487 v(Bool, useArrayAllocationProfiling, true, Normal, "If true, we will use our normal array allocation profiling. If false, the allocation profile will always claim to be undecided.") \ 497 488 v(Bool, forcePolyProto, false, Normal, "If true, create_this will always create an object with a poly proto structure.") \ … … 514 505 v(Bool, exposeProfilersOnGlobalObject, false, Normal, "If true, we will expose functions to enable/disable both the sampling profiler and the super sampler") \ 515 506 v(Bool, allowUnsupportedTiers, false, Normal, "If true, we will not disable DFG or FTL when an experimental feature is enabled.") \ 516 v(Bool, usePrivateClassFields, true, Normal, "If true, the parser will understand private data fields inside classes.") \517 v(Bool, usePrivateMethods, true, Normal, "If true, the parser will understand private methods inside classes.") \518 507 v(Bool, returnEarlyFromInfiniteLoopsForFuzzing, false, Normal, nullptr) \ 519 508 v(Size, earlyReturnFromInfiniteLoopsLimit, 1300000000, Normal, "When returnEarlyFromInfiniteLoopsForFuzzing is true, this determines the number of executions a loop can run for before just returning. This is helpful for the fuzzer so it doesn't get stuck in infinite loops.") \ … … 523 512 v(Bool, exposeCustomSettersOnGlobalObjectForTesting, false, Normal, nullptr) \ 524 513 v(Bool, useJITCage, canUseJITCage(), Normal, nullptr) \ 514 \ 515 /* Feature Flags */\ 516 \ 525 517 v(Bool, usePublicStaticClassFields, true, Normal, "If true, the parser will understand public static data fields inside classes.") \ 526 518 v(Bool, usePrivateStaticClassFields, true, Normal, "If true, the parser will understand private static data fields inside classes.") \ 519 v(Bool, usePrivateClassFields, true, Normal, "If true, the parser will understand private data fields inside classes.") \ 520 v(Bool, usePrivateMethods, true, Normal, "If true, the parser will understand private methods inside classes.") \ 521 v(Bool, useWebAssemblyStreaming, true, Normal, "Allow to run WebAssembly's Streaming API") \ 522 v(Bool, useWebAssemblyReferences, true, Normal, "Allow types from the wasm references spec.") \ 523 v(Bool, useWebAssemblyMultiValues, true, Normal, "Allow types from the wasm mulit-values spec.") \ 524 v(Bool, useWebAssemblyThreading, true, Normal, "Allow instructions from the wasm threading spec.") \ 525 v(Bool, useWeakRefs, true, Normal, "Expose the WeakRef constructor.") \ 526 v(Bool, useIntlDateTimeFormatDayPeriod, true, Normal, "Expose the Intl.DateTimeFormat dayPeriod feature.") \ 527 v(Bool, useIntlDateTimeFormatRangeToParts, true, Normal, "Expose the Intl.DateTimeFormat#formatRangeToParts feature.") \ 528 v(Bool, useAtMethod, false, Normal, "Expose the at() method on Array, %TypedArray%, and String.") \ 529 v(Bool, useSharedArrayBuffer, false, Normal, nullptr) \ 530 v(Bool, useTopLevelAwait, true, Normal, "allow the await keyword at the top level of a module.") \ 531 527 532 528 533 enum OptionEquivalence { -
trunk/Source/JavaScriptCore/runtime/SymbolTable.cpp
r273138 r273225 34 34 #include "TypeProfiler.h" 35 35 36 #include <wtf/CommaPrinter.h> 37 36 38 namespace JSC { 37 39 … … 284 286 } 285 287 288 void SymbolTable::dump(PrintStream& out) const 289 { 290 ConcurrentJSLocker locker(m_lock); 291 Base::dump(out); 292 293 CommaPrinter comma; 294 out.print(" <"); 295 for (auto& iter : m_map) 296 out.print(comma, *iter.key, ": ", iter.value.varOffset()); 297 out.println(">"); 298 } 299 286 300 } // namespace JSC 287 301 -
trunk/Source/JavaScriptCore/runtime/SymbolTable.h
r273138 r273225 739 739 740 740 void finalizeUnconditionally(VM&); 741 void dump(PrintStream&) const; 741 742 742 743 private: -
trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.cpp
r273138 r273225 98 98 } 99 99 100 void WebAssemblyModuleRecord::link(JSGlobalObject* globalObject, JSValue, JSObject* importObject, Wasm::CreationMode creationMode) 100 Synchronousness WebAssemblyModuleRecord::link(JSGlobalObject* globalObject, JSValue, JSObject* importObject, Wasm::CreationMode creationMode) 101 { 102 linkImpl(globalObject, importObject, creationMode); 103 return Synchronousness::Sync; 104 } 105 106 void WebAssemblyModuleRecord::linkImpl(JSGlobalObject* globalObject, JSObject* importObject, Wasm::CreationMode creationMode) 101 107 { 102 108 VM& vm = globalObject->vm(); -
trunk/Source/JavaScriptCore/wasm/js/WebAssemblyModuleRecord.h
r273138 r273225 60 60 61 61 void prepareLink(VM&, JSWebAssemblyInstance*); 62 voidlink(JSGlobalObject*, JSValue scriptFetcher, JSObject* importObject, Wasm::CreationMode);62 Synchronousness link(JSGlobalObject*, JSValue scriptFetcher, JSObject* importObject, Wasm::CreationMode); 63 63 JS_EXPORT_PRIVATE JSValue evaluate(JSGlobalObject*); 64 64 … … 66 66 67 67 private: 68 void linkImpl(JSGlobalObject*, JSObject* importObject, Wasm::CreationMode); 68 69 WebAssemblyModuleRecord(VM&, Structure*, const Identifier&); 69 70 -
trunk/Source/WebCore/ChangeLog
r273224 r273225 1 2021-02-21 Keith Miller <keith_miller@apple.com> 2 3 Implement the Top-level await proposal 4 https://bugs.webkit.org/show_bug.cgi?id=202484 5 6 Reviewed by Yusuke Suzuki. 7 8 * bindings/js/JSDOMGlobalObject.cpp: 9 (WebCore::JSDOMGlobalObject::moduleLoaderEvaluate): 10 * bindings/js/JSDOMGlobalObject.h: 11 * bindings/js/ScriptController.cpp: 12 (WebCore::ScriptController::evaluateModule): 13 * bindings/js/ScriptController.h: 14 * bindings/js/ScriptModuleLoader.cpp: 15 (WebCore::ScriptModuleLoader::evaluate): 16 * bindings/js/ScriptModuleLoader.h: 17 * workers/WorkerOrWorkletScriptController.cpp: 18 (WebCore::WorkerOrWorkletScriptController::evaluateModule): 19 * workers/WorkerOrWorkletScriptController.h: 20 1 21 2021-02-20 Yusuke Suzuki <ysuzuki@apple.com> 2 22 -
trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.cpp
r273203 r273225 471 471 } 472 472 473 JSC::JSValue JSDOMGlobalObject::moduleLoaderEvaluate(JSC::JSGlobalObject* globalObject, JSC::JSModuleLoader* moduleLoader, JSC::JSValue moduleKey, JSC::JSValue moduleRecord, JSC::JSValue scriptFetcher )473 JSC::JSValue JSDOMGlobalObject::moduleLoaderEvaluate(JSC::JSGlobalObject* globalObject, JSC::JSModuleLoader* moduleLoader, JSC::JSValue moduleKey, JSC::JSValue moduleRecord, JSC::JSValue scriptFetcher, JSC::JSValue awaitedValue, JSC::JSValue resumeMode) 474 474 { 475 475 JSDOMGlobalObject* thisObject = JSC::jsCast<JSDOMGlobalObject*>(globalObject); 476 476 if (auto* loader = scriptModuleLoader(thisObject)) 477 return loader->evaluate(globalObject, moduleLoader, moduleKey, moduleRecord, scriptFetcher );477 return loader->evaluate(globalObject, moduleLoader, moduleKey, moduleRecord, scriptFetcher, awaitedValue, resumeMode); 478 478 return JSC::jsUndefined(); 479 479 } -
trunk/Source/WebCore/bindings/js/JSDOMGlobalObject.h
r273203 r273225 108 108 static JSC::Identifier moduleLoaderResolve(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSValue, JSC::JSValue); 109 109 static JSC::JSInternalPromise* moduleLoaderFetch(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSValue, JSC::JSValue); 110 static JSC::JSValue moduleLoaderEvaluate(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSValue, JSC::JSValue );110 static JSC::JSValue moduleLoaderEvaluate(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSValue, JSC::JSValue, JSC::JSValue, JSC::JSValue); 111 111 static JSC::JSInternalPromise* moduleLoaderImportModule(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSString*, JSC::JSValue, const JSC::SourceOrigin&); 112 112 static JSC::JSObject* moduleLoaderCreateImportMetaProperties(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSModuleRecord*, JSC::JSValue); -
trunk/Source/WebCore/bindings/js/ScriptController.cpp
r272618 r273225 228 228 } 229 229 230 JSC::JSValue ScriptController::evaluateModule(const URL& sourceURL, JSModuleRecord& moduleRecord, DOMWrapperWorld& world )230 JSC::JSValue ScriptController::evaluateModule(const URL& sourceURL, JSModuleRecord& moduleRecord, DOMWrapperWorld& world, JSC::JSValue awaitedValue, JSC::JSValue resumeMode) 231 231 { 232 232 JSLockHolder lock(world.vm()); … … 241 241 242 242 InspectorInstrumentation::willEvaluateScript(m_frame, sourceURL.string(), jsSourceCode.firstLine().oneBasedInt(), jsSourceCode.startColumn().oneBasedInt()); 243 auto returnValue = moduleRecord.evaluate(&lexicalGlobalObject );243 auto returnValue = moduleRecord.evaluate(&lexicalGlobalObject, awaitedValue, resumeMode); 244 244 InspectorInstrumentation::didEvaluateScript(m_frame); 245 245 … … 247 247 } 248 248 249 JSC::JSValue ScriptController::evaluateModule(const URL& sourceURL, JSModuleRecord& moduleRecord )250 { 251 return evaluateModule(sourceURL, moduleRecord, mainThreadNormalWorld() );249 JSC::JSValue ScriptController::evaluateModule(const URL& sourceURL, JSModuleRecord& moduleRecord, JSC::JSValue awaitedValue, JSC::JSValue resumeMode) 250 { 251 return evaluateModule(sourceURL, moduleRecord, mainThreadNormalWorld(), awaitedValue, resumeMode); 252 252 } 253 253 -
trunk/Source/WebCore/bindings/js/ScriptController.h
r270453 r273225 124 124 JSC::JSValue linkAndEvaluateModuleScript(LoadableModuleScript&); 125 125 126 JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&, DOMWrapperWorld& );127 JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord& );126 JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&, DOMWrapperWorld&, JSC::JSValue awaitedValue, JSC::JSValue resumeMode); 127 JSC::JSValue evaluateModule(const URL&, JSC::JSModuleRecord&, JSC::JSValue awaitedValue, JSC::JSValue resumeMode); 128 128 129 129 WTF::TextPosition eventHandlerPosition() const; -
trunk/Source/WebCore/bindings/js/ScriptModuleLoader.cpp
r273203 r273225 221 221 } 222 222 223 JSC::JSValue ScriptModuleLoader::evaluate(JSC::JSGlobalObject* jsGlobalObject, JSC::JSModuleLoader*, JSC::JSValue moduleKeyValue, JSC::JSValue moduleRecordValue, JSC::JSValue )223 JSC::JSValue ScriptModuleLoader::evaluate(JSC::JSGlobalObject* jsGlobalObject, JSC::JSModuleLoader*, JSC::JSValue moduleKeyValue, JSC::JSValue moduleRecordValue, JSC::JSValue, JSC::JSValue awaitedValue, JSC::JSValue resumeMode) 224 224 { 225 225 JSC::VM& vm = jsGlobalObject->vm(); … … 239 239 if (m_ownerType == OwnerType::Document) { 240 240 if (auto* frame = downcast<Document>(m_context).frame()) 241 return frame->script().evaluateModule(sourceURL, *moduleRecord );241 return frame->script().evaluateModule(sourceURL, *moduleRecord, awaitedValue, resumeMode); 242 242 } else { 243 243 ASSERT(is<WorkerOrWorkletGlobalScope>(m_context)); 244 244 if (auto* script = downcast<WorkerOrWorkletGlobalScope>(m_context).script()) 245 return script->evaluateModule(*moduleRecord );245 return script->evaluateModule(*moduleRecord, awaitedValue, resumeMode); 246 246 } 247 247 return JSC::jsUndefined(); -
trunk/Source/WebCore/bindings/js/ScriptModuleLoader.h
r273203 r273225 60 60 JSC::Identifier resolve(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue moduleName, JSC::JSValue importerModuleKey, JSC::JSValue scriptFetcher); 61 61 JSC::JSInternalPromise* fetch(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue moduleKey, JSC::JSValue parameters, JSC::JSValue scriptFetcher); 62 JSC::JSValue evaluate(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue moduleKey, JSC::JSValue moduleRecord, JSC::JSValue scriptFetcher );62 JSC::JSValue evaluate(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue moduleKey, JSC::JSValue moduleRecord, JSC::JSValue scriptFetcher, JSC::JSValue awaitedValue, JSC::JSValue resumeMode); 63 63 JSC::JSInternalPromise* importModule(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSString*, JSC::JSValue parameters, const JSC::SourceOrigin&); 64 64 JSC::JSObject* createImportMetaProperties(JSC::JSGlobalObject*, JSC::JSModuleLoader*, JSC::JSValue, JSC::JSModuleRecord*, JSC::JSValue); -
trunk/Source/WebCore/workers/WorkerOrWorkletScriptController.cpp
r273203 r273225 246 246 } 247 247 248 JSC::JSValue WorkerOrWorkletScriptController::evaluateModule(JSC::JSModuleRecord& moduleRecord )248 JSC::JSValue WorkerOrWorkletScriptController::evaluateModule(JSC::JSModuleRecord& moduleRecord, JSC::JSValue awaitedValue, JSC::JSValue resumeMode) 249 249 { 250 250 auto& globalObject = *m_globalScopeWrapper.get(); 251 251 VM& vm = globalObject.vm(); 252 252 JSLockHolder lock { vm }; 253 return moduleRecord.evaluate(&globalObject );253 return moduleRecord.evaluate(&globalObject, awaitedValue, resumeMode); 254 254 } 255 255 -
trunk/Source/WebCore/workers/WorkerOrWorkletScriptController.h
r273203 r273225 97 97 void evaluate(const ScriptSourceCode&, NakedPtr<JSC::Exception>& returnedException, String* returnedExceptionMessage = nullptr); 98 98 99 JSC::JSValue evaluateModule(JSC::JSModuleRecord& );99 JSC::JSValue evaluateModule(JSC::JSModuleRecord&, JSC::JSValue awaitedValue, JSC::JSValue resumeMode); 100 100 101 101 void linkAndEvaluateModule(WorkerScriptFetcher&, const ScriptSourceCode&, String* returnedExceptionMessage = nullptr);
Note: See TracChangeset
for help on using the changeset viewer.