diff options
Diffstat (limited to '')
| -rw-r--r-- | spec/inputs/assign.yue | 4 | ||||
| -rw-r--r-- | spec/outputs/assign.lua | 27 | ||||
| -rw-r--r-- | 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 | |||
| 85 | do | 85 | do |
| 86 | {a} = :b = c.d = e = tab | 86 | {a} = :b = c.d = e = tab |
| 87 | 87 | ||
| 88 | do | ||
| 89 | val = 123 | ||
| 90 | a = b = c = val | ||
| 91 | |||
| 88 | nil | 92 | 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() | |||
| 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 |
| 157 | end) | 156 | 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 { | |||
| 60 | 60 | ||
| 61 | typedef std::list<std::string> str_list; | 61 | typedef std::list<std::string> str_list; |
| 62 | 62 | ||
| 63 | const std::string_view version = "0.15.16"sv; | 63 | const std::string_view version = "0.15.17"sv; |
| 64 | const std::string_view extension = "yue"sv; | 64 | const std::string_view extension = "yue"sv; |
| 65 | 65 | ||
| 66 | class YueCompilerImpl { | 66 | class 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 | } |
