diff options
author | Li Jin <dragon-fly@qq.com> | 2022-02-09 10:14:25 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2022-02-09 10:14:25 +0800 |
commit | 07a64933f8d956a8bba401db2200e6f7d8244dc9 (patch) | |
tree | 0a7da8fa2932fa89e317431b51fa1a3b19d97832 /src/yuescript/yue_compiler.cpp | |
parent | a6744ed09b49b740dfc2852d655f5ed6dd471cbf (diff) | |
download | yuescript-07a64933f8d956a8bba401db2200e6f7d8244dc9.tar.gz yuescript-07a64933f8d956a8bba401db2200e6f7d8244dc9.tar.bz2 yuescript-07a64933f8d956a8bba401db2200e6f7d8244dc9.zip |
fix the way update assignment is implemented.
Diffstat (limited to '')
-rwxr-xr-x | src/yuescript/yue_compiler.cpp | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 17822c6..852a0f4 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
@@ -2015,9 +2015,42 @@ private: | |||
2015 | auto leftValue = singleValueFrom(leftExp); | 2015 | auto leftValue = singleValueFrom(leftExp); |
2016 | if (!leftValue) throw std::logic_error(_info.errorMessage("left hand expression is not assignable"sv, leftExp)); | 2016 | if (!leftValue) throw std::logic_error(_info.errorMessage("left hand expression is not assignable"sv, leftExp)); |
2017 | if (auto chain = leftValue->item.as<ChainValue_t>()) { | 2017 | if (auto chain = leftValue->item.as<ChainValue_t>()) { |
2018 | if (specialChainValue(chain) == ChainType::Metatable) { | 2018 | auto dot = ast_cast<DotChainItem_t>(chain->items.back()); |
2019 | if (dot && dot->name.is<Metatable_t>()) { | ||
2019 | throw std::logic_error(_info.errorMessage("can not apply update to a metatable"sv, leftExp)); | 2020 | throw std::logic_error(_info.errorMessage("can not apply update to a metatable"sv, leftExp)); |
2020 | } | 2021 | } |
2022 | BLOCK_START | ||
2023 | BREAK_IF(chain->items.size() < 2); | ||
2024 | if (chain->items.size() == 2) { | ||
2025 | if (auto callable = ast_cast<Callable_t>(chain->items.front())) { | ||
2026 | ast_node* var = callable->item.as<Variable_t>(); | ||
2027 | if (auto self = callable->item.as<SelfName_t>()) { | ||
2028 | var = self->name.as<self_t>(); | ||
2029 | } | ||
2030 | BREAK_IF(var); | ||
2031 | } | ||
2032 | } | ||
2033 | auto tmpChain = x->new_ptr<ChainValue_t>(); | ||
2034 | ast_ptr<false, ast_node> ptr(chain->items.back()); | ||
2035 | for (auto item : chain->items.objects()) { | ||
2036 | if (item != ptr) { | ||
2037 | tmpChain->items.push_back(item); | ||
2038 | } | ||
2039 | } | ||
2040 | auto value = x->new_ptr<Value_t>(); | ||
2041 | value->item.set(tmpChain); | ||
2042 | auto exp = newExp(value, x); | ||
2043 | auto objVar = getUnusedName("_obj_"sv); | ||
2044 | auto newAssignment = x->new_ptr<ExpListAssign_t>(); | ||
2045 | newAssignment->expList.set(toAst<ExpList_t>(objVar, x)); | ||
2046 | auto assign = x->new_ptr<Assign_t>(); | ||
2047 | assign->values.push_back(exp); | ||
2048 | newAssignment->action.set(assign); | ||
2049 | transformAssignment(newAssignment, temp); | ||
2050 | chain->items.clear(); | ||
2051 | chain->items.push_back(toAst<Callable_t>(objVar, x)); | ||
2052 | chain->items.push_back(ptr); | ||
2053 | BLOCK_END | ||
2021 | auto tmpChain = x->new_ptr<ChainValue_t>(); | 2054 | auto tmpChain = x->new_ptr<ChainValue_t>(); |
2022 | for (auto item : chain->items.objects()) { | 2055 | for (auto item : chain->items.objects()) { |
2023 | bool itemAdded = false; | 2056 | bool itemAdded = false; |