diff options
| author | Li Jin <dragon-fly@qq.com> | 2024-03-21 15:42:54 +0800 |
|---|---|---|
| committer | Li Jin <dragon-fly@qq.com> | 2024-03-21 15:42:54 +0800 |
| commit | 4e3656da3711fd045fdf90dec7084bd4556c5b7f (patch) | |
| tree | 5030227e4b3b18d8b906077f7ffc6b5844152978 | |
| parent | 4a3cc26c6dfd74e61c8b6480038d6a292ea86e47 (diff) | |
| download | yuescript-0.23.2.tar.gz yuescript-0.23.2.tar.bz2 yuescript-0.23.2.zip | |
remove one more redundant 'do' block from try-catch.v0.23.2
| -rw-r--r-- | spec/outputs/5.1/attrib.lua | 15 | ||||
| -rw-r--r-- | spec/outputs/upvalue_func.lua | 16 | ||||
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 85 |
3 files changed, 63 insertions, 53 deletions
diff --git a/spec/outputs/5.1/attrib.lua b/spec/outputs/5.1/attrib.lua index af3f6cc..0edaf0e 100644 --- a/spec/outputs/5.1/attrib.lua +++ b/spec/outputs/5.1/attrib.lua | |||
| @@ -62,10 +62,7 @@ local _anon_func_1 = function(io) | |||
| 62 | _with_0:write("Hello") | 62 | _with_0:write("Hello") |
| 63 | return _with_0 | 63 | return _with_0 |
| 64 | end | 64 | end |
| 65 | local _anon_func_2 = function() | 65 | local _anon_func_2 = function() end |
| 66 | do | ||
| 67 | end | ||
| 68 | end | ||
| 69 | do | 66 | do |
| 70 | local v = (function() | 67 | local v = (function() |
| 71 | if flag then | 68 | if flag then |
| @@ -123,10 +120,7 @@ local _anon_func_5 = function(a, b) | |||
| 123 | } | 120 | } |
| 124 | end | 121 | end |
| 125 | end | 122 | end |
| 126 | local _anon_func_7 = function() | 123 | local _anon_func_7 = function() end |
| 127 | do | ||
| 128 | end | ||
| 129 | end | ||
| 130 | do | 124 | do |
| 131 | local a = (function() | 125 | local a = (function() |
| 132 | if true then | 126 | if true then |
| @@ -244,10 +238,7 @@ local _anon_func_11 = function(_, _close_2, error, _arg_0, ...) | |||
| 244 | end | 238 | end |
| 245 | end | 239 | end |
| 246 | end | 240 | end |
| 247 | local _anon_func_12 = function() | 241 | local _anon_func_12 = function() end |
| 248 | do | ||
| 249 | end | ||
| 250 | end | ||
| 251 | do | 242 | do |
| 252 | local _ = def(function() | 243 | local _ = def(function() |
| 253 | return print(3) | 244 | return print(3) |
diff --git a/spec/outputs/upvalue_func.lua b/spec/outputs/upvalue_func.lua index 14fe400..5113692 100644 --- a/spec/outputs/upvalue_func.lua +++ b/spec/outputs/upvalue_func.lua | |||
| @@ -368,11 +368,9 @@ local _anon_func_18 = function(print, select, _arg_0, ...) | |||
| 368 | end | 368 | end |
| 369 | end | 369 | end |
| 370 | local _anon_func_19 = function(print) | 370 | local _anon_func_19 = function(print) |
| 371 | do | 371 | local a = 1 |
| 372 | local a = 1 | 372 | print(a + nil) |
| 373 | print(a + nil) | 373 | return 1, 2, 3 |
| 374 | return 1, 2, 3 | ||
| 375 | end | ||
| 376 | end | 374 | end |
| 377 | local _anon_func_20 = function(cond, i) | 375 | local _anon_func_20 = function(cond, i) |
| 378 | local _accum_0 = { } | 376 | local _accum_0 = { } |
| @@ -516,11 +514,9 @@ local _anon_func_29 = function(os, _arg_0, ...) | |||
| 516 | end | 514 | end |
| 517 | end | 515 | end |
| 518 | local _anon_func_30 = function(debug_env_after, debug_env_before, env, func) | 516 | local _anon_func_30 = function(debug_env_after, debug_env_before, env, func) |
| 519 | do | 517 | debug_env_before(env) |
| 520 | debug_env_before(env) | 518 | func(env) |
| 521 | func(env) | 519 | return debug_env_after(env) |
| 522 | return debug_env_after(env) | ||
| 523 | end | ||
| 524 | end | 520 | end |
| 525 | do | 521 | do |
| 526 | local buff_strength | 522 | local buff_strength |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index ae6c0e4..14cb3e6 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.1"sv; | 78 | const std::string_view version = "0.23.2"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 { |
| @@ -3674,9 +3674,20 @@ private: | |||
| 3674 | } | 3674 | } |
| 3675 | } | 3675 | } |
| 3676 | 3676 | ||
| 3677 | std::optional<std::pair<std::string, str_list>> upValueFuncFrom(Exp_t* exp, str_list* ensureArgListInTheEnd = nullptr) { | 3677 | bool checkUpValueFuncAvailable(ast_node* node) { |
| 3678 | if (_funcLevel <= 1) return false; | ||
| 3679 | return node->traverse([&](ast_node* n) { | ||
| 3680 | switch (n->get_id()) { | ||
| 3681 | case id<MacroName_t>(): | ||
| 3682 | return traversal::Stop; | ||
| 3683 | } | ||
| 3684 | return traversal::Continue; | ||
| 3685 | }) != traversal::Stop; | ||
| 3686 | } | ||
| 3687 | |||
| 3688 | std::optional<std::pair<std::string, str_list>> getUpValueFuncFromBlock(Block_t* block, str_list* ensureArgListInTheEnd) { | ||
| 3678 | if (_funcLevel <= 1) return std::nullopt; | 3689 | if (_funcLevel <= 1) return std::nullopt; |
| 3679 | auto result = exp->traverse([&](ast_node* node) { | 3690 | auto result = block->traverse([&](ast_node* node) { |
| 3680 | switch (node->get_id()) { | 3691 | switch (node->get_id()) { |
| 3681 | case id<MacroName_t>(): | 3692 | case id<MacroName_t>(): |
| 3682 | return traversal::Stop; | 3693 | return traversal::Stop; |
| @@ -3687,7 +3698,8 @@ private: | |||
| 3687 | str_list args; | 3698 | str_list args; |
| 3688 | bool upVarsAssignedOrCaptured = false; | 3699 | bool upVarsAssignedOrCaptured = false; |
| 3689 | bool usedVar = false; | 3700 | bool usedVar = false; |
| 3690 | ast_ptr<false, Statement_t> stmt; | 3701 | auto x = block; |
| 3702 | ast_ptr<false, Block_t> newBlock(block); | ||
| 3691 | { | 3703 | { |
| 3692 | str_list globals; | 3704 | str_list globals; |
| 3693 | for (const auto& scope : _scopes) { | 3705 | for (const auto& scope : _scopes) { |
| @@ -3697,31 +3709,26 @@ private: | |||
| 3697 | } | 3709 | } |
| 3698 | } | 3710 | } |
| 3699 | } | 3711 | } |
| 3700 | auto returnNode = exp->new_ptr<Return_t>(); | ||
| 3701 | auto returnList = exp->new_ptr<ExpListLow_t>(); | ||
| 3702 | returnList->exprs.push_back(exp); | ||
| 3703 | returnNode->valueList.set(returnList); | ||
| 3704 | std::string codes; | 3712 | std::string codes; |
| 3705 | if (_withVars.empty()) { | 3713 | if (_withVars.empty()) { |
| 3706 | codes = YueFormat{}.toString(returnNode); | 3714 | codes = YueFormat{}.toString(block); |
| 3707 | stmt = exp->new_ptr<Statement_t>(); | ||
| 3708 | stmt->content.set(returnNode); | ||
| 3709 | } else { | 3715 | } else { |
| 3710 | auto withNode = exp->new_ptr<With_t>(); | 3716 | auto withNode = block->new_ptr<With_t>(); |
| 3711 | withNode->valueList.set(toAst<ExpList_t>(_withVars.top(), exp)); | 3717 | withNode->valueList.set(toAst<ExpList_t>(_withVars.top(), x)); |
| 3712 | auto returnStmt = exp->new_ptr<Statement_t>(); | 3718 | withNode->body.set(block); |
| 3713 | returnStmt->content.set(returnNode); | ||
| 3714 | withNode->body.set(returnStmt); | ||
| 3715 | codes = YueFormat{}.toString(withNode); | 3719 | codes = YueFormat{}.toString(withNode); |
| 3716 | stmt = exp->new_ptr<Statement_t>(); | 3720 | auto simpleValue = x->new_ptr<SimpleValue_t>(); |
| 3717 | auto simpleValue = exp->new_ptr<SimpleValue_t>(); | ||
| 3718 | simpleValue->value.set(withNode); | 3721 | simpleValue->value.set(withNode); |
| 3719 | auto newExpr = newExp(simpleValue, exp); | 3722 | auto newExpr = newExp(simpleValue, x); |
| 3720 | auto explist = exp->new_ptr<ExpList_t>(); | 3723 | auto explist = x->new_ptr<ExpList_t>(); |
| 3721 | explist->exprs.push_back(newExpr); | 3724 | explist->exprs.push_back(newExpr); |
| 3722 | auto expListAssign = exp->new_ptr<ExpListAssign_t>(); | 3725 | auto expListAssign = x->new_ptr<ExpListAssign_t>(); |
| 3723 | expListAssign->expList.set(explist); | 3726 | expListAssign->expList.set(explist); |
| 3727 | auto stmt = x->new_ptr<Statement_t>(); | ||
| 3724 | stmt->content.set(expListAssign); | 3728 | stmt->content.set(expListAssign); |
| 3729 | auto blk = x->new_ptr<Block_t>(); | ||
| 3730 | blk->statements.push_back(stmt); | ||
| 3731 | newBlock.set(blk); | ||
| 3725 | } | 3732 | } |
| 3726 | if (!globals.empty()) { | 3733 | if (!globals.empty()) { |
| 3727 | codes.insert(0, "global "s + join(globals, ","sv) + '\n'); | 3734 | codes.insert(0, "global "s + join(globals, ","sv) + '\n'); |
| @@ -3730,7 +3737,7 @@ private: | |||
| 3730 | config.lintGlobalVariable = true; | 3737 | config.lintGlobalVariable = true; |
| 3731 | auto result = YueCompiler{L, _luaOpen, true}.compile(codes, config); | 3738 | auto result = YueCompiler{L, _luaOpen, true}.compile(codes, config); |
| 3732 | if (result.error) { | 3739 | if (result.error) { |
| 3733 | YUEE("failed to compile dues to Yue formatter", exp); | 3740 | YUEE("failed to compile dues to Yue formatter", x); |
| 3734 | } | 3741 | } |
| 3735 | usedVar = result.usedVar; | 3742 | usedVar = result.usedVar; |
| 3736 | if (result.globals) { | 3743 | if (result.globals) { |
| @@ -3745,7 +3752,6 @@ private: | |||
| 3745 | } | 3752 | } |
| 3746 | } | 3753 | } |
| 3747 | if (!upVarsAssignedOrCaptured) { | 3754 | if (!upVarsAssignedOrCaptured) { |
| 3748 | auto x = exp; | ||
| 3749 | if (ensureArgListInTheEnd) { | 3755 | if (ensureArgListInTheEnd) { |
| 3750 | std::unordered_set<std::string> vars; | 3756 | std::unordered_set<std::string> vars; |
| 3751 | for (const auto& arg : args) { | 3757 | for (const auto& arg : args) { |
| @@ -3775,7 +3781,7 @@ private: | |||
| 3775 | } | 3781 | } |
| 3776 | } | 3782 | } |
| 3777 | auto funLit = toAst<FunLit_t>("("s + join(args, ","sv) + ")-> nil"s, x); | 3783 | auto funLit = toAst<FunLit_t>("("s + join(args, ","sv) + ")-> nil"s, x); |
| 3778 | funLit->body->content.set(stmt.get()); | 3784 | funLit->body->content.set(newBlock); |
| 3779 | funLit->noRecursion = true; | 3785 | funLit->noRecursion = true; |
| 3780 | auto simpleValue = x->new_ptr<SimpleValue_t>(); | 3786 | auto simpleValue = x->new_ptr<SimpleValue_t>(); |
| 3781 | simpleValue->value.set(funLit); | 3787 | simpleValue->value.set(funLit); |
| @@ -3796,6 +3802,29 @@ private: | |||
| 3796 | return std::nullopt; | 3802 | return std::nullopt; |
| 3797 | } | 3803 | } |
| 3798 | 3804 | ||
| 3805 | |||
| 3806 | std::optional<std::pair<std::string, str_list>> upValueFuncFrom(Block_t* block, str_list* ensureArgListInTheEnd = nullptr) { | ||
| 3807 | if (checkUpValueFuncAvailable(block)) { | ||
| 3808 | return getUpValueFuncFromBlock(block, ensureArgListInTheEnd); | ||
| 3809 | } | ||
| 3810 | return std::nullopt; | ||
| 3811 | } | ||
| 3812 | |||
| 3813 | std::optional<std::pair<std::string, str_list>> upValueFuncFrom(Exp_t* exp, str_list* ensureArgListInTheEnd = nullptr) { | ||
| 3814 | if (checkUpValueFuncAvailable(exp)) { | ||
| 3815 | auto returnNode = exp->new_ptr<Return_t>(); | ||
| 3816 | auto returnList = exp->new_ptr<ExpListLow_t>(); | ||
| 3817 | returnList->exprs.push_back(exp); | ||
| 3818 | returnNode->valueList.set(returnList); | ||
| 3819 | auto block = exp->new_ptr<Block_t>(); | ||
| 3820 | auto stmt = exp->new_ptr<Statement_t>(); | ||
| 3821 | stmt->content.set(returnNode); | ||
| 3822 | block->statements.push_back(stmt); | ||
| 3823 | return getUpValueFuncFromBlock(block, ensureArgListInTheEnd); | ||
| 3824 | } | ||
| 3825 | return std::nullopt; | ||
| 3826 | } | ||
| 3827 | |||
| 3799 | bool transformAsUpValueFunc(Exp_t* exp, str_list& out) { | 3828 | bool transformAsUpValueFunc(Exp_t* exp, str_list& out) { |
| 3800 | auto result = upValueFuncFrom(exp); | 3829 | auto result = upValueFuncFrom(exp); |
| 3801 | if (result) { | 3830 | if (result) { |
| @@ -9091,13 +9120,7 @@ private: | |||
| 9091 | } | 9120 | } |
| 9092 | if (auto tryBlock = tryNode->func.as<Block_t>()) { | 9121 | if (auto tryBlock = tryNode->func.as<Block_t>()) { |
| 9093 | { | 9122 | { |
| 9094 | auto body = tryBlock->new_ptr<Body_t>(); | 9123 | if (auto result = upValueFuncFrom(tryBlock)) { |
| 9095 | body->content.set(tryBlock); | ||
| 9096 | auto doNode = tryBlock->new_ptr<Do_t>(); | ||
| 9097 | doNode->body.set(body); | ||
| 9098 | auto simpleValue = tryBlock->new_ptr<SimpleValue_t>(); | ||
| 9099 | simpleValue->value.set(doNode); | ||
| 9100 | if (auto result = upValueFuncFrom(newExp(simpleValue, tryBlock))) { | ||
| 9101 | auto [funcName, args] = std::move(*result); | 9124 | auto [funcName, args] = std::move(*result); |
| 9102 | if (errHandler) { | 9125 | if (errHandler) { |
| 9103 | auto xpcall = toAst<ChainValue_t>("xpcall()", x); | 9126 | auto xpcall = toAst<ChainValue_t>("xpcall()", x); |
