aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2022-02-21 14:28:40 +0800
committerLi Jin <dragon-fly@qq.com>2022-02-21 14:28:40 +0800
commitb668018486572362b7cbba5257baa7a37ef8d01d (patch)
tree47ae8b332b009c5b49f43782cf4a2d0864eb4a66
parent7167828a9d873156ad208d161cd1a2dc8ab78523 (diff)
downloadyuescript-b668018486572362b7cbba5257baa7a37ef8d01d.tar.gz
yuescript-b668018486572362b7cbba5257baa7a37ef8d01d.tar.bz2
yuescript-b668018486572362b7cbba5257baa7a37ef8d01d.zip
fix a line number reservation issue.
-rw-r--r--spec/outputs/try-catch.lua4
-rwxr-xr-xsrc/yuescript/yue_compiler.cpp14
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)
21pcall(tb.func) 21pcall(tb.func)
22pcall((tb.func())) 22pcall((tb.func()))
23pcall(tb.func, 1) 23pcall(tb.func, 1)
24xpcall(tb.func, function(err) 24pcall(tb.func, 1)
25 return print(err)
26end, 1)
27return nil 25return 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
61typedef std::list<std::string> str_list; 61typedef std::list<std::string> str_list;
62 62
63const std::string_view version = "0.10.0"sv; 63const std::string_view version = "0.10.1"sv;
64const std::string_view extension = "yue"sv; 64const std::string_view extension = "yue"sv;
65 65
66class YueCompilerImpl { 66class 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());