From 1890294226034d27165af016c8c93a484d978b49 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Thu, 23 May 2024 16:30:05 +0800 Subject: prevent more anonymous functions generating from `const`, `close` decl. --- src/yuescript/yue_compiler.cpp | 48 +++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 7f6a042..04874d5 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp @@ -75,7 +75,7 @@ static std::unordered_set Metamethods = { "close"s // Lua 5.4 }; -const std::string_view version = "0.23.6"sv; +const std::string_view version = "0.23.7"sv; const std::string_view extension = "yue"sv; class CompileError : public std::logic_error { @@ -10294,10 +10294,25 @@ private: if (j != je) ++j; } bool checkValuesLater = false; - if (listA->names.size() > assignA->values.size()) { + for (ast_node* value : assignA->values.objects()) { + if (ast_is(value)) { + if (auto sVal = singleValueFrom(value)) { + if (auto spValue = sVal->item.as()) { + if (auto funLit = spValue->value.as()) { + if (!funLit->noRecursion) { + checkValuesLater = true; + } + break; + } + } + } + } + } + if (!checkValuesLater && assignA->values.size() > 0 && listA->names.size() >= assignA->values.size()) { BLOCK_START switch (assignA->values.back()->get_id()) { case id(): + case id(): case id(): checkValuesLater = true; break; @@ -10305,24 +10320,33 @@ private: BREAK_IF(checkValuesLater); auto value = singleValueFrom(assignA->values.back()); if (!value) { - _buf << listA->names.size() << " right values expected, got "sv << assignA->values.size(); - throw CompileError(clearBuf(), assignA->values.front()); + if (listA->names.size() > assignA->values.size()) { + _buf << listA->names.size() << " right values expected, got "sv << assignA->values.size(); + throw CompileError(clearBuf(), assignA->values.front()); + } else { + break; + } } if (auto val = value->item.as()) { switch (val->value->get_id()) { - case id(): - case id(): - case id(): - case id(): + case id(): + case id(): + case id(): + case id(): + case id(): + break; + default: checkValuesLater = true; break; } BREAK_IF(checkValuesLater); } - auto chainValue = value->item.as(); - if (!chainValue || !ast_is(chainValue->items.back())) { - _buf << listA->names.size() << " right values expected, got "sv << assignA->values.size(); - throw CompileError(clearBuf(), assignA->values.front()); + if (listA->names.size() > assignA->values.size()) { + auto chainValue = value->item.as(); + if (!chainValue || !ast_is(chainValue->items.back())) { + _buf << listA->names.size() << " right values expected, got "sv << assignA->values.size(); + throw CompileError(clearBuf(), assignA->values.front()); + } } BLOCK_END } -- cgit v1.2.3-55-g6feb