diff options
author | Li Jin <dragon-fly@qq.com> | 2022-02-11 11:14:00 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2022-02-11 11:14:00 +0800 |
commit | e549ca891fc42b78d97df3c46fb83f28bb74e01b (patch) | |
tree | 4d3e26824c43f92597694885e842e622dc01e9c4 | |
parent | 09fc831f540ce3966aeff679164f37e7d40457c9 (diff) | |
download | yuescript-e549ca891fc42b78d97df3c46fb83f28bb74e01b.tar.gz yuescript-e549ca891fc42b78d97df3c46fb83f28bb74e01b.tar.bz2 yuescript-e549ca891fc42b78d97df3c46fb83f28bb74e01b.zip |
add a missed local variable check.
-rw-r--r-- | spec/outputs/syntax.lua | 11 | ||||
-rwxr-xr-x | src/yuescript/yue_compiler.cpp | 22 |
2 files changed, 18 insertions, 15 deletions
diff --git a/spec/outputs/syntax.lua b/spec/outputs/syntax.lua index 4596a29..457f1e1 100644 --- a/spec/outputs/syntax.lua +++ b/spec/outputs/syntax.lua | |||
@@ -195,9 +195,10 @@ do | |||
195 | local _obj_2 = _with_0.a | 195 | local _obj_2 = _with_0.a |
196 | _obj_2.c = _obj_2.c + 1 | 196 | _obj_2.c = _obj_2.c + 1 |
197 | end | 197 | end |
198 | tb[#tb + 1] = 10 | 198 | local _obj_2 = tb |
199 | local _obj_2 = a.b.c | 199 | _obj_2[#_obj_2 + 1] = 10 |
200 | _obj_2[#_obj_2 + 1] = 1 | 200 | local _obj_3 = a.b.c |
201 | _obj_3[#_obj_3 + 1] = 1 | ||
201 | if v then | 202 | if v then |
202 | x[#x + 1] = 1 | 203 | x[#x + 1] = 1 |
203 | else | 204 | else |
@@ -205,12 +206,12 @@ else | |||
205 | end | 206 | end |
206 | do | 207 | do |
207 | local _with_0 = tb | 208 | local _with_0 = tb |
208 | local _obj_3 = _with_0.b.c | 209 | local _obj_4 = _with_0.b.c |
209 | do | 210 | do |
210 | local _with_1 = vec | 211 | local _with_1 = vec |
211 | _with_1.x = 1 | 212 | _with_1.x = 1 |
212 | _with_1.y = 2 | 213 | _with_1.y = 2 |
213 | _obj_3[#_obj_3 + 1] = _with_1 | 214 | _obj_4[#_obj_4 + 1] = _with_1 |
214 | end | 215 | end |
215 | end | 216 | end |
216 | x = 0 | 217 | x = 0 |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 33d4dcb..6617ec5 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
@@ -2023,17 +2023,9 @@ private: | |||
2023 | throw std::logic_error(_info.errorMessage("can not apply update to a metatable"sv, leftExp)); | 2023 | throw std::logic_error(_info.errorMessage("can not apply update to a metatable"sv, leftExp)); |
2024 | } | 2024 | } |
2025 | BLOCK_START | 2025 | BLOCK_START |
2026 | BREAK_IF(chain->items.size() < 2); | ||
2027 | if (chain->items.size() == 2) { | ||
2028 | if (auto callable = ast_cast<Callable_t>(chain->items.front())) { | ||
2029 | ast_node* var = callable->item.as<Variable_t>(); | ||
2030 | if (auto self = callable->item.as<SelfName_t>()) { | ||
2031 | var = self->name.as<self_t>(); | ||
2032 | } | ||
2033 | BREAK_IF(var); | ||
2034 | } | ||
2035 | } | ||
2036 | if (op == "#"sv) { | 2026 | if (op == "#"sv) { |
2027 | auto varName = singleVariableFrom(chain); | ||
2028 | BREAK_IF(!varName.empty() && isLocal(varName)); | ||
2037 | auto objVar = getUnusedName("_obj_"sv); | 2029 | auto objVar = getUnusedName("_obj_"sv); |
2038 | auto newAssignment = x->new_ptr<ExpListAssign_t>(); | 2030 | auto newAssignment = x->new_ptr<ExpListAssign_t>(); |
2039 | newAssignment->expList.set(toAst<ExpList_t>(objVar, x)); | 2031 | newAssignment->expList.set(toAst<ExpList_t>(objVar, x)); |
@@ -2044,6 +2036,16 @@ private: | |||
2044 | chain->items.clear(); | 2036 | chain->items.clear(); |
2045 | chain->items.push_back(toAst<Callable_t>(objVar, x)); | 2037 | chain->items.push_back(toAst<Callable_t>(objVar, x)); |
2046 | } else { | 2038 | } else { |
2039 | BREAK_IF(chain->items.size() < 2); | ||
2040 | if (chain->items.size() == 2) { | ||
2041 | if (auto callable = ast_cast<Callable_t>(chain->items.front())) { | ||
2042 | ast_node* var = callable->item.as<Variable_t>(); | ||
2043 | if (auto self = callable->item.as<SelfName_t>()) { | ||
2044 | var = self->name.as<self_t>(); | ||
2045 | } | ||
2046 | BREAK_IF(var && isLocal(_parser.toString(var))); | ||
2047 | } | ||
2048 | } | ||
2047 | auto tmpChain = x->new_ptr<ChainValue_t>(); | 2049 | auto tmpChain = x->new_ptr<ChainValue_t>(); |
2048 | ast_ptr<false, ast_node> ptr(chain->items.back()); | 2050 | ast_ptr<false, ast_node> ptr(chain->items.back()); |
2049 | for (auto item : chain->items.objects()) { | 2051 | for (auto item : chain->items.objects()) { |