aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2024-05-16 17:25:37 +0800
committerLi Jin <dragon-fly@qq.com>2024-05-16 17:25:37 +0800
commitfe317e2bdd9cb60b3c7cd347e21ce65cf90396e7 (patch)
treeed0b010b08f91fdb2bc9a4df18e8d638d47b1c7a /src
parentc857b3b83c7485693bfcc2b65e9e6e95107396f4 (diff)
downloadyuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.tar.gz
yuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.tar.bz2
yuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.zip
fix ambiguous issue in try-catch syntax.v0.23.4
Diffstat (limited to 'src')
-rw-r--r--src/yuescript/yue_compiler.cpp69
1 files changed, 57 insertions, 12 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index 9a632fb..c205031 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.23.3"sv; 78const std::string_view version = "0.23.4"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 {
@@ -4663,8 +4663,10 @@ private:
4663 return 503; 4663 return 503;
4664 } else if (target.value() == "5.4"sv) { 4664 } else if (target.value() == "5.4"sv) {
4665 return 504; 4665 return 504;
4666 } else if (target.value() == "5.5"sv) {
4667 return 505;
4666 } else { 4668 } else {
4667 throw CompileError("get invalid Lua target \""s + target.value() + "\", should be 5.1, 5.2, 5.3 or 5.4"s, x); 4669 throw CompileError("get invalid Lua target \""s + target.value() + "\", should be from 5.1 to 5.5"s, x);
4668 } 4670 }
4669 } 4671 }
4670#ifndef YUE_NO_MACRO 4672#ifndef YUE_NO_MACRO
@@ -9112,7 +9114,9 @@ private:
9112 body->content.set(tryNode->catchBlock->block); 9114 body->content.set(tryNode->catchBlock->block);
9113 funLit->body.set(body); 9115 funLit->body.set(body);
9114 } 9116 }
9115 if (auto tryBlock = tryNode->func.as<Block_t>()) { 9117 ast_sel<false, Block_t, Exp_t> tryFunc;
9118 tryFunc.set(tryNode->func);
9119 if (auto tryBlock = tryFunc.as<Block_t>()) {
9116 BLOCK_START 9120 BLOCK_START
9117 BREAK_IF(tryBlock->statements.size() != 1); 9121 BREAK_IF(tryBlock->statements.size() != 1);
9118 auto stmt = static_cast<Statement_t*>(tryBlock->statements.front()); 9122 auto stmt = static_cast<Statement_t*>(tryBlock->statements.front());
@@ -9124,11 +9128,43 @@ private:
9124 auto chainValue = value->item.as<ChainValue_t>(); 9128 auto chainValue = value->item.as<ChainValue_t>();
9125 BREAK_IF(!chainValue); 9129 BREAK_IF(!chainValue);
9126 BREAK_IF(!isChainValueCall(chainValue)); 9130 BREAK_IF(!isChainValueCall(chainValue));
9127 tryNode->func.set(expListAssign->expList->exprs.front()); 9131 auto tmpChain = chainValue->new_ptr<ChainValue_t>();
9132 tmpChain->items.dup(chainValue->items);
9133 tmpChain->items.pop_back();
9134 auto var = singleVariableFrom(tmpChain, AccessType::None);
9135 BREAK_IF(var.empty());
9136 tryFunc.set(expListAssign->expList->exprs.front());
9128 BLOCK_END 9137 BLOCK_END
9138 } else {
9139 auto tryExp = tryFunc.as<Exp_t>();
9140 bool needWrap = singleVariableFrom(tryExp, AccessType::None).empty();
9141 BLOCK_START
9142 auto value = singleValueFrom(tryExp);
9143 BREAK_IF(!value);
9144 auto chainValue = value->item.as<ChainValue_t>();
9145 BREAK_IF(!chainValue);
9146 BREAK_IF(!isChainValueCall(chainValue));
9147 auto tmpChain = chainValue->new_ptr<ChainValue_t>();
9148 tmpChain->items.dup(chainValue->items);
9149 tmpChain->items.pop_back();
9150 auto var = singleVariableFrom(tmpChain, AccessType::None);
9151 BREAK_IF(var.empty());
9152 needWrap = false;
9153 BLOCK_END
9154 if (needWrap) {
9155 auto expList = x->new_ptr<ExpList_t>();
9156 expList->exprs.push_back(tryFunc);
9157 auto expListAssign = x->new_ptr<ExpListAssign_t>();
9158 expListAssign->expList.set(expList);
9159 auto stmt = x->new_ptr<Statement_t>();
9160 stmt->content.set(expListAssign);
9161 auto block = x->new_ptr<Block_t>();
9162 block->statements.push_back(stmt);
9163 tryFunc.set(block);
9164 }
9129 } 9165 }
9130 if (auto tryBlock = tryNode->func.as<Block_t>()) { 9166 if (auto tryBlock = tryFunc.as<Block_t>()) {
9131 { 9167 if (getLuaTarget(tryBlock) >= 502 || !errHandler) {
9132 if (auto result = upValueFuncFrom(tryBlock)) { 9168 if (auto result = upValueFuncFrom(tryBlock)) {
9133 auto [funcName, args] = std::move(*result); 9169 auto [funcName, args] = std::move(*result);
9134 if (errHandler) { 9170 if (errHandler) {
@@ -9150,6 +9186,7 @@ private:
9150 transformChainValue(pcall, out, ExpUsage::Closure); 9186 transformChainValue(pcall, out, ExpUsage::Closure);
9151 } 9187 }
9152 if (usage == ExpUsage::Common) { 9188 if (usage == ExpUsage::Common) {
9189 out.back().insert(0, indent());
9153 out.back().append(nlr(x)); 9190 out.back().append(nlr(x));
9154 } 9191 }
9155 return; 9192 return;
@@ -9173,19 +9210,25 @@ private:
9173 transformChainValue(pcall, out, ExpUsage::Closure); 9210 transformChainValue(pcall, out, ExpUsage::Closure);
9174 } 9211 }
9175 if (usage == ExpUsage::Common) { 9212 if (usage == ExpUsage::Common) {
9213 out.back().insert(0, indent());
9176 out.back().append(nlr(x)); 9214 out.back().append(nlr(x));
9177 } 9215 }
9178 return; 9216 return;
9179 } else if (auto value = singleValueFrom(tryNode->func)) { 9217 } else if (auto value = singleValueFrom(tryFunc)) {
9180 BLOCK_START 9218 BLOCK_START
9181 auto chainValue = value->item.as<ChainValue_t>(); 9219 auto chainValue = value->item.as<ChainValue_t>();
9182 BREAK_IF(!chainValue); 9220 BREAK_IF(!chainValue);
9183 BREAK_IF(!isChainValueCall(chainValue)); 9221 BREAK_IF(!isChainValueCall(chainValue));
9222 auto tmpChain = chainValue->new_ptr<ChainValue_t>();
9223 tmpChain->items.dup(chainValue->items);
9224 tmpChain->items.pop_back();
9225 auto var = singleVariableFrom(tmpChain, AccessType::None);
9226 BREAK_IF(var.empty());
9184 if (errHandler && getLuaTarget(x) < 502) { 9227 if (errHandler && getLuaTarget(x) < 502) {
9185 auto tryExp = toAst<Exp_t>("->"sv, x); 9228 auto tryExp = toAst<Exp_t>("->"sv, x);
9186 auto funLit = simpleSingleValueFrom(tryExp)->value.to<FunLit_t>(); 9229 auto funLit = simpleSingleValueFrom(tryExp)->value.to<FunLit_t>();
9187 auto expList = x->new_ptr<ExpList_t>(); 9230 auto expList = x->new_ptr<ExpList_t>();
9188 expList->exprs.push_back(tryNode->func); 9231 expList->exprs.push_back(tryFunc);
9189 auto expListAssign = x->new_ptr<ExpListAssign_t>(); 9232 auto expListAssign = x->new_ptr<ExpListAssign_t>();
9190 expListAssign->expList.set(expList); 9233 expListAssign->expList.set(expList);
9191 auto stmt = x->new_ptr<Statement_t>(); 9234 auto stmt = x->new_ptr<Statement_t>();
@@ -9210,7 +9253,7 @@ private:
9210 if (errHandler) { 9253 if (errHandler) {
9211 auto xpcall = toAst<ChainValue_t>("xpcall()", x); 9254 auto xpcall = toAst<ChainValue_t>("xpcall()", x);
9212 auto invoke = ast_to<Invoke_t>(xpcall->items.back()); 9255 auto invoke = ast_to<Invoke_t>(xpcall->items.back());
9213 invoke->args.push_back(tryNode->func); 9256 invoke->args.push_back(tryFunc);
9214 invoke->args.push_back(errHandler); 9257 invoke->args.push_back(errHandler);
9215 for (auto arg : args->objects()) { 9258 for (auto arg : args->objects()) {
9216 invoke->args.push_back(arg); 9259 invoke->args.push_back(arg);
@@ -9219,7 +9262,7 @@ private:
9219 } else { 9262 } else {
9220 auto pcall = toAst<ChainValue_t>("pcall()", x); 9263 auto pcall = toAst<ChainValue_t>("pcall()", x);
9221 auto invoke = ast_to<Invoke_t>(pcall->items.back()); 9264 auto invoke = ast_to<Invoke_t>(pcall->items.back());
9222 invoke->args.push_back(tryNode->func); 9265 invoke->args.push_back(tryFunc);
9223 for (auto arg : args->objects()) { 9266 for (auto arg : args->objects()) {
9224 invoke->args.push_back(arg); 9267 invoke->args.push_back(arg);
9225 } 9268 }
@@ -9227,6 +9270,7 @@ private:
9227 } 9270 }
9228 } 9271 }
9229 if (usage == ExpUsage::Common) { 9272 if (usage == ExpUsage::Common) {
9273 out.back().insert(0, indent());
9230 out.back().append(nlr(x)); 9274 out.back().append(nlr(x));
9231 } 9275 }
9232 return; 9276 return;
@@ -9235,16 +9279,17 @@ private:
9235 if (errHandler) { 9279 if (errHandler) {
9236 auto xpcall = toAst<ChainValue_t>("xpcall()", x); 9280 auto xpcall = toAst<ChainValue_t>("xpcall()", x);
9237 auto invoke = ast_to<Invoke_t>(xpcall->items.back()); 9281 auto invoke = ast_to<Invoke_t>(xpcall->items.back());
9238 invoke->args.push_back(tryNode->func); 9282 invoke->args.push_back(tryFunc);
9239 invoke->args.push_back(errHandler); 9283 invoke->args.push_back(errHandler);
9240 transformChainValue(xpcall, out, ExpUsage::Closure); 9284 transformChainValue(xpcall, out, ExpUsage::Closure);
9241 } else { 9285 } else {
9242 auto pcall = toAst<ChainValue_t>("pcall()", x); 9286 auto pcall = toAst<ChainValue_t>("pcall()", x);
9243 auto invoke = ast_to<Invoke_t>(pcall->items.back()); 9287 auto invoke = ast_to<Invoke_t>(pcall->items.back());
9244 invoke->args.push_back(tryNode->func); 9288 invoke->args.push_back(tryFunc);
9245 transformChainValue(pcall, out, ExpUsage::Closure); 9289 transformChainValue(pcall, out, ExpUsage::Closure);
9246 } 9290 }
9247 if (usage == ExpUsage::Common) { 9291 if (usage == ExpUsage::Common) {
9292 out.back().insert(0, indent());
9248 out.back().append(nlr(x)); 9293 out.back().append(nlr(x));
9249 } 9294 }
9250 } 9295 }