diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/yuescript/yue_compiler.cpp | 134 |
1 files changed, 100 insertions, 34 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index f1b6253..ca846a5 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
| @@ -56,7 +56,7 @@ using namespace parserlib; | |||
| 56 | 56 | ||
| 57 | typedef std::list<std::string> str_list; | 57 | typedef std::list<std::string> str_list; |
| 58 | 58 | ||
| 59 | const std::string_view version = "0.7.16"sv; | 59 | const std::string_view version = "0.7.17"sv; |
| 60 | const std::string_view extension = "yue"sv; | 60 | const std::string_view extension = "yue"sv; |
| 61 | 61 | ||
| 62 | class YueCompilerImpl { | 62 | class YueCompilerImpl { |
| @@ -109,7 +109,7 @@ public: | |||
| 109 | str_list out; | 109 | str_list out; |
| 110 | pushScope(); | 110 | pushScope(); |
| 111 | _enableReturn.push(_info.moduleName.empty()); | 111 | _enableReturn.push(_info.moduleName.empty()); |
| 112 | _varArgs.push(true); | 112 | _varArgs.push({true, false}); |
| 113 | transformBlock(_info.node.to<File_t>()->block, out, | 113 | transformBlock(_info.node.to<File_t>()->block, out, |
| 114 | config.implicitReturnRoot ? ExpUsage::Return : ExpUsage::Common, | 114 | config.implicitReturnRoot ? ExpUsage::Return : ExpUsage::Common, |
| 115 | nullptr, true); | 115 | nullptr, true); |
| @@ -192,7 +192,12 @@ private: | |||
| 192 | YueParser _parser; | 192 | YueParser _parser; |
| 193 | ParseInfo _info; | 193 | ParseInfo _info; |
| 194 | int _indentOffset = 0; | 194 | int _indentOffset = 0; |
| 195 | std::stack<bool> _varArgs; | 195 | struct VarArgState |
| 196 | { | ||
| 197 | bool hasVar; | ||
| 198 | bool usedVar; | ||
| 199 | }; | ||
| 200 | std::stack<VarArgState> _varArgs; | ||
| 196 | std::stack<bool> _enableReturn; | 201 | std::stack<bool> _enableReturn; |
| 197 | std::stack<std::string> _withVars; | 202 | std::stack<std::string> _withVars; |
| 198 | std::stack<std::string> _continueVars; | 203 | std::stack<std::string> _continueVars; |
| @@ -860,6 +865,26 @@ private: | |||
| 860 | return false; | 865 | return false; |
| 861 | } | 866 | } |
| 862 | 867 | ||
| 868 | void pushAnonVarArg() { | ||
| 869 | if (!_varArgs.empty() && _varArgs.top().hasVar) { | ||
| 870 | _varArgs.push({true, false}); | ||
| 871 | } else { | ||
| 872 | _varArgs.push({false, false}); | ||
| 873 | } | ||
| 874 | } | ||
| 875 | |||
| 876 | void popAnonVarArg() { | ||
| 877 | _varArgs.pop(); | ||
| 878 | } | ||
| 879 | |||
| 880 | std::string anonFuncStart() const { | ||
| 881 | return !_varArgs.empty() && _varArgs.top().hasVar && _varArgs.top().usedVar ? "(function(...)"s : "(function()"s; | ||
| 882 | } | ||
| 883 | |||
| 884 | std::string anonFuncEnd() const { | ||
| 885 | return !_varArgs.empty() && _varArgs.top().usedVar ? "end)(...)"s : "end)()"s; | ||
| 886 | } | ||
| 887 | |||
| 863 | std::string globalVar(std::string_view var, ast_node* x) { | 888 | std::string globalVar(std::string_view var, ast_node* x) { |
| 864 | std::string str(var); | 889 | std::string str(var); |
| 865 | if (_config.lintGlobalVariable) { | 890 | if (_config.lintGlobalVariable) { |
| @@ -1854,8 +1879,10 @@ private: | |||
| 1854 | return; | 1879 | return; |
| 1855 | } | 1880 | } |
| 1856 | str_list temp; | 1881 | str_list temp; |
| 1882 | std::string* funcStart = nullptr; | ||
| 1857 | if (usage == ExpUsage::Closure) { | 1883 | if (usage == ExpUsage::Closure) { |
| 1858 | temp.push_back("(function()"s + nll(nodes.front())); | 1884 | pushAnonVarArg(); |
| 1885 | funcStart = &temp.emplace_back(); | ||
| 1859 | pushScope(); | 1886 | pushScope(); |
| 1860 | _enableReturn.push(true); | 1887 | _enableReturn.push(true); |
| 1861 | } | 1888 | } |
| @@ -1969,7 +1996,9 @@ private: | |||
| 1969 | if (usage == ExpUsage::Closure) { | 1996 | if (usage == ExpUsage::Closure) { |
| 1970 | _enableReturn.pop(); | 1997 | _enableReturn.pop(); |
| 1971 | popScope(); | 1998 | popScope(); |
| 1972 | temp.push_back(indent() + "end)()"s); | 1999 | *funcStart = anonFuncStart() + nll(nodes.front()); |
| 2000 | temp.push_back(indent() + anonFuncEnd()); | ||
| 2001 | popAnonVarArg(); | ||
| 1973 | } | 2002 | } |
| 1974 | out.push_back(join(temp)); | 2003 | out.push_back(join(temp)); |
| 1975 | } | 2004 | } |
| @@ -2131,9 +2160,10 @@ private: | |||
| 2131 | break; | 2160 | break; |
| 2132 | } | 2161 | } |
| 2133 | case id<VarArg_t>(): | 2162 | case id<VarArg_t>(): |
| 2134 | if (_varArgs.empty() || !_varArgs.top()) { | 2163 | if (_varArgs.empty() || !_varArgs.top().hasVar) { |
| 2135 | throw std::logic_error(_info.errorMessage("cannot use '...' outside a vararg function near '...'"sv, item)); | 2164 | throw std::logic_error(_info.errorMessage("cannot use '...' outside a vararg function near '...'"sv, item)); |
| 2136 | } | 2165 | } |
| 2166 | _varArgs.top().usedVar = true; | ||
| 2137 | out.push_back("..."s); | 2167 | out.push_back("..."s); |
| 2138 | break; | 2168 | break; |
| 2139 | case id<Parens_t>(): transformParens(static_cast<Parens_t*>(item), out); break; | 2169 | case id<Parens_t>(): transformParens(static_cast<Parens_t*>(item), out); break; |
| @@ -2171,7 +2201,7 @@ private: | |||
| 2171 | 2201 | ||
| 2172 | void transformFunLit(FunLit_t* funLit, str_list& out) { | 2202 | void transformFunLit(FunLit_t* funLit, str_list& out) { |
| 2173 | _enableReturn.push(true); | 2203 | _enableReturn.push(true); |
| 2174 | _varArgs.push(false); | 2204 | _varArgs.push({false, false}); |
| 2175 | str_list temp; | 2205 | str_list temp; |
| 2176 | bool isFatArrow = _parser.toString(funLit->arrow) == "=>"sv; | 2206 | bool isFatArrow = _parser.toString(funLit->arrow) == "=>"sv; |
| 2177 | pushScope(); | 2207 | pushScope(); |
| @@ -2877,7 +2907,7 @@ private: | |||
| 2877 | arg.name = "..."sv; | 2907 | arg.name = "..."sv; |
| 2878 | if (varNames.empty()) varNames = arg.name; | 2908 | if (varNames.empty()) varNames = arg.name; |
| 2879 | else varNames.append(", "s + arg.name); | 2909 | else varNames.append(", "s + arg.name); |
| 2880 | _varArgs.top() = true; | 2910 | _varArgs.top().hasVar = true; |
| 2881 | } | 2911 | } |
| 2882 | if (assignSelf) { | 2912 | if (assignSelf) { |
| 2883 | for (const auto& item : argItems) { | 2913 | for (const auto& item : argItems) { |
| @@ -2996,8 +3026,10 @@ private: | |||
| 2996 | if (opIt != chainList.end()) { | 3026 | if (opIt != chainList.end()) { |
| 2997 | auto x = chainList.front(); | 3027 | auto x = chainList.front(); |
| 2998 | str_list temp; | 3028 | str_list temp; |
| 3029 | std::string* funcStart = nullptr; | ||
| 2999 | if (usage == ExpUsage::Closure) { | 3030 | if (usage == ExpUsage::Closure) { |
| 3000 | temp.push_back("(function()"s + nll(x)); | 3031 | pushAnonVarArg(); |
| 3032 | funcStart = &temp.emplace_back(); | ||
| 3001 | pushScope(); | 3033 | pushScope(); |
| 3002 | _enableReturn.push(true); | 3034 | _enableReturn.push(true); |
| 3003 | } | 3035 | } |
| @@ -3132,7 +3164,9 @@ private: | |||
| 3132 | temp.push_back(indent() + "return nil"s + nlr(x)); | 3164 | temp.push_back(indent() + "return nil"s + nlr(x)); |
| 3133 | _enableReturn.pop(); | 3165 | _enableReturn.pop(); |
| 3134 | popScope(); | 3166 | popScope(); |
| 3135 | temp.push_back(indent() + "end)()"s); | 3167 | *funcStart = anonFuncStart() + nll(x); |
| 3168 | temp.push_back(indent() + anonFuncEnd()); | ||
| 3169 | popAnonVarArg(); | ||
| 3136 | break; | 3170 | break; |
| 3137 | default: | 3171 | default: |
| 3138 | break; | 3172 | break; |
| @@ -3147,13 +3181,15 @@ private: | |||
| 3147 | if (ast_is<ColonChainItem_t>(chainList.back())) { | 3181 | if (ast_is<ColonChainItem_t>(chainList.back())) { |
| 3148 | auto x = chainList.front(); | 3182 | auto x = chainList.front(); |
| 3149 | str_list temp; | 3183 | str_list temp; |
| 3184 | std::string* funcStart = nullptr; | ||
| 3150 | switch (usage) { | 3185 | switch (usage) { |
| 3151 | case ExpUsage::Assignment: | 3186 | case ExpUsage::Assignment: |
| 3152 | temp.push_back(indent() + "do"s + nll(x)); | 3187 | temp.push_back(indent() + "do"s + nll(x)); |
| 3153 | pushScope(); | 3188 | pushScope(); |
| 3154 | break; | 3189 | break; |
| 3155 | case ExpUsage::Closure: | 3190 | case ExpUsage::Closure: |
| 3156 | temp.push_back("(function()"s + nll(x)); | 3191 | pushAnonVarArg(); |
| 3192 | funcStart = &temp.emplace_back(); | ||
| 3157 | pushScope(); | 3193 | pushScope(); |
| 3158 | _enableReturn.push(true); | 3194 | _enableReturn.push(true); |
| 3159 | break; | 3195 | break; |
| @@ -3229,7 +3265,9 @@ private: | |||
| 3229 | case ExpUsage::Closure: | 3265 | case ExpUsage::Closure: |
| 3230 | _enableReturn.pop(); | 3266 | _enableReturn.pop(); |
| 3231 | popScope(); | 3267 | popScope(); |
| 3232 | temp.push_back(indent() + "end)()"s); | 3268 | *funcStart = anonFuncStart() + nll(x); |
| 3269 | temp.push_back(indent() + anonFuncEnd()); | ||
| 3270 | popAnonVarArg(); | ||
| 3233 | break; | 3271 | break; |
| 3234 | default: | 3272 | default: |
| 3235 | break; | 3273 | break; |
| @@ -3960,6 +3998,7 @@ private: | |||
| 3960 | case ExpUsage::Closure: | 3998 | case ExpUsage::Closure: |
| 3961 | _enableReturn.push(true); | 3999 | _enableReturn.push(true); |
| 3962 | pushScope(); | 4000 | pushScope(); |
| 4001 | pushAnonVarArg(); | ||
| 3963 | break; | 4002 | break; |
| 3964 | case ExpUsage::Assignment: | 4003 | case ExpUsage::Assignment: |
| 3965 | pushScope(); | 4004 | pushScope(); |
| @@ -4019,8 +4058,9 @@ private: | |||
| 4019 | out.push_back(clearBuf()); | 4058 | out.push_back(clearBuf()); |
| 4020 | out.back().append(indent() + "return "s + accumVar + nlr(comp)); | 4059 | out.back().append(indent() + "return "s + accumVar + nlr(comp)); |
| 4021 | popScope(); | 4060 | popScope(); |
| 4022 | out.back().insert(0, "(function()"s + nll(comp)); | 4061 | out.back().insert(0, anonFuncStart() + nll(comp)); |
| 4023 | out.back().append(indent() + "end)()"s); | 4062 | out.back().append(indent() + anonFuncEnd()); |
| 4063 | popAnonVarArg(); | ||
| 4024 | break; | 4064 | break; |
| 4025 | } | 4065 | } |
| 4026 | case ExpUsage::Assignment: { | 4066 | case ExpUsage::Assignment: { |
| @@ -4345,14 +4385,17 @@ private: | |||
| 4345 | 4385 | ||
| 4346 | void transformForClosure(For_t* forNode, str_list& out) { | 4386 | void transformForClosure(For_t* forNode, str_list& out) { |
| 4347 | str_list temp; | 4387 | str_list temp; |
| 4348 | _buf << "(function()"sv << nll(forNode); | 4388 | pushAnonVarArg(); |
| 4389 | std::string& funcStart = temp.emplace_back(); | ||
| 4349 | pushScope(); | 4390 | pushScope(); |
| 4350 | _enableReturn.push(true); | 4391 | _enableReturn.push(true); |
| 4351 | auto accum = transformForInner(forNode, temp); | 4392 | auto accum = transformForInner(forNode, temp); |
| 4352 | temp.push_back(indent() + "return "s + accum + nlr(forNode)); | 4393 | temp.push_back(indent() + "return "s + accum + nlr(forNode)); |
| 4353 | _enableReturn.pop(); | 4394 | _enableReturn.pop(); |
| 4354 | popScope(); | 4395 | popScope(); |
| 4355 | temp.push_back(indent() + "end)()"s); | 4396 | funcStart = anonFuncStart() + nll(forNode); |
| 4397 | temp.push_back(indent() + anonFuncEnd()); | ||
| 4398 | popAnonVarArg(); | ||
| 4356 | out.push_back(join(temp)); | 4399 | out.push_back(join(temp)); |
| 4357 | } | 4400 | } |
| 4358 | 4401 | ||
| @@ -4414,14 +4457,17 @@ private: | |||
| 4414 | 4457 | ||
| 4415 | void transformForEachClosure(ForEach_t* forEach, str_list& out) { | 4458 | void transformForEachClosure(ForEach_t* forEach, str_list& out) { |
| 4416 | str_list temp; | 4459 | str_list temp; |
| 4417 | _buf << "(function()"sv << nll(forEach); | 4460 | pushAnonVarArg(); |
| 4461 | std::string& funcStart = temp.emplace_back(); | ||
| 4418 | pushScope(); | 4462 | pushScope(); |
| 4419 | _enableReturn.push(true); | 4463 | _enableReturn.push(true); |
| 4420 | auto accum = transformForEachInner(forEach, temp); | 4464 | auto accum = transformForEachInner(forEach, temp); |
| 4421 | temp.push_back(indent() + "return "s + accum + nlr(forEach)); | 4465 | temp.push_back(indent() + "return "s + accum + nlr(forEach)); |
| 4422 | _enableReturn.pop(); | 4466 | _enableReturn.pop(); |
| 4423 | popScope(); | 4467 | popScope(); |
| 4424 | temp.push_back(indent() + "end)()"s); | 4468 | funcStart = anonFuncStart() + nll(forEach); |
| 4469 | temp.push_back(indent() + anonFuncEnd()); | ||
| 4470 | popAnonVarArg(); | ||
| 4425 | out.push_back(join(temp)); | 4471 | out.push_back(join(temp)); |
| 4426 | } | 4472 | } |
| 4427 | 4473 | ||
| @@ -4566,13 +4612,16 @@ private: | |||
| 4566 | 4612 | ||
| 4567 | void transformClassDeclClosure(ClassDecl_t* classDecl, str_list& out) { | 4613 | void transformClassDeclClosure(ClassDecl_t* classDecl, str_list& out) { |
| 4568 | str_list temp; | 4614 | str_list temp; |
| 4569 | temp.push_back("(function()"s + nll(classDecl)); | 4615 | pushAnonVarArg(); |
| 4616 | std::string& funcStart = temp.emplace_back(); | ||
| 4570 | pushScope(); | 4617 | pushScope(); |
| 4571 | _enableReturn.push(true); | 4618 | _enableReturn.push(true); |
| 4572 | transformClassDecl(classDecl, temp, ExpUsage::Return); | 4619 | transformClassDecl(classDecl, temp, ExpUsage::Return); |
| 4573 | _enableReturn.pop(); | 4620 | _enableReturn.pop(); |
| 4574 | popScope(); | 4621 | popScope(); |
| 4575 | temp.push_back("end)()"s); | 4622 | funcStart = anonFuncStart() + nll(classDecl); |
| 4623 | temp.push_back(indent() + anonFuncEnd()); | ||
| 4624 | popAnonVarArg(); | ||
| 4576 | out.push_back(join(temp)); | 4625 | out.push_back(join(temp)); |
| 4577 | } | 4626 | } |
| 4578 | 4627 | ||
| @@ -4744,15 +4793,15 @@ private: | |||
| 4744 | if (extend) { | 4793 | if (extend) { |
| 4745 | _buf << indent(1) << "__init = function(self, ...)"sv << nll(classDecl); | 4794 | _buf << indent(1) << "__init = function(self, ...)"sv << nll(classDecl); |
| 4746 | _buf << indent(2) << "return _class_0.__parent.__init(self, ...)"sv << nll(classDecl); | 4795 | _buf << indent(2) << "return _class_0.__parent.__init(self, ...)"sv << nll(classDecl); |
| 4747 | _buf << indent(1) << "end,"sv << nll(classDecl); | 4796 | _buf << indent(1) << "end,"sv << nll(classDecl); |
| 4748 | } else { | 4797 | } else { |
| 4749 | _buf << indent(1) << "__init = function() end,"sv << nll(classDecl); | 4798 | _buf << indent(1) << "__init = function() end,"sv << nll(classDecl); |
| 4750 | } | 4799 | } |
| 4751 | } | 4800 | } |
| 4752 | _buf << indent(1) << "__base = "sv << baseVar; | 4801 | _buf << indent(1) << "__base = "sv << baseVar; |
| 4753 | if (!className.empty()) { | 4802 | if (!className.empty()) { |
| 4754 | _buf << ","sv << nll(classDecl); | 4803 | _buf << ","sv << nll(classDecl); |
| 4755 | _buf << indent(1) << "__name = "sv << className; | 4804 | _buf << indent(1) << "__name = "sv << className; |
| 4756 | } | 4805 | } |
| 4757 | if (extend) { | 4806 | if (extend) { |
| 4758 | _buf << ","sv << nll(classDecl); | 4807 | _buf << ","sv << nll(classDecl); |
| @@ -4931,13 +4980,16 @@ private: | |||
| 4931 | 4980 | ||
| 4932 | void transformWithClosure(With_t* with, str_list& out) { | 4981 | void transformWithClosure(With_t* with, str_list& out) { |
| 4933 | str_list temp; | 4982 | str_list temp; |
| 4934 | temp.push_back("(function()"s + nll(with)); | 4983 | pushAnonVarArg(); |
| 4984 | std::string& funcStart = temp.emplace_back(); | ||
| 4935 | pushScope(); | 4985 | pushScope(); |
| 4936 | _enableReturn.push(true); | 4986 | _enableReturn.push(true); |
| 4937 | transformWith(with, temp, nullptr, true); | 4987 | transformWith(with, temp, nullptr, true); |
| 4938 | _enableReturn.pop(); | 4988 | _enableReturn.pop(); |
| 4939 | popScope(); | 4989 | popScope(); |
| 4940 | temp.push_back(indent() + "end)()"s); | 4990 | funcStart = anonFuncStart() + nll(with); |
| 4991 | temp.push_back(indent() + anonFuncEnd()); | ||
| 4992 | popAnonVarArg(); | ||
| 4941 | out.push_back(join(temp)); | 4993 | out.push_back(join(temp)); |
| 4942 | } | 4994 | } |
| 4943 | 4995 | ||
| @@ -5340,6 +5392,7 @@ private: | |||
| 5340 | case ExpUsage::Closure: | 5392 | case ExpUsage::Closure: |
| 5341 | pushScope(); | 5393 | pushScope(); |
| 5342 | _enableReturn.push(true); | 5394 | _enableReturn.push(true); |
| 5395 | pushAnonVarArg(); | ||
| 5343 | break; | 5396 | break; |
| 5344 | case ExpUsage::Assignment: | 5397 | case ExpUsage::Assignment: |
| 5345 | pushScope(); | 5398 | pushScope(); |
| @@ -5397,8 +5450,9 @@ private: | |||
| 5397 | out.push_back(clearBuf() + indent() + "return "s + tbl + nlr(comp)); | 5450 | out.push_back(clearBuf() + indent() + "return "s + tbl + nlr(comp)); |
| 5398 | popScope(); | 5451 | popScope(); |
| 5399 | _enableReturn.pop(); | 5452 | _enableReturn.pop(); |
| 5400 | out.back().insert(0, "(function()"s + nll(comp)); | 5453 | out.back().insert(0, anonFuncStart() + nll(comp)); |
| 5401 | out.back().append(indent() + "end)()"s); | 5454 | out.back().append(indent() + anonFuncEnd()); |
| 5455 | popAnonVarArg(); | ||
| 5402 | break; | 5456 | break; |
| 5403 | case ExpUsage::Assignment: { | 5457 | case ExpUsage::Assignment: { |
| 5404 | out.push_back(clearBuf()); | 5458 | out.push_back(clearBuf()); |
| @@ -5452,9 +5506,11 @@ private: | |||
| 5452 | 5506 | ||
| 5453 | void transformDo(Do_t* doNode, str_list& out, ExpUsage usage, ExpList_t* assignList = nullptr) { | 5507 | void transformDo(Do_t* doNode, str_list& out, ExpUsage usage, ExpList_t* assignList = nullptr) { |
| 5454 | str_list temp; | 5508 | str_list temp; |
| 5509 | std::string* funcStart = nullptr; | ||
| 5455 | if (usage == ExpUsage::Closure) { | 5510 | if (usage == ExpUsage::Closure) { |
| 5456 | temp.push_back("(function()"s + nll(doNode)); | ||
| 5457 | _enableReturn.push(true); | 5511 | _enableReturn.push(true); |
| 5512 | pushAnonVarArg(); | ||
| 5513 | funcStart = &temp.emplace_back(); | ||
| 5458 | } else { | 5514 | } else { |
| 5459 | temp.push_back(indent() + "do"s + nll(doNode)); | 5515 | temp.push_back(indent() + "do"s + nll(doNode)); |
| 5460 | } | 5516 | } |
| @@ -5463,7 +5519,9 @@ private: | |||
| 5463 | popScope(); | 5519 | popScope(); |
| 5464 | if (usage == ExpUsage::Closure) { | 5520 | if (usage == ExpUsage::Closure) { |
| 5465 | _enableReturn.pop(); | 5521 | _enableReturn.pop(); |
| 5466 | temp.push_back(indent() + "end)()"s); | 5522 | *funcStart = anonFuncStart() + nll(doNode); |
| 5523 | temp.push_back(indent() + anonFuncEnd()); | ||
| 5524 | popAnonVarArg(); | ||
| 5467 | } else { | 5525 | } else { |
| 5468 | temp.push_back(indent() + "end"s + nlr(doNode)); | 5526 | temp.push_back(indent() + "end"s + nlr(doNode)); |
| 5469 | } | 5527 | } |
| @@ -5769,7 +5827,8 @@ private: | |||
| 5769 | void transformWhileClosure(While_t* whileNode, str_list& out) { | 5827 | void transformWhileClosure(While_t* whileNode, str_list& out) { |
| 5770 | auto x = whileNode; | 5828 | auto x = whileNode; |
| 5771 | str_list temp; | 5829 | str_list temp; |
| 5772 | temp.push_back("(function() "s + nll(whileNode)); | 5830 | pushAnonVarArg(); |
| 5831 | std::string& funcStart = temp.emplace_back(); | ||
| 5773 | pushScope(); | 5832 | pushScope(); |
| 5774 | _enableReturn.push(true); | 5833 | _enableReturn.push(true); |
| 5775 | auto accumVar = getUnusedName("_accum_"sv); | 5834 | auto accumVar = getUnusedName("_accum_"sv); |
| @@ -5790,7 +5849,9 @@ private: | |||
| 5790 | temp.push_back(indent() + "return "s + accumVar + nlr(whileNode)); | 5849 | temp.push_back(indent() + "return "s + accumVar + nlr(whileNode)); |
| 5791 | _enableReturn.pop(); | 5850 | _enableReturn.pop(); |
| 5792 | popScope(); | 5851 | popScope(); |
| 5793 | temp.push_back(indent() + "end)()"s); | 5852 | funcStart = anonFuncStart() + nll(whileNode); |
| 5853 | temp.push_back(indent() + anonFuncEnd()); | ||
| 5854 | popAnonVarArg(); | ||
| 5794 | out.push_back(join(temp)); | 5855 | out.push_back(join(temp)); |
| 5795 | } | 5856 | } |
| 5796 | 5857 | ||
| @@ -5821,8 +5882,10 @@ private: | |||
| 5821 | 5882 | ||
| 5822 | void transformSwitch(Switch_t* switchNode, str_list& out, ExpUsage usage, ExpList_t* assignList = nullptr) { | 5883 | void transformSwitch(Switch_t* switchNode, str_list& out, ExpUsage usage, ExpList_t* assignList = nullptr) { |
| 5823 | str_list temp; | 5884 | str_list temp; |
| 5885 | std::string* funcStart = nullptr; | ||
| 5824 | if (usage == ExpUsage::Closure) { | 5886 | if (usage == ExpUsage::Closure) { |
| 5825 | temp.push_back("(function()"s + nll(switchNode)); | 5887 | pushAnonVarArg(); |
| 5888 | funcStart = &temp.emplace_back(); | ||
| 5826 | pushScope(); | 5889 | pushScope(); |
| 5827 | _enableReturn.push(true); | 5890 | _enableReturn.push(true); |
| 5828 | } | 5891 | } |
| @@ -5864,7 +5927,9 @@ private: | |||
| 5864 | if (usage == ExpUsage::Closure) { | 5927 | if (usage == ExpUsage::Closure) { |
| 5865 | _enableReturn.pop(); | 5928 | _enableReturn.pop(); |
| 5866 | popScope(); | 5929 | popScope(); |
| 5867 | temp.push_back(indent() + "end)()"s); | 5930 | *funcStart = anonFuncStart() + nll(switchNode); |
| 5931 | temp.push_back(indent() + anonFuncEnd()); | ||
| 5932 | popAnonVarArg(); | ||
| 5868 | } | 5933 | } |
| 5869 | out.push_back(join(temp)); | 5934 | out.push_back(join(temp)); |
| 5870 | } | 5935 | } |
| @@ -6027,3 +6092,4 @@ CompileInfo YueCompiler::compile(std::string_view codes, const YueConfig& config | |||
| 6027 | } | 6092 | } |
| 6028 | 6093 | ||
| 6029 | } // namespace yue | 6094 | } // namespace yue |
| 6095 | |||
