From 8d36b240cd0800bd5584d52cb5d19d0ae5371357 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Tue, 22 Nov 2022 09:53:46 +0800 Subject: fix optimization case from issue #115. --- spec/inputs/assign.yue | 4 ++++ spec/outputs/assign.lua | 27 +++++++++++++-------------- src/yuescript/yue_compiler.cpp | 29 +++++++++++++++++++++++++++-- 3 files changed, 44 insertions(+), 16 deletions(-) diff --git a/spec/inputs/assign.yue b/spec/inputs/assign.yue index 8c7848d..8ae5cac 100644 --- a/spec/inputs/assign.yue +++ b/spec/inputs/assign.yue @@ -85,4 +85,8 @@ do do {a} = :b = c.d = e = tab +do + val = 123 + a = b = c = val + nil diff --git a/spec/outputs/assign.lua b/spec/outputs/assign.lua index e638c47..d939769 100644 --- a/spec/outputs/assign.lua +++ b/spec/outputs/assign.lua @@ -135,23 +135,22 @@ return _(function() local d = 0 end do - local a - local b - local c - local d - do - local _tmp_0 = f() - a = _tmp_0 - b = _tmp_0 - c = _tmp_0 - d = _tmp_0 - end + local a = f() + local b = a + local c = a + local d = a end do - local a = tab[1] - local b = tab.b - c.d = tab local e = tab + local a = e[1] + local b = e.b + c.d = e + end + do + local val = 123 + local a = val + local b = val + local c = val end return nil end) diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index cf9f188..3e58305 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -60,7 +60,7 @@ namespace yue { typedef std::list str_list; -const std::string_view version = "0.15.16"sv; +const std::string_view version = "0.15.17"sv; const std::string_view extension = "yue"sv; class YueCompilerImpl { @@ -8161,7 +8161,32 @@ private: if (auto simpleVal = simpleSingleValueFrom(value)) { constVal = ast_is(simpleVal->value); } - if (constVal || !singleVariableFrom(value, false).empty()) { + bool localVal = false; + if (auto var = singleVariableFrom(value, false); isLocal(var)) { + localVal = true; + } + if (!constVal && !localVal) { + for (auto exp : chainAssign->exprs.objects()) { + std::string var = singleVariableFrom(exp, false); + if (!var.empty()) { + str_list temp; + transformAssignment(assignmentFrom(static_cast(exp), value, exp), temp); + auto newChainAssign = x->new_ptr(); + auto newAssign = x->new_ptr(); + newAssign->values.push_back(exp); + newChainAssign->assign.set(newAssign); + for (auto e : chainAssign->exprs.objects()) { + if (e != exp) { + newChainAssign->exprs.push_back(e); + } + } + transformChainAssign(newChainAssign, temp); + out.push_back(join(temp)); + return; + } + } + } + if (constVal || localVal) { for (auto exp : chainAssign->exprs.objects()) { transformAssignment(assignmentFrom(static_cast(exp), value, exp), temp); } -- cgit v1.2.3-55-g6feb