diff options
author | Li Jin <dragon-fly@qq.com> | 2022-02-21 14:28:40 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2022-02-21 14:28:40 +0800 |
commit | b668018486572362b7cbba5257baa7a37ef8d01d (patch) | |
tree | 47ae8b332b009c5b49f43782cf4a2d0864eb4a66 | |
parent | 7167828a9d873156ad208d161cd1a2dc8ab78523 (diff) | |
download | yuescript-b668018486572362b7cbba5257baa7a37ef8d01d.tar.gz yuescript-b668018486572362b7cbba5257baa7a37ef8d01d.tar.bz2 yuescript-b668018486572362b7cbba5257baa7a37ef8d01d.zip |
fix a line number reservation issue.
-rw-r--r-- | spec/outputs/try-catch.lua | 4 | ||||
-rwxr-xr-x | src/yuescript/yue_compiler.cpp | 14 |
2 files changed, 12 insertions, 6 deletions
diff --git a/spec/outputs/try-catch.lua b/spec/outputs/try-catch.lua index 25efda4..d4c02ac 100644 --- a/spec/outputs/try-catch.lua +++ b/spec/outputs/try-catch.lua | |||
@@ -21,7 +21,5 @@ pcall(tb.func) | |||
21 | pcall(tb.func) | 21 | pcall(tb.func) |
22 | pcall((tb.func())) | 22 | pcall((tb.func())) |
23 | pcall(tb.func, 1) | 23 | pcall(tb.func, 1) |
24 | xpcall(tb.func, function(err) | 24 | pcall(tb.func, 1) |
25 | return print(err) | ||
26 | end, 1) | ||
27 | return nil | 25 | return nil |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 2b9ebc9..41bf207 100755 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
@@ -60,7 +60,7 @@ using namespace parserlib; | |||
60 | 60 | ||
61 | typedef std::list<std::string> str_list; | 61 | typedef std::list<std::string> str_list; |
62 | 62 | ||
63 | const std::string_view version = "0.10.0"sv; | 63 | const std::string_view version = "0.10.1"sv; |
64 | const std::string_view extension = "yue"sv; | 64 | const std::string_view extension = "yue"sv; |
65 | 65 | ||
66 | class YueCompilerImpl { | 66 | class YueCompilerImpl { |
@@ -6093,11 +6093,19 @@ private: | |||
6093 | auto x = tryNode; | 6093 | auto x = tryNode; |
6094 | ast_ptr<true, Exp_t> errHandler; | 6094 | ast_ptr<true, Exp_t> errHandler; |
6095 | if (tryNode->catchBlock) { | 6095 | if (tryNode->catchBlock) { |
6096 | auto errHandleStr = "("s + _parser.toString(tryNode->catchBlock->err) + ")->\n"s + _parser.toString(tryNode->catchBlock->body); | 6096 | auto errHandleStr = "("s + _parser.toString(tryNode->catchBlock->err) + ")->"s; |
6097 | errHandler.set(toAst<Exp_t>(errHandleStr, x)); | 6097 | errHandler.set(toAst<Exp_t>(errHandleStr, x)); |
6098 | auto funLit = simpleSingleValueFrom(errHandler)->value.to<FunLit_t>(); | ||
6099 | auto body = x->new_ptr<Body_t>(); | ||
6100 | body->content.set(tryNode->catchBlock->body); | ||
6101 | funLit->body.set(body); | ||
6098 | } | 6102 | } |
6099 | if (auto tryBlock = tryNode->func.as<Block_t>()) { | 6103 | if (auto tryBlock = tryNode->func.as<Block_t>()) { |
6100 | auto tryExp = toAst<Exp_t>("->\n"s + _parser.toString(tryBlock), x); | 6104 | auto tryExp = toAst<Exp_t>("->"sv, x); |
6105 | auto funLit = simpleSingleValueFrom(tryExp)->value.to<FunLit_t>(); | ||
6106 | auto body = x->new_ptr<Body_t>(); | ||
6107 | body->content.set(tryBlock); | ||
6108 | funLit->body.set(body); | ||
6101 | if (errHandler) { | 6109 | if (errHandler) { |
6102 | auto xpcall = toAst<ChainValue_t>("xpcall()", x); | 6110 | auto xpcall = toAst<ChainValue_t>("xpcall()", x); |
6103 | auto invoke = ast_to<Invoke_t>(xpcall->items.back()); | 6111 | auto invoke = ast_to<Invoke_t>(xpcall->items.back()); |