aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2020-11-03 14:21:17 +0800
committerLi Jin <dragon-fly@qq.com>2020-11-03 14:21:17 +0800
commite07a2eb9c389f27103872a3b5a5bfe500d0c2d62 (patch)
treee73abc495faa92bab2d9eee9b89afc89f57d1390
parentc421550a006c6c01ac176a879593a20d51d77c5d (diff)
downloadyuescript-e07a2eb9c389f27103872a3b5a5bfe500d0c2d62.tar.gz
yuescript-e07a2eb9c389f27103872a3b5a5bfe500d0c2d62.tar.bz2
yuescript-e07a2eb9c389f27103872a3b5a5bfe500d0c2d62.zip
fix issue #29
-rw-r--r--spec/inputs/loops.mp6
-rw-r--r--src/MoonP/moon_compiler.cpp19
2 files changed, 15 insertions, 10 deletions
diff --git a/spec/inputs/loops.mp b/spec/inputs/loops.mp
index 24d960f..8946a2f 100644
--- a/spec/inputs/loops.mp
+++ b/spec/inputs/loops.mp
@@ -91,6 +91,12 @@ while true
91 break if true 91 break if true
92 print "no" 92 print "no"
93 93
94for i = 1, 10
95 while true
96 if not true
97 continue
98 break
99
94a = 1 100a = 1
95repeat 101repeat
96 a += 1 102 a += 1
diff --git a/src/MoonP/moon_compiler.cpp b/src/MoonP/moon_compiler.cpp
index f24441f..138a6bf 100644
--- a/src/MoonP/moon_compiler.cpp
+++ b/src/MoonP/moon_compiler.cpp
@@ -53,7 +53,7 @@ inline std::string s(std::string_view sv) {
53 return std::string(sv); 53 return std::string(sv);
54} 54}
55 55
56const std::string_view version = "0.4.19"sv; 56const std::string_view version = "0.4.20"sv;
57const std::string_view extension = "mp"sv; 57const std::string_view extension = "mp"sv;
58 58
59class MoonCompilerImpl { 59class MoonCompilerImpl {
@@ -3814,17 +3814,16 @@ private:
3814 void transformLoopBody(Body_t* body, str_list& out, const std::string& appendContent, ExpUsage usage, ExpList_t* assignList = nullptr) { 3814 void transformLoopBody(Body_t* body, str_list& out, const std::string& appendContent, ExpUsage usage, ExpList_t* assignList = nullptr) {
3815 str_list temp; 3815 str_list temp;
3816 bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) { 3816 bool withContinue = traversal::Stop == body->traverse([&](ast_node* node) {
3817 switch (node->getId()) { 3817 if (auto stmt = ast_cast<Statement_t>(node)) {
3818 case id<For_t>(): 3818 if (stmt->content.is<BreakLoop_t>()) {
3819 case id<ForEach_t>(): 3819 return _parser.toString(stmt->content) == "continue"sv ?
3820 return traversal::Return; 3820 traversal::Stop : traversal::Return;
3821 case id<BreakLoop_t>(): { 3821 } else if (expListFrom(stmt)) {
3822 return _parser.toString(node) == "continue"sv ?
3823 traversal::Stop : traversal::Return;
3824 }
3825 default:
3826 return traversal::Continue; 3822 return traversal::Continue;
3823 }
3824 return traversal::Return;
3827 } 3825 }
3826 return traversal::Continue;
3828 }); 3827 });
3829 if (withContinue) { 3828 if (withContinue) {
3830 auto continueVar = getUnusedName("_continue_"sv); 3829 auto continueVar = getUnusedName("_continue_"sv);