diff options
Diffstat (limited to 'src/qml/jit/qv4baselineassembler.cpp')
-rw-r--r-- | src/qml/jit/qv4baselineassembler.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/qml/jit/qv4baselineassembler.cpp b/src/qml/jit/qv4baselineassembler.cpp index c7d8f3c72c..5950901499 100644 --- a/src/qml/jit/qv4baselineassembler.cpp +++ b/src/qml/jit/qv4baselineassembler.cpp @@ -66,6 +66,7 @@ namespace JIT { #define callHelper(x) PlatformAssemblerCommon::callRuntimeUnchecked(#x, reinterpret_cast<void *>(&x)) const QV4::Value::ValueTypeInternal IntegerTag = QV4::Value::ValueTypeInternal::Integer; +const QV4::Value::ValueTypeInternal EmptyTag = QV4::Value::ValueTypeInternal::Empty; static ReturnedValue toNumberHelper(ReturnedValue v) { @@ -172,6 +173,11 @@ public: return branch64(Equal, AccumulatorRegister, TrustedImm64(Primitive::emptyValue().asReturnedValue())); } + Jump jumpNotEmpty() + { + return branch64(NotEqual, AccumulatorRegister, TrustedImm64(Primitive::emptyValue().asReturnedValue())); + } + void toBoolean(std::function<void(RegisterID)> continuation) { urshift64(AccumulatorRegister, TrustedImm32(Value::IsIntegerConvertible_Shift), ScratchRegister); @@ -634,6 +640,11 @@ public: return branch32(Equal, AccumulatorRegisterTag, TrustedImm32(Primitive::emptyValue().asReturnedValue() >> 32)); } + Jump jumpNotEmpty() + { + return branch32(NotEqual, AccumulatorRegisterTag, TrustedImm32(Primitive::emptyValue().asReturnedValue() >> 32)); + } + void toBoolean(std::function<void(RegisterID)> continuation) { urshift32(AccumulatorRegisterTag, TrustedImm32(Value::IsIntegerConvertible_Shift - 32), @@ -1538,6 +1549,19 @@ void BaselineAssembler::popContext() pasm()->storeHeapObject(PlatformAssembler::ScratchRegister, regAddr(CallData::Context)); } +void BaselineAssembler::deadTemporalZoneCheck(int offsetForSavedIP, int variableName) +{ + auto valueIsAliveJump = pasm()->jumpNotEmpty(); + storeInstructionPointer(offsetForSavedIP); + saveAccumulatorInFrame(); + prepareCallWithArgCount(2); + passInt32AsArg(variableName, 1); + passEngineAsArg(0); + ASM_GENERATE_RUNTIME_CALL(Runtime::method_throwReferenceError, CallResultDestination::Ignore); + gotoCatchException(); + valueIsAliveJump.link(pasm()); +} + void BaselineAssembler::ret() { pasm()->generateFunctionExit(); |