Changeset 273649 in webkit for trunk/Source/JavaScriptCore/bytecompiler
- Timestamp:
- Mar 1, 2021, 7:00:20 AM (4 years ago)
- Location:
- trunk/Source/JavaScriptCore/bytecompiler
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.cpp
r273225 r273649 4768 4768 4769 4769 Ref<Label> normalLabel = newLabel(); 4770 RefPtr<RegisterID> condition = newTemporary(); 4771 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)))); 4772 emitJumpIfTrue(condition.get(), normalLabel.get()); 4770 emitJumpIfTrue(emitEqualityOp<OpStricteq>(newTemporary(), generatorResumeModeRegister(), emitLoad(nullptr, JSGenerator::ResumeMode::NormalMode)), normalLabel.get()); 4773 4771 4774 4772 Ref<Label> throwLabel = newLabel(); 4775 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ThrowMode)))); 4776 emitJumpIfTrue(condition.get(), throwLabel.get()); 4773 emitJumpIfTrue(emitEqualityOp<OpStricteq>(newTemporary(), generatorResumeModeRegister(), emitLoad(nullptr, JSGenerator::ResumeMode::ThrowMode)), throwLabel.get()); 4777 4774 // Return. 4778 4775 { … … 4954 4951 4955 4952 Ref<Label> normalLabel = newLabel(); 4953 emitJumpIfTrue(emitEqualityOp<OpStricteq>(newTemporary(), generatorResumeModeRegister(), emitLoad(nullptr, JSGenerator::ResumeMode::NormalMode)), normalLabel.get()); 4954 4956 4955 Ref<Label> returnLabel = newLabel(); 4957 { 4958 RefPtr<RegisterID> condition = newTemporary(); 4959 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)))); 4960 emitJumpIfTrue(condition.get(), normalLabel.get()); 4961 4962 emitEqualityOp<OpStricteq>(condition.get(), generatorResumeModeRegister(), emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ReturnMode)))); 4963 emitJumpIfTrue(condition.get(), returnLabel.get()); 4964 4965 // Fallthrough to ThrowMode. 4966 } 4956 emitJumpIfTrue(emitEqualityOp<OpStricteq>(newTemporary(), generatorResumeModeRegister(), emitLoad(nullptr, JSGenerator::ResumeMode::ReturnMode)), returnLabel.get()); 4967 4957 4968 4958 // Throw. … … 5132 5122 { 5133 5123 if (context.numberOfBreaksOrContinues() || context.handlesReturns()) { 5134 emitJumpIf <OpStricteq>(context.completionTypeRegister(), CompletionType::Normal, normalCompletionLabel);5124 emitJumpIfTrue(emitEqualityOp<OpStricteq>(newTemporary(), context.completionTypeRegister(), emitLoad(nullptr, CompletionType::Normal)), normalCompletionLabel); 5135 5125 5136 5126 FinallyContext* outerContext = context.outerContext(); … … 5143 5133 Ref<Label> nextLabel = newLabel(); 5144 5134 auto& jump = context.jumps(i); 5145 emitJumpIf <OpNstricteq>(context.completionTypeRegister(), jump.jumpID, nextLabel.get());5135 emitJumpIfFalse(emitEqualityOp<OpStricteq>(newTemporary(), context.completionTypeRegister(), emitLoad(nullptr, jump.jumpID)), nextLabel.get()); 5146 5136 5147 5137 // This case is for Break / Continue completions from an inner finally context … … 5176 5166 if (context.handlesReturns()) { 5177 5167 Ref<Label> isNotReturnLabel = newLabel(); 5178 emitJumpIf <OpNstricteq>(context.completionTypeRegister(), CompletionType::Return, isNotReturnLabel.get());5168 emitJumpIfFalse(emitEqualityOp<OpStricteq>(newTemporary(), context.completionTypeRegister(), emitLoad(nullptr, CompletionType::Return)), isNotReturnLabel.get()); 5179 5169 5180 5170 // This case is for Return completion from an inner finally context: … … 5204 5194 if (hasBreaksOrContinuesThatEscapeCurrentFinally) { 5205 5195 Ref<Label> isThrowOrNormalLabel = newLabel(); 5206 emitJumpIf <OpBeloweq>(context.completionTypeRegister(), CompletionType::Throw, isThrowOrNormalLabel.get());5196 emitJumpIfTrue(emitBinaryOp<OpBeloweq>(newTemporary(), context.completionTypeRegister(), emitLoad(nullptr, CompletionType::Throw)), isThrowOrNormalLabel.get()); 5207 5197 5208 5198 // A completionType above Throw means we have a Break or Continue encoded as a jumpID. … … 5247 5237 if (context.handlesReturns()) { 5248 5238 Ref<Label> notReturnLabel = newLabel(); 5249 emitJumpIf <OpNstricteq>(context.completionTypeRegister(), CompletionType::Return, notReturnLabel.get());5239 emitJumpIfFalse(emitEqualityOp<OpStricteq>(newTemporary(), context.completionTypeRegister(), emitLoad(nullptr, CompletionType::Return)), notReturnLabel.get()); 5250 5240 5251 5241 // This case is for Return completion from the outermost finally context: … … 5271 5261 // possibilities are Normal or Throw. 5272 5262 5273 emitJumpIf <OpNstricteq>(context.completionTypeRegister(), CompletionType::Throw, normalCompletionLabel);5263 emitJumpIfFalse(emitEqualityOp<OpStricteq>(newTemporary(), context.completionTypeRegister(), emitLoad(nullptr, CompletionType::Throw)), normalCompletionLabel); 5274 5264 5275 5265 // We get here because we entered this finally context with Throw completionType (i.e. we have … … 5284 5274 5285 5275 emitThrow(context.completionValueRegister()); 5286 }5287 5288 template<typename CompareOp>5289 void BytecodeGenerator::emitJumpIf(RegisterID* completionTypeRegister, CompletionType type, Label& jumpTarget)5290 {5291 RefPtr<RegisterID> tempRegister = newTemporary();5292 RegisterID* valueConstant = addConstantValue(jsNumber(static_cast<int>(type)));5293 OperandTypes operandTypes = OperandTypes(ResultType::numberTypeIsInt32(), ResultType::unknownType());5294 5295 auto equivalenceResult = emitBinaryOp<CompareOp>(tempRegister.get(), completionTypeRegister, valueConstant, operandTypes);5296 emitJumpIfTrue(equivalenceResult, jumpTarget);5297 5276 } 5298 5277 -
trunk/Source/JavaScriptCore/bytecompiler/BytecodeGenerator.h
r273225 r273649 724 724 && BinaryOp::opcodeID != op_div, 725 725 RegisterID*> 726 emitBinaryOp(RegisterID* dst, RegisterID* src1, RegisterID* src2, OperandTypes )726 emitBinaryOp(RegisterID* dst, RegisterID* src1, RegisterID* src2, OperandTypes = OperandTypes()) 727 727 { 728 728 BinaryOp::emit(this, dst, src1, src2); … … 748 748 RegisterID* emitEqualityOp(RegisterID* dst, RegisterID* src1, RegisterID* src2) 749 749 { 750 static_assert(EqOp::opcodeID == op_eq || EqOp::opcodeID == op_stricteq); 750 751 if (!emitEqualityOpImpl(dst, src1, src2)) 751 752 EqOp::emit(this, dst, src1, src2); … … 1021 1022 void emitWillLeaveCallFrameDebugHook(); 1022 1023 1023 void emitLoad(RegisterID* completionTypeRegister, CompletionType type) 1024 { 1025 emitLoad(completionTypeRegister, JSValue(static_cast<int>(type))); 1026 } 1027 1028 template<typename CompareOp> 1029 void emitJumpIf(RegisterID* completionTypeRegister, CompletionType, Label& jumpTarget); 1024 RegisterID* emitLoad(RegisterID* dst, CompletionType type) { return emitLoad(dst, jsNumber(static_cast<int32_t>(type))); } 1025 RegisterID* emitLoad(RegisterID* dst, JSGenerator::ResumeMode mode) { return emitLoad(dst, jsNumber(static_cast<int32_t>(mode))); } 1030 1026 1031 1027 bool emitJumpViaFinallyIfNeeded(int targetLabelScopeDepth, Label& jumpTarget); -
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r273225 r273649 2245 2245 Ref<Label> haveThis = generator.newLabel(); 2246 2246 Ref<Label> end = generator.newLabel(); 2247 RefPtr<RegisterID> compareResult = generator.newTemporary(); 2248 RefPtr<RegisterID> indexZeroCompareResult = generator.emitBinaryOp<OpEq>(compareResult.get(), index.get(), generator.emitLoad(nullptr, jsNumber(0)), OperandTypes(ResultType::numberTypeIsInt32(), ResultType::numberTypeIsInt32())); 2249 generator.emitJumpIfFalse(indexZeroCompareResult.get(), haveThis.get()); 2247 generator.emitJumpIfFalse(generator.emitEqualityOp<OpStricteq>(generator.newTemporary(), index.get(), generator.emitLoad(nullptr, jsNumber(0))), haveThis.get()); 2250 2248 generator.move(thisRegister.get(), value); 2251 2249 generator.emitLoad(index.get(), jsNumber(1)); 2252 2250 generator.emitJump(end.get()); 2253 2251 generator.emitLabel(haveThis.get()); 2254 RefPtr<RegisterID> indexOneCompareResult = generator.emitBinaryOp<OpEq>(compareResult.get(), index.get(), generator.emitLoad(nullptr, jsNumber(1)), OperandTypes(ResultType::numberTypeIsInt32(), ResultType::numberTypeIsInt32())); 2255 generator.emitJumpIfFalse(indexOneCompareResult.get(), end.get()); 2252 generator.emitJumpIfFalse(generator.emitEqualityOp<OpStricteq>(generator.newTemporary(), index.get(), generator.emitLoad(nullptr, jsNumber(1))), end.get()); 2256 2253 generator.move(argumentsRegister.get(), value); 2257 2254 generator.emitLoad(index.get(), jsNumber(2)); … … 4213 4210 generator.emitLoopHint(); 4214 4211 4215 RefPtr<RegisterID> result = generator.emit EqualityOp<OpLess>(generator.newTemporary(), i.get(), length.get());4212 RefPtr<RegisterID> result = generator.emitBinaryOp<OpLess>(generator.newTemporary(), i.get(), length.get()); 4216 4213 generator.emitJumpIfFalse(result.get(), loopEnd.get()); 4217 4214 generator.emitHasEnumerableIndexedProperty(result.get(), base.get(), i.get()); … … 4619 4616 RefPtr<RegisterID> clauseVal = generator.newTemporary(); 4620 4617 generator.emitNode(clauseVal.get(), list->getClause()->expr()); 4621 generator.emitBinaryOp<OpStricteq>(clauseVal.get(), clauseVal.get(), switchExpression, OperandTypes());4622 labelVector.append( generator.newLabel());4623 generator.emitJumpIfTrue( clauseVal.get(), labelVector[labelVector.size() - 1].get());4618 Ref<Label> clauseLabel = generator.newLabel(); 4619 labelVector.append(clauseLabel); 4620 generator.emitJumpIfTrue(generator.emitEqualityOp<OpStricteq>(generator.newTemporary(), clauseVal.get(), switchExpression), clauseLabel.get()); 4624 4621 } 4625 4622 … … 4627 4624 RefPtr<RegisterID> clauseVal = generator.newTemporary(); 4628 4625 generator.emitNode(clauseVal.get(), list->getClause()->expr()); 4629 generator.emitBinaryOp<OpStricteq>(clauseVal.get(), clauseVal.get(), switchExpression, OperandTypes());4630 labelVector.append( generator.newLabel());4631 generator.emitJumpIfTrue( clauseVal.get(), labelVector[labelVector.size() - 1].get());4626 Ref<Label> clauseLabel = generator.newLabel(); 4627 labelVector.append(clauseLabel); 4628 generator.emitJumpIfTrue(generator.emitEqualityOp<OpStricteq>(generator.newTemporary(), clauseVal.get(), switchExpression), clauseLabel.get()); 4632 4629 } 4633 4630 generator.emitJump(defaultLabel.get()); … … 4964 4961 generator.move(args.argumentRegister(argumentCount++), generator.promiseRegister()); 4965 4962 generator.emitLoad(args.argumentRegister(argumentCount++), jsUndefined()); 4966 generator.emitLoad(args.argumentRegister(argumentCount++), jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)));4963 generator.emitLoad(args.argumentRegister(argumentCount++), JSGenerator::ResumeMode::NormalMode); 4967 4964 // JSTextPosition(int _line, int _offset, int _lineStartOffset) 4968 4965 JSTextPosition divot(firstLine(), startOffset(), lineStartOffset()); … … 4980 4977 Ref<Label> generatorBodyLabel = generator.newLabel(); 4981 4978 { 4982 RefPtr<RegisterID> condition = generator.newTemporary(); 4983 generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::NormalMode)))); 4984 generator.emitJumpIfTrue(condition.get(), generatorBodyLabel.get()); 4979 generator.emitJumpIfTrue(generator.emitEqualityOp<OpStricteq>(generator.newTemporary(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, JSGenerator::ResumeMode::NormalMode)), generatorBodyLabel.get()); 4985 4980 4986 4981 Ref<Label> throwLabel = generator.newLabel(); 4987 generator.emitEqualityOp<OpStricteq>(condition.get(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, jsNumber(static_cast<int32_t>(JSGenerator::ResumeMode::ThrowMode)))); 4988 generator.emitJumpIfTrue(condition.get(), throwLabel.get()); 4982 generator.emitJumpIfTrue(generator.emitEqualityOp<OpStricteq>(generator.newTemporary(), generator.generatorResumeModeRegister(), generator.emitLoad(nullptr, JSGenerator::ResumeMode::ThrowMode)), throwLabel.get()); 4989 4983 4990 4984 generator.emitReturn(generator.generatorValueRegister()); … … 5213 5207 generator.emitLoad(protoParent.get(), jsNull()); 5214 5208 5215 RefPtr<RegisterID> tempRegister = generator.newTemporary();5216 5217 5209 Ref<Label> superclassIsNullLabel = generator.newLabel(); 5218 generator.emitJumpIfTrue(generator.emitIsNull( tempRegister.get(), superclass.get()), superclassIsNullLabel.get());5210 generator.emitJumpIfTrue(generator.emitIsNull(generator.newTemporary(), superclass.get()), superclassIsNullLabel.get()); 5219 5211 5220 5212 Ref<Label> superclassIsConstructorLabel = generator.newLabel(); 5221 generator.emitJumpIfTrue(generator.emitIsConstructor( tempRegister.get(), superclass.get()), superclassIsConstructorLabel.get());5213 generator.emitJumpIfTrue(generator.emitIsConstructor(generator.newTemporary(), superclass.get()), superclassIsConstructorLabel.get()); 5222 5214 generator.emitThrowTypeError("The superclass is not a constructor."_s); 5223 5215 generator.emitLabel(superclassIsConstructorLabel.get()); … … 5225 5217 5226 5218 Ref<Label> protoParentIsObjectOrNullLabel = generator.newLabel(); 5227 generator.emitJumpIfTrue(generator.emitIsObject( tempRegister.get(), protoParent.get()), protoParentIsObjectOrNullLabel.get());5228 generator.emitJumpIfTrue(generator.emitIsNull( tempRegister.get(), protoParent.get()), protoParentIsObjectOrNullLabel.get());5219 generator.emitJumpIfTrue(generator.emitIsObject(generator.newTemporary(), protoParent.get()), protoParentIsObjectOrNullLabel.get()); 5220 generator.emitJumpIfTrue(generator.emitIsNull(generator.newTemporary(), protoParent.get()), protoParentIsObjectOrNullLabel.get()); 5229 5221 generator.emitThrowTypeError("The value of the superclass's prototype property is not an object or null."_s); 5230 5222 generator.emitLabel(protoParentIsObjectOrNullLabel.get());
Note:
See TracChangeset
for help on using the changeset viewer.