diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-02-10 17:04:32 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-04-25 17:49:09 +0000 |
commit | b59b727035c4c1a4d235432cc67e5d89d3a24cd3 (patch) | |
tree | b452f39eab452a8a472dfc5c9b7e89ab4a354c1f /src/qml/jit | |
parent | 2683a22364f742e3809b6c48570b0b4aaf37b31f (diff) |
ES6: add support for default arguments for function parameters
The parser can also handle rest parameters correctly, this will
however require some additional work in the runtime to support
it correctly.
Change-Id: Ib6f4d27683774966b2d2aac075494d2f5066d2a2
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4assembler.cpp | 19 | ||||
-rw-r--r-- | src/qml/jit/qv4assembler_p.h | 1 | ||||
-rw-r--r-- | src/qml/jit/qv4jit.cpp | 5 | ||||
-rw-r--r-- | src/qml/jit/qv4jit_p.h | 1 |
4 files changed, 26 insertions, 0 deletions
diff --git a/src/qml/jit/qv4assembler.cpp b/src/qml/jit/qv4assembler.cpp index c3e16c4093..890d9d03a1 100644 --- a/src/qml/jit/qv4assembler.cpp +++ b/src/qml/jit/qv4assembler.cpp @@ -701,6 +701,12 @@ struct PlatformAssembler64 : PlatformAssemblerCommon PlatformAssemblerCommon::generateCatchTrampoline([this](){loadUndefined();}); } + void jumpNotUndefined(int offset) + { + auto jump = branch64(NotEqual, AccumulatorRegister, TrustedImm64(0)); + patches.push_back({ jump, offset }); + } + void toBoolean(std::function<void(RegisterID)> continuation) { urshift64(AccumulatorRegister, TrustedImm32(Value::IsIntegerConvertible_Shift), ScratchRegister); @@ -1136,6 +1142,14 @@ struct PlatformAssembler32 : PlatformAssemblerCommon push(TrustedImm32(v)); } + void jumpNotUndefined(int offset) + { + move(AccumulatorRegisterTag, ScratchRegister); + or32(AccumulatorRegisterValue, ScratchRegister); + auto jump = branch32(NotEqual, ScratchRegister, TrustedImm32(0)); + patches.push_back({ jump, offset }); + } + void toBoolean(std::function<void(RegisterID)> continuation) { urshift32(AccumulatorRegisterTag, TrustedImm32(Value::IsIntegerConvertible_Shift - 32), @@ -1982,6 +1996,11 @@ void Assembler::jumpFalse(int offset) }); } +void Assembler::jumpNotUndefined(int offset) +{ + pasm()->jumpNotUndefined(offset); +} + void Assembler::jumpStrictEqualStackSlotInt(int lhs, int rhs, int offset) { pasm()->jumpStrictEqualStackSlotInt(lhs, rhs, offset); diff --git a/src/qml/jit/qv4assembler_p.h b/src/qml/jit/qv4assembler_p.h index 37d4232a17..a98761c6ab 100644 --- a/src/qml/jit/qv4assembler_p.h +++ b/src/qml/jit/qv4assembler_p.h @@ -140,6 +140,7 @@ public: void jump(int offset); void jumpTrue(int offset); void jumpFalse(int offset); + void jumpNotUndefined(int offset); void jumpStrictEqualStackSlotInt(int lhs, int rhs, int offset); void jumpStrictNotEqualStackSlotInt(int lhs, int rhs, int offset); diff --git a/src/qml/jit/qv4jit.cpp b/src/qml/jit/qv4jit.cpp index bc46c0ca1d..ec446b63ec 100644 --- a/src/qml/jit/qv4jit.cpp +++ b/src/qml/jit/qv4jit.cpp @@ -816,6 +816,7 @@ void BaselineJIT::generate_Construct(int func, int argc, int argv) void BaselineJIT::generate_Jump(int offset) { as->jump(instructionOffset() + offset); } void BaselineJIT::generate_JumpTrue(int offset) { as->jumpTrue(instructionOffset() + offset); } void BaselineJIT::generate_JumpFalse(int offset) { as->jumpFalse(instructionOffset() + offset); } +void BaselineJIT::generate_JumpNotUndefined(int offset) { as->jumpNotUndefined(instructionOffset() + offset); } void BaselineJIT::generate_CmpEqNull() { as->cmpeqNull(); } void BaselineJIT::generate_CmpNeNull() { as->cmpneNull(); } @@ -1190,6 +1191,10 @@ void BaselineJIT::collectLabelsInBytecode() addLabel(code - start + offset); MOTH_END_INSTR(JumpFalse) + MOTH_BEGIN_INSTR(JumpNotUndefined) + addLabel(code - start + offset); + MOTH_END_INSTR(JumpUndefined) + MOTH_BEGIN_INSTR(CmpEqNull) MOTH_END_INSTR(CmpEqNull) diff --git a/src/qml/jit/qv4jit_p.h b/src/qml/jit/qv4jit_p.h index 5aebf78a8d..93fa7e7576 100644 --- a/src/qml/jit/qv4jit_p.h +++ b/src/qml/jit/qv4jit_p.h @@ -197,6 +197,7 @@ public: void generate_Jump(int offset) override; void generate_JumpTrue(int offset) override; void generate_JumpFalse(int offset) override; + void generate_JumpNotUndefined(int offset) override; void generate_CmpEqNull() override; void generate_CmpNeNull() override; void generate_CmpEqInt(int lhs) override; |