diff options
Diffstat (limited to 'src')
| -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 | } |
