aboutsummaryrefslogtreecommitdiff
path: root/src/yuescript/yue_compiler.cpp
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2022-02-09 10:14:25 +0800
committerLi Jin <dragon-fly@qq.com>2022-02-09 10:14:25 +0800
commit07a64933f8d956a8bba401db2200e6f7d8244dc9 (patch)
tree0a7da8fa2932fa89e317431b51fa1a3b19d97832 /src/yuescript/yue_compiler.cpp
parenta6744ed09b49b740dfc2852d655f5ed6dd471cbf (diff)
downloadyuescript-07a64933f8d956a8bba401db2200e6f7d8244dc9.tar.gz
yuescript-07a64933f8d956a8bba401db2200e6f7d8244dc9.tar.bz2
yuescript-07a64933f8d956a8bba401db2200e6f7d8244dc9.zip
fix the way update assignment is implemented.
Diffstat (limited to '')
-rwxr-xr-xsrc/yuescript/yue_compiler.cpp35
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;