aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2024-02-28 11:58:24 +0800
committerLi Jin <dragon-fly@qq.com>2024-02-28 11:58:24 +0800
commita485837b528f268e88e6b65a62f252466cdb5923 (patch)
tree5940b1352bc0f38815abda9d8933763c45fb2668 /src
parent5ef5cff3efd030eb440133b5e4b2925bb9fe8ead (diff)
downloadyuescript-a485837b528f268e88e6b65a62f252466cdb5923.tar.gz
yuescript-a485837b528f268e88e6b65a62f252466cdb5923.tar.bz2
yuescript-a485837b528f268e88e6b65a62f252466cdb5923.zip
mark vars in for-loop const by default, because Lua 5.5 did it.
Diffstat (limited to 'src')
-rw-r--r--src/yuescript/yue_compiler.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index 30800e6..7a4aa62 100644
--- a/src/yuescript/yue_compiler.cpp
+++ b/src/yuescript/yue_compiler.cpp
@@ -75,7 +75,7 @@ static std::unordered_set<std::string> Metamethods = {
75 "close"s // Lua 5.4 75 "close"s // Lua 5.4
76}; 76};
77 77
78const std::string_view version = "0.21.8"sv; 78const std::string_view version = "0.22.0"sv;
79const std::string_view extension = "yue"sv; 79const std::string_view extension = "yue"sv;
80 80
81class CompileError : public std::logic_error { 81class CompileError : public std::logic_error {
@@ -6892,7 +6892,7 @@ private:
6892 auto x = nameList; 6892 auto x = nameList;
6893 str_list temp; 6893 str_list temp;
6894 str_list vars; 6894 str_list vars;
6895 str_list varBefore, varAfter; 6895 str_list varBefore, varConstAfter, varAfter;
6896 bool extraScope = false; 6896 bool extraScope = false;
6897 std::list<std::pair<ast_node*, ast_ptr<false, ast_node>>> destructPairs; 6897 std::list<std::pair<ast_node*, ast_ptr<false, ast_node>>> destructPairs;
6898 for (auto _item : nameList->items.objects()) { 6898 for (auto _item : nameList->items.objects()) {
@@ -6901,6 +6901,7 @@ private:
6901 case id<Variable_t>(): 6901 case id<Variable_t>():
6902 transformVariable(static_cast<Variable_t*>(item), vars); 6902 transformVariable(static_cast<Variable_t*>(item), vars);
6903 varAfter.push_back(vars.back()); 6903 varAfter.push_back(vars.back());
6904 varConstAfter.push_back(vars.back());
6904 break; 6905 break;
6905 case id<TableLit_t>(): { 6906 case id<TableLit_t>(): {
6906 auto desVar = getUnusedName("_des_"sv); 6907 auto desVar = getUnusedName("_des_"sv);
@@ -7034,6 +7035,7 @@ private:
7034 pushScope(); 7035 pushScope();
7035 for (const auto& var : vars) forceAddToScope(var); 7036 for (const auto& var : vars) forceAddToScope(var);
7036 for (const auto& var : varAfter) addToScope(var); 7037 for (const auto& var : varAfter) addToScope(var);
7038 for (const auto& var : varConstAfter) markVarConst(var);
7037 if (!destructPairs.empty()) { 7039 if (!destructPairs.empty()) {
7038 temp.clear(); 7040 temp.clear();
7039 for (auto& pair : destructPairs) { 7041 for (auto& pair : destructPairs) {
@@ -7048,6 +7050,7 @@ private:
7048 assignment->expList.set(expList); 7050 assignment->expList.set(expList);
7049 assignment->action.set(assign); 7051 assignment->action.set(assign);
7050 transformAssignment(assignment, temp); 7052 transformAssignment(assignment, temp);
7053 markDestructureConst(assignment);
7051 } 7054 }
7052 out.back().append(join(temp)); 7055 out.back().append(join(temp));
7053 } 7056 }
@@ -7118,6 +7121,7 @@ private:
7118 _buf << indent() << "for "sv << varName << " = "sv << start << ", "sv << stop << (step.empty() ? Empty : ", "s + step) << " do"sv << nll(var); 7121 _buf << indent() << "for "sv << varName << " = "sv << start << ", "sv << stop << (step.empty() ? Empty : ", "s + step) << " do"sv << nll(var);
7119 pushScope(); 7122 pushScope();
7120 forceAddToScope(varName); 7123 forceAddToScope(varName);
7124 markVarConst(varName);
7121 out.push_back(clearBuf()); 7125 out.push_back(clearBuf());
7122 } 7126 }
7123 7127