From 62ddb888d67d047324aa6c411d47aaeac9b658fd Mon Sep 17 00:00:00 2001 From: Li Jin Date: Tue, 19 Mar 2024 10:01:17 +0800 Subject: fix Lua 5.1 close attribute compatible function. --- src/yuescript/yue_compiler.cpp | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index de41b45..a443f39 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -4352,21 +4352,11 @@ private: } popScope(); auto okVar = getUnusedName("_ok_"sv); - std::string pCallStmtStr; - if (!_varArgs.empty() && _varArgs.top().hasVar) { - pCallStmtStr = okVar + ", ... = pcall((...)->, ...)"s; - } else { - pCallStmtStr = okVar + ", ... = pcall(->)"s; - } + std::string pCallStmtStr = okVar + ", ... = try\n\tnil"s; auto pCallStmt = toAst(pCallStmtStr, x); auto pCallExp = ast_to(pCallStmt->content.to()->action.to()->values.back()); auto value = singleValueFrom(pCallExp); - auto invoke = ast_to(value->item.to()->items.back()); - auto pCallValue = singleValueFrom(ast_to(invoke->args.front())); - auto pCallFunc = pCallValue->item.to()->value.to(); - auto pCallBody = x->new_ptr(); - pCallBody->content.set(followingBlock); - pCallFunc->body.set(pCallBody); + value->item.to()->value.to()->func.set(followingBlock); for (const auto& stmt : getCloses) { newBlock->statements.push_back(toAst(stmt, x)); } @@ -9028,6 +9018,7 @@ private: BREAK_IF(tryBlock->statements.size() != 1); auto stmt = static_cast(tryBlock->statements.front()); auto expListAssign = stmt->content.as(); + BREAK_IF(!expListAssign); BREAK_IF(expListAssign->action); auto value = singleValueFrom(expListAssign->expList); BREAK_IF(!value); @@ -9052,13 +9043,17 @@ private: auto invoke = ast_to(xpcall->items.back()); invoke->args.push_back(toAst(funcName, x)); invoke->args.push_back(errHandler); - invoke->args.dup(toAst(join(args, ","sv), x)->exprs); + if (!args.empty()) { + invoke->args.dup(toAst(join(args, ","sv), x)->exprs); + } transformChainValue(xpcall, out, ExpUsage::Closure); } else { auto pcall = toAst("pcall()", x); auto invoke = ast_to(pcall->items.back()); invoke->args.push_back(toAst(funcName, x)); - invoke->args.dup(toAst(join(args, ","sv), x)->exprs); + if (!args.empty()) { + invoke->args.dup(toAst(join(args, ","sv), x)->exprs); + } transformChainValue(pcall, out, ExpUsage::Closure); } if (usage == ExpUsage::Common) { -- cgit v1.2.3-55-g6feb