diff options
author | Li Jin <dragon-fly@qq.com> | 2024-05-23 16:30:05 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2024-05-23 16:30:05 +0800 |
commit | 1890294226034d27165af016c8c93a484d978b49 (patch) | |
tree | 97f7f698aef1998ceb037080bd9f46b6f894e441 /src/yuescript/yue_compiler.cpp | |
parent | 06bf167924d04aaefe80d6e4ead40989a447ea34 (diff) | |
download | yuescript-1890294226034d27165af016c8c93a484d978b49.tar.gz yuescript-1890294226034d27165af016c8c93a484d978b49.tar.bz2 yuescript-1890294226034d27165af016c8c93a484d978b49.zip |
prevent more anonymous functions generating from `const`, `close` decl.
Diffstat (limited to '')
-rw-r--r-- | src/yuescript/yue_compiler.cpp | 48 |
1 files changed, 36 insertions, 12 deletions
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<std::string> Metamethods = { | |||
75 | "close"s // Lua 5.4 | 75 | "close"s // Lua 5.4 |
76 | }; | 76 | }; |
77 | 77 | ||
78 | const std::string_view version = "0.23.6"sv; | 78 | const std::string_view version = "0.23.7"sv; |
79 | const std::string_view extension = "yue"sv; | 79 | const std::string_view extension = "yue"sv; |
80 | 80 | ||
81 | class CompileError : public std::logic_error { | 81 | class CompileError : public std::logic_error { |
@@ -10294,10 +10294,25 @@ private: | |||
10294 | if (j != je) ++j; | 10294 | if (j != je) ++j; |
10295 | } | 10295 | } |
10296 | bool checkValuesLater = false; | 10296 | bool checkValuesLater = false; |
10297 | if (listA->names.size() > assignA->values.size()) { | 10297 | for (ast_node* value : assignA->values.objects()) { |
10298 | if (ast_is<Exp_t>(value)) { | ||
10299 | if (auto sVal = singleValueFrom(value)) { | ||
10300 | if (auto spValue = sVal->item.as<SimpleValue_t>()) { | ||
10301 | if (auto funLit = spValue->value.as<FunLit_t>()) { | ||
10302 | if (!funLit->noRecursion) { | ||
10303 | checkValuesLater = true; | ||
10304 | } | ||
10305 | break; | ||
10306 | } | ||
10307 | } | ||
10308 | } | ||
10309 | } | ||
10310 | } | ||
10311 | if (!checkValuesLater && assignA->values.size() > 0 && listA->names.size() >= assignA->values.size()) { | ||
10298 | BLOCK_START | 10312 | BLOCK_START |
10299 | switch (assignA->values.back()->get_id()) { | 10313 | switch (assignA->values.back()->get_id()) { |
10300 | case id<If_t>(): | 10314 | case id<If_t>(): |
10315 | case id<With_t>(): | ||
10301 | case id<Switch_t>(): | 10316 | case id<Switch_t>(): |
10302 | checkValuesLater = true; | 10317 | checkValuesLater = true; |
10303 | break; | 10318 | break; |
@@ -10305,24 +10320,33 @@ private: | |||
10305 | BREAK_IF(checkValuesLater); | 10320 | BREAK_IF(checkValuesLater); |
10306 | auto value = singleValueFrom(assignA->values.back()); | 10321 | auto value = singleValueFrom(assignA->values.back()); |
10307 | if (!value) { | 10322 | if (!value) { |
10308 | _buf << listA->names.size() << " right values expected, got "sv << assignA->values.size(); | 10323 | if (listA->names.size() > assignA->values.size()) { |
10309 | throw CompileError(clearBuf(), assignA->values.front()); | 10324 | _buf << listA->names.size() << " right values expected, got "sv << assignA->values.size(); |
10325 | throw CompileError(clearBuf(), assignA->values.front()); | ||
10326 | } else { | ||
10327 | break; | ||
10328 | } | ||
10310 | } | 10329 | } |
10311 | if (auto val = value->item.as<SimpleValue_t>()) { | 10330 | if (auto val = value->item.as<SimpleValue_t>()) { |
10312 | switch (val->value->get_id()) { | 10331 | switch (val->value->get_id()) { |
10313 | case id<If_t>(): | 10332 | case id<TableLit_t>(): |
10314 | case id<Switch_t>(): | 10333 | case id<ConstValue_t>(): |
10315 | case id<Do_t>(): | 10334 | case id<UnaryValue_t>(): |
10316 | case id<Try_t>(): | 10335 | case id<Num_t>(): |
10336 | case id<VarArg_t>(): | ||
10337 | break; | ||
10338 | default: | ||
10317 | checkValuesLater = true; | 10339 | checkValuesLater = true; |
10318 | break; | 10340 | break; |
10319 | } | 10341 | } |
10320 | BREAK_IF(checkValuesLater); | 10342 | BREAK_IF(checkValuesLater); |
10321 | } | 10343 | } |
10322 | auto chainValue = value->item.as<ChainValue_t>(); | 10344 | if (listA->names.size() > assignA->values.size()) { |
10323 | if (!chainValue || !ast_is<Invoke_t, InvokeArgs_t>(chainValue->items.back())) { | 10345 | auto chainValue = value->item.as<ChainValue_t>(); |
10324 | _buf << listA->names.size() << " right values expected, got "sv << assignA->values.size(); | 10346 | if (!chainValue || !ast_is<Invoke_t, InvokeArgs_t>(chainValue->items.back())) { |
10325 | throw CompileError(clearBuf(), assignA->values.front()); | 10347 | _buf << listA->names.size() << " right values expected, got "sv << assignA->values.size(); |
10348 | throw CompileError(clearBuf(), assignA->values.front()); | ||
10349 | } | ||
10326 | } | 10350 | } |
10327 | BLOCK_END | 10351 | BLOCK_END |
10328 | } | 10352 | } |