From dfd3136313b35288aa994d4f4d3cc1d81bebf92f Mon Sep 17 00:00:00 2001 From: Stanislav Malishevskiy Date: Mon, 23 Oct 2023 17:51:50 +0300 Subject: [PATCH] Fix: [ArkTS frontend] wrong initobj.range code generated for lambda Description: For the scenario when lambda function cupture more then 4 external variables generate wrong bytecode: sta v0 sta v4 sta v2 sta v3 sta v5 initobj.range ....., v6 sta.obj v1 In that case regsters from v6 to v11 empty, and cause runtime issue with command initobj. So modify code to generate right bytecode sequence: mov.obj v0, v6 mov.obj v4, v7 mov.obj v2, v8 mov.obj v3, v9 mov.obj v5, v10 initobj.range ...., v6 sta.obj v1 This commit is adding right sequence for bytecode. Issue: https://gitee.com/openharmony/arkcompiler_ets_frontend/issues/I8I0UH Test: In separate repository: https://gitee.com/openharmony/arkcompiler_runtime_core/commit/4d0f4b3c227b9b4ce49d3cca9be545db4d771910 Signed-off-by: Stanislav Malishevskiy --- ets2panda/compiler/core/ETSGen.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ets2panda/compiler/core/ETSGen.cpp b/ets2panda/compiler/core/ETSGen.cpp index 30b8519653..a3c63d8378 100644 --- a/ets2panda/compiler/core/ETSGen.cpp +++ b/ets2panda/compiler/core/ETSGen.cpp @@ -673,7 +673,8 @@ void ETSGen::InitLambdaObject(const ir::AstNode *node, checker::Signature *signa for (size_t i = 0; i < arguments.size(); i++) { auto ttctx = TargetTypeContext(this, signature->Params()[i]->TsType()); - StoreAccumulator(node, arguments[i]); + VReg arg_reg = AllocReg(); + MoveVreg(node, arg_reg, arguments[i]); } Rra().Emit(node, arg_start, arguments.size(), name, arg_start); -- Gitee