aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2022-11-22 09:53:46 +0800
committerLi Jin <dragon-fly@qq.com>2022-11-22 09:53:46 +0800
commit8d36b240cd0800bd5584d52cb5d19d0ae5371357 (patch)
tree9016aa87a946851a854452af838ad745e478365e
parent1b0bf8554e84bcd4d68dd2131838ea9c923ed694 (diff)
downloadyuescript-8d36b240cd0800bd5584d52cb5d19d0ae5371357.tar.gz
yuescript-8d36b240cd0800bd5584d52cb5d19d0ae5371357.tar.bz2
yuescript-8d36b240cd0800bd5584d52cb5d19d0ae5371357.zip
fix optimization case from issue #115.
-rw-r--r--spec/inputs/assign.yue4
-rw-r--r--spec/outputs/assign.lua27
-rw-r--r--src/yuescript/yue_compiler.cpp29
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
85do 85do
86 {a} = :b = c.d = e = tab 86 {a} = :b = c.d = e = tab
87 87
88do
89 val = 123
90 a = b = c = val
91
88nil 92nil
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()
135 local d = 0 135 local d = 0
136 end 136 end
137 do 137 do
138 local a 138 local a = f()
139 local b 139 local b = a
140 local c 140 local c = a
141 local d 141 local d = a
142 do
143 local _tmp_0 = f()
144 a = _tmp_0
145 b = _tmp_0
146 c = _tmp_0
147 d = _tmp_0
148 end
149 end 142 end
150 do 143 do
151 local a = tab[1]
152 local b = tab.b
153 c.d = tab
154 local e = tab 144 local e = tab
145 local a = e[1]
146 local b = e.b
147 c.d = e
148 end
149 do
150 local val = 123
151 local a = val
152 local b = val
153 local c = val
155 end 154 end
156 return nil 155 return nil
157end) 156end)
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 {
60 60
61typedef std::list<std::string> str_list; 61typedef std::list<std::string> str_list;
62 62
63const std::string_view version = "0.15.16"sv; 63const std::string_view version = "0.15.17"sv;
64const std::string_view extension = "yue"sv; 64const std::string_view extension = "yue"sv;
65 65
66class YueCompilerImpl { 66class YueCompilerImpl {
@@ -8161,7 +8161,32 @@ private:
8161 if (auto simpleVal = simpleSingleValueFrom(value)) { 8161 if (auto simpleVal = simpleSingleValueFrom(value)) {
8162 constVal = ast_is<const_value_t, Num_t>(simpleVal->value); 8162 constVal = ast_is<const_value_t, Num_t>(simpleVal->value);
8163 } 8163 }
8164 if (constVal || !singleVariableFrom(value, false).empty()) { 8164 bool localVal = false;
8165 if (auto var = singleVariableFrom(value, false); isLocal(var)) {
8166 localVal = true;
8167 }
8168 if (!constVal && !localVal) {
8169 for (auto exp : chainAssign->exprs.objects()) {
8170 std::string var = singleVariableFrom(exp, false);
8171 if (!var.empty()) {
8172 str_list temp;
8173 transformAssignment(assignmentFrom(static_cast<Exp_t*>(exp), value, exp), temp);
8174 auto newChainAssign = x->new_ptr<ChainAssign_t>();
8175 auto newAssign = x->new_ptr<Assign_t>();
8176 newAssign->values.push_back(exp);
8177 newChainAssign->assign.set(newAssign);
8178 for (auto e : chainAssign->exprs.objects()) {
8179 if (e != exp) {
8180 newChainAssign->exprs.push_back(e);
8181 }
8182 }
8183 transformChainAssign(newChainAssign, temp);
8184 out.push_back(join(temp));
8185 return;
8186 }
8187 }
8188 }
8189 if (constVal || localVal) {
8165 for (auto exp : chainAssign->exprs.objects()) { 8190 for (auto exp : chainAssign->exprs.objects()) {
8166 transformAssignment(assignmentFrom(static_cast<Exp_t*>(exp), value, exp), temp); 8191 transformAssignment(assignmentFrom(static_cast<Exp_t*>(exp), value, exp), temp);
8167 } 8192 }