aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2022-03-05 13:10:12 +0800
committerLi Jin <dragon-fly@qq.com>2022-03-05 13:10:12 +0800
commitf48e99462a9fac6b4e5ad1b823b78d263025970c (patch)
treee2304e75fca79ddf98caf26392e7a7ba8264d1d6 /src
parent9eb846a1e1e11f7ce2f6b89120b2835af470daa6 (diff)
downloadyuescript-f48e99462a9fac6b4e5ad1b823b78d263025970c.tar.gz
yuescript-f48e99462a9fac6b4e5ad1b823b78d263025970c.tar.bz2
yuescript-f48e99462a9fac6b4e5ad1b823b78d263025970c.zip
fix issue #82.
Diffstat (limited to 'src')
-rwxr-xr-xsrc/yuescript/yue_compiler.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp
index 6ae4771..45d7820 100755
--- a/src/yuescript/yue_compiler.cpp
+++ b/src/yuescript/yue_compiler.cpp
@@ -60,7 +60,7 @@ using namespace parserlib;
60 60
61typedef std::list<std::string> str_list; 61typedef std::list<std::string> str_list;
62 62
63const std::string_view version = "0.10.4"sv; 63const std::string_view version = "0.10.5"sv;
64const std::string_view extension = "yue"sv; 64const std::string_view extension = "yue"sv;
65 65
66class YueCompilerImpl { 66class YueCompilerImpl {
@@ -4844,17 +4844,34 @@ private:
4844 } 4844 }
4845 return traversal::Continue; 4845 return traversal::Continue;
4846 }); 4846 });
4847 bool extraDo = false;
4847 if (withContinue) { 4848 if (withContinue) {
4849 if (auto block = ast_cast<Block_t>(body)) {
4850 if (!block->statements.empty()) {
4851 auto stmt = static_cast<Statement_t*>(block->statements.back());
4852 if (auto breakLoop = ast_cast<BreakLoop_t>(stmt->content)) {
4853 extraDo = _parser.toString(breakLoop) == "break"sv;
4854 }
4855 }
4856 }
4848 auto continueVar = getUnusedName("_continue_"sv); 4857 auto continueVar = getUnusedName("_continue_"sv);
4849 addToScope(continueVar); 4858 addToScope(continueVar);
4859 _continueVars.push(continueVar);
4850 _buf << indent() << "local "sv << continueVar << " = false"sv << nll(body); 4860 _buf << indent() << "local "sv << continueVar << " = false"sv << nll(body);
4851 _buf << indent() << "repeat"sv << nll(body); 4861 _buf << indent() << "repeat"sv << nll(body);
4852 temp.push_back(clearBuf());
4853 _continueVars.push(continueVar);
4854 pushScope(); 4862 pushScope();
4863 if (extraDo) {
4864 _buf << indent() << "do"sv << nll(body);
4865 pushScope();
4866 }
4867 temp.push_back(clearBuf());
4855 } 4868 }
4856 transform_plain_body(body, temp, usage, assignList); 4869 transform_plain_body(body, temp, usage, assignList);
4857 if (withContinue) { 4870 if (withContinue) {
4871 if (extraDo) {
4872 popScope();
4873 _buf << indent() << "end"sv << nll(body);
4874 }
4858 if (!appendContent.empty()) { 4875 if (!appendContent.empty()) {
4859 _buf << indent() << appendContent; 4876 _buf << indent() << appendContent;
4860 } 4877 }