Changeset 273225 in webkit for trunk/Source/JavaScriptCore/bytecompiler
- Timestamp:
- Feb 21, 2021, 4:41:30 PM (4 years ago)
- Location:
- trunk/Source/JavaScriptCore/bytecompiler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
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
Note:
See TracChangeset
for help on using the changeset viewer.