diff options
author | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-08-24 15:41:53 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@qt.io> | 2018-10-04 11:35:54 +0000 |
commit | 1c61e70a0c0f1718c538c04dcc80dd3039ccd384 (patch) | |
tree | 9be7d80be0bb8d00ee6b8f9500c7e4805ef3662e /src/qml/jit | |
parent | b2610d9d04c2a65d60b36ebf43e3a8d469c0397a (diff) |
ES7: Detect Tail Position Calls and pass that to the runtime
Doing the tail call in the runtime will come in a follow-up patch
Change-Id: I8224aac0edbdc765ee9b97703948edd52fd33f3e
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jit')
-rw-r--r-- | src/qml/jit/qv4baselinejit.cpp | 13 | ||||
-rw-r--r-- | src/qml/jit/qv4baselinejit_p.h | 1 |
2 files changed, 14 insertions, 0 deletions
diff --git a/src/qml/jit/qv4baselinejit.cpp b/src/qml/jit/qv4baselinejit.cpp index 7b4f2b00e7..70d1672689 100644 --- a/src/qml/jit/qv4baselinejit.cpp +++ b/src/qml/jit/qv4baselinejit.cpp @@ -552,6 +552,19 @@ void BaselineJIT::generate_CallWithSpread(int func, int thisObject, int argc, in as->checkException(); } +void BaselineJIT::generate_TailCall(int func, int thisObject, int argc, int argv) +{ + STORE_IP(); + as->prepareCallWithArgCount(5); + as->passInt32AsArg(argc, 4); + as->passJSSlotAsArg(argv, 3); + as->passJSSlotAsArg(thisObject, 2); + as->passJSSlotAsArg(func, 1); + as->passEngineAsArg(0); + BASELINEJIT_GENERATE_RUNTIME_CALL(Runtime::method_tailCall, CallResultDestination::InAccumulator); + as->checkException(); +} + void BaselineJIT::generate_Construct(int func, int argc, int argv) { diff --git a/src/qml/jit/qv4baselinejit_p.h b/src/qml/jit/qv4baselinejit_p.h index d4c1b074f6..47ad274d23 100644 --- a/src/qml/jit/qv4baselinejit_p.h +++ b/src/qml/jit/qv4baselinejit_p.h @@ -131,6 +131,7 @@ public: void generate_CallScopeObjectProperty(int propIdx, int base, int argc, int argv) override; void generate_CallContextObjectProperty(int propIdx, int base, int argc, int argv) override; void generate_CallWithSpread(int func, int thisObject, int argc, int argv) override; + void generate_TailCall(int func, int thisObject, int argc, int argv) override; void generate_Construct(int func, int argc, int argv) override; void generate_ConstructWithSpread(int func, int argc, int argv) override; void generate_SetUnwindHandler(int offset) override; |