aboutsummaryrefslogtreecommitdiff
path: root/src/yuescript/yue_compiler.cpp
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2024-05-23 16:30:05 +0800
committerLi Jin <dragon-fly@qq.com>2024-05-23 16:30:05 +0800
commit1890294226034d27165af016c8c93a484d978b49 (patch)
tree97f7f698aef1998ceb037080bd9f46b6f894e441 /src/yuescript/yue_compiler.cpp
parent06bf167924d04aaefe80d6e4ead40989a447ea34 (diff)
downloadyuescript-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.cpp48
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
78const std::string_view version = "0.23.6"sv; 78const std::string_view version = "0.23.7"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 {
@@ -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 }