diff options
author | Li Jin <dragon-fly@qq.com> | 2024-05-16 17:25:37 +0800 |
---|---|---|
committer | Li Jin <dragon-fly@qq.com> | 2024-05-16 17:25:37 +0800 |
commit | fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7 (patch) | |
tree | ed0b010b08f91fdb2bc9a4df18e8d638d47b1c7a | |
parent | c857b3b83c7485693bfcc2b65e9e6e95107396f4 (diff) | |
download | yuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.tar.gz yuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.tar.bz2 yuescript-fe317e2bdd9cb60b3c7cd347e21ce65cf90396e7.zip |
fix ambiguous issue in try-catch syntax.v0.23.4
-rw-r--r-- | spec/inputs/try_catch.yue | 86 | ||||
-rw-r--r-- | spec/outputs/5.1/try_catch.lua | 141 | ||||
-rw-r--r-- | spec/outputs/try_catch.lua | 117 | ||||
-rw-r--r-- | spec/outputs/unicode/try_catch.lua | 39 | ||||
-rw-r--r-- | src/yuescript/yue_compiler.cpp | 69 |
5 files changed, 272 insertions, 180 deletions
diff --git a/spec/inputs/try_catch.yue b/spec/inputs/try_catch.yue index ccb3f52..419eef4 100644 --- a/spec/inputs/try_catch.yue +++ b/spec/inputs/try_catch.yue | |||
@@ -1,60 +1,60 @@ | |||
1 | try | 1 | f = -> |
2 | func 1, 2, 3 | 2 | try |
3 | catch err | ||
4 | print err | ||
5 | |||
6 | try func 1, 2, 3 | ||
7 | catch err | ||
8 | print err | ||
9 | |||
10 | try | ||
11 | print "trying" | ||
12 | func 1, 2, 3 | ||
13 | |||
14 | do | ||
15 | success, result = try | ||
16 | func 1, 2, 3 | 3 | func 1, 2, 3 |
17 | catch err | 4 | catch err |
18 | print err | 5 | print err |
19 | 6 | ||
20 | success, result = try func 1, 2, 3 | 7 | try func 1, 2, 3 |
8 | catch err | ||
9 | print err | ||
21 | 10 | ||
22 | try tb.func | 11 | try |
23 | try tb.func! | 12 | print "trying" |
24 | try tb.func() | 13 | func 1, 2, 3 |
25 | try (tb.func!) | ||
26 | try (tb\func(1, 2, 3)) | ||
27 | 14 | ||
28 | try tb.func 1 | 15 | do |
29 | try tb.func(1) | 16 | success, result = try |
17 | func 1, 2, 3 | ||
18 | catch err | ||
19 | print err | ||
30 | 20 | ||
31 | if (try func 1 | 21 | success, result = try func 1, 2, 3 |
32 | catch err | ||
33 | print err) | ||
34 | print "OK" | ||
35 | 22 | ||
36 | if try (func 1) | 23 | try tb.func |
37 | catch err | 24 | try tb.func! |
38 | print err | 25 | try tb.func() |
39 | print "OK" | 26 | try (tb.func!) |
27 | try (tb\func(1, 2, 3)) | ||
40 | 28 | ||
41 | do | 29 | try tb.func 1 |
42 | if success, result := try func "abc", 123 | 30 | try tb.func(1) |
43 | print result | ||
44 | 31 | ||
45 | success, result = try func "abc", 123 | 32 | if (try func 1 |
46 | catch err | 33 | catch err |
47 | print err | 34 | print err) |
35 | print "OK" | ||
48 | 36 | ||
49 | print result if success, result := try func "abc", 123 | 37 | if try (func 1) |
50 | catch err | 38 | catch err |
51 | print err | 39 | print err |
40 | print "OK" | ||
52 | 41 | ||
53 | do | 42 | do |
54 | try | 43 | if success, result := try func "abc", 123 |
55 | func 1, 2, 3 | 44 | print result |
56 | 45 | ||
57 | try func 1, 2, 3 | 46 | success, result = try func "abc", 123 |
47 | catch err | ||
48 | print err | ||
49 | |||
50 | print result if success, result := try func "abc", 123 | ||
51 | catch err | ||
52 | print err | ||
53 | |||
54 | do | ||
55 | try | ||
56 | func 1, 2, 3 | ||
58 | 57 | ||
59 | nil | 58 | try func 1, 2, 3 |
60 | 59 | ||
60 | nil | ||
diff --git a/spec/outputs/5.1/try_catch.lua b/spec/outputs/5.1/try_catch.lua index 9972dca..f63cd91 100644 --- a/spec/outputs/5.1/try_catch.lua +++ b/spec/outputs/5.1/try_catch.lua | |||
@@ -1,75 +1,94 @@ | |||
1 | xpcall(function() | 1 | local _anon_func_0 = function(func, print) |
2 | return func(1, 2, 3) | ||
3 | end, function(err) | ||
4 | return print(err) | ||
5 | end) | ||
6 | xpcall(function() | ||
7 | return func(1, 2, 3) | ||
8 | end, function(err) | ||
9 | return print(err) | ||
10 | end) | ||
11 | pcall(function() | ||
12 | print("trying") | 2 | print("trying") |
13 | return func(1, 2, 3) | 3 | return func(1, 2, 3) |
14 | end) | 4 | end |
15 | do | 5 | local _anon_func_1 = function(tb) |
16 | local success, result = xpcall(function() | 6 | return tb.func |
7 | end | ||
8 | local _anon_func_2 = function(tb) | ||
9 | return tb.func() | ||
10 | end | ||
11 | local _anon_func_3 = function(tb) | ||
12 | return tb.func() | ||
13 | end | ||
14 | local _anon_func_4 = function(tb) | ||
15 | return tb.func() | ||
16 | end | ||
17 | local _anon_func_5 = function(tb) | ||
18 | return tb:func(1, 2, 3) | ||
19 | end | ||
20 | local _anon_func_6 = function(tb) | ||
21 | return tb.func(1) | ||
22 | end | ||
23 | local _anon_func_7 = function(tb) | ||
24 | return tb.func(1) | ||
25 | end | ||
26 | local f | ||
27 | f = function() | ||
28 | xpcall(function() | ||
17 | return func(1, 2, 3) | 29 | return func(1, 2, 3) |
18 | end, function(err) | 30 | end, function(err) |
19 | return print(err) | 31 | return print(err) |
20 | end) | 32 | end) |
21 | success, result = pcall(func, 1, 2, 3) | 33 | xpcall(function() |
22 | end | 34 | return func(1, 2, 3) |
23 | pcall(tb.func) | 35 | end, function(err) |
24 | pcall(tb.func) | 36 | return print(err) |
25 | pcall(tb.func) | 37 | end) |
26 | pcall((tb.func)) | 38 | pcall(_anon_func_0, func, print) |
27 | pcall(((function() | ||
28 | local _base_0 = tb | ||
29 | local _fn_0 = _base_0.func | ||
30 | return _fn_0 and function(...) | ||
31 | return _fn_0(_base_0, ...) | ||
32 | end | ||
33 | end)()), 1, 2, 3) | ||
34 | pcall(tb.func, 1) | ||
35 | pcall(tb.func, 1) | ||
36 | if (xpcall(function() | ||
37 | return func(1) | ||
38 | end, function(err) | ||
39 | return print(err) | ||
40 | end)) then | ||
41 | print("OK") | ||
42 | end | ||
43 | if xpcall(function() | ||
44 | return func(1) | ||
45 | end, function(err) | ||
46 | return print(err) | ||
47 | end) then | ||
48 | print("OK") | ||
49 | end | ||
50 | do | ||
51 | do | 39 | do |
52 | local success, result = pcall(func, "abc", 123) | 40 | local success, result = xpcall(function() |
53 | if success then | 41 | return func(1, 2, 3) |
54 | print(result) | 42 | end, function(err) |
55 | end | 43 | return print(err) |
44 | end) | ||
45 | success, result = pcall(func, 1, 2, 3) | ||
56 | end | 46 | end |
57 | local success, result = xpcall(function() | 47 | pcall(_anon_func_1, tb) |
58 | return func("abc", 123) | 48 | pcall(_anon_func_2, tb) |
49 | pcall(_anon_func_3, tb) | ||
50 | pcall(_anon_func_4, tb) | ||
51 | pcall(_anon_func_5, tb) | ||
52 | pcall(_anon_func_6, tb) | ||
53 | pcall(_anon_func_7, tb) | ||
54 | if (xpcall(function() | ||
55 | return func(1) | ||
59 | end, function(err) | 56 | end, function(err) |
60 | return print(err) | 57 | return print(err) |
61 | end) | 58 | end)) then |
62 | success, result = xpcall(function() | 59 | print("OK") |
63 | return func("abc", 123) | 60 | end |
61 | if xpcall(function() | ||
62 | return func(1) | ||
64 | end, function(err) | 63 | end, function(err) |
65 | return print(err) | 64 | return print(err) |
66 | end) | 65 | end) then |
67 | if success then | 66 | print("OK") |
68 | print(result) | ||
69 | end | 67 | end |
68 | do | ||
69 | do | ||
70 | local success, result = pcall(func, "abc", 123) | ||
71 | if success then | ||
72 | print(result) | ||
73 | end | ||
74 | end | ||
75 | local success, result = xpcall(function() | ||
76 | return func("abc", 123) | ||
77 | end, function(err) | ||
78 | return print(err) | ||
79 | end) | ||
80 | success, result = xpcall(function() | ||
81 | return func("abc", 123) | ||
82 | end, function(err) | ||
83 | return print(err) | ||
84 | end) | ||
85 | if success then | ||
86 | print(result) | ||
87 | end | ||
88 | end | ||
89 | do | ||
90 | pcall(func, 1, 2, 3) | ||
91 | pcall(func, 1, 2, 3) | ||
92 | end | ||
93 | return nil | ||
70 | end | 94 | end |
71 | do | ||
72 | pcall(func, 1, 2, 3) | ||
73 | pcall(func, 1, 2, 3) | ||
74 | end | ||
75 | return nil | ||
diff --git a/spec/outputs/try_catch.lua b/spec/outputs/try_catch.lua index de52c6c..3c3dd3c 100644 --- a/spec/outputs/try_catch.lua +++ b/spec/outputs/try_catch.lua | |||
@@ -1,61 +1,80 @@ | |||
1 | xpcall(func, function(err) | 1 | local _anon_func_0 = function(func, print) |
2 | return print(err) | ||
3 | end, 1, 2, 3) | ||
4 | xpcall(func, function(err) | ||
5 | return print(err) | ||
6 | end, 1, 2, 3) | ||
7 | pcall(function() | ||
8 | print("trying") | 2 | print("trying") |
9 | return func(1, 2, 3) | 3 | return func(1, 2, 3) |
10 | end) | 4 | end |
11 | do | 5 | local _anon_func_1 = function(tb) |
12 | local success, result = xpcall(func, function(err) | 6 | return tb.func |
7 | end | ||
8 | local _anon_func_2 = function(tb) | ||
9 | return tb.func() | ||
10 | end | ||
11 | local _anon_func_3 = function(tb) | ||
12 | return tb.func() | ||
13 | end | ||
14 | local _anon_func_4 = function(tb) | ||
15 | return tb.func() | ||
16 | end | ||
17 | local _anon_func_5 = function(tb) | ||
18 | return tb:func(1, 2, 3) | ||
19 | end | ||
20 | local _anon_func_6 = function(tb) | ||
21 | return tb.func(1) | ||
22 | end | ||
23 | local _anon_func_7 = function(tb) | ||
24 | return tb.func(1) | ||
25 | end | ||
26 | local f | ||
27 | f = function() | ||
28 | xpcall(func, function(err) | ||
29 | return print(err) | ||
30 | end, 1, 2, 3) | ||
31 | xpcall(func, function(err) | ||
13 | return print(err) | 32 | return print(err) |
14 | end, 1, 2, 3) | 33 | end, 1, 2, 3) |
15 | success, result = pcall(func, 1, 2, 3) | 34 | pcall(_anon_func_0, func, print) |
16 | end | 35 | do |
17 | pcall(tb.func) | 36 | local success, result = xpcall(func, function(err) |
18 | pcall(tb.func) | 37 | return print(err) |
19 | pcall(tb.func) | 38 | end, 1, 2, 3) |
20 | pcall((tb.func)) | 39 | success, result = pcall(func, 1, 2, 3) |
21 | pcall(((function() | 40 | end |
22 | local _base_0 = tb | 41 | pcall(_anon_func_1, tb) |
23 | local _fn_0 = _base_0.func | 42 | pcall(_anon_func_2, tb) |
24 | return _fn_0 and function(...) | 43 | pcall(_anon_func_3, tb) |
25 | return _fn_0(_base_0, ...) | 44 | pcall(_anon_func_4, tb) |
45 | pcall(_anon_func_5, tb) | ||
46 | pcall(_anon_func_6, tb) | ||
47 | pcall(_anon_func_7, tb) | ||
48 | if (xpcall(func, function(err) | ||
49 | return print(err) | ||
50 | end, 1)) then | ||
51 | print("OK") | ||
52 | end | ||
53 | if xpcall((func), function(err) | ||
54 | return print(err) | ||
55 | end, 1) then | ||
56 | print("OK") | ||
26 | end | 57 | end |
27 | end)()), 1, 2, 3) | ||
28 | pcall(tb.func, 1) | ||
29 | pcall(tb.func, 1) | ||
30 | if (xpcall(func, function(err) | ||
31 | return print(err) | ||
32 | end, 1)) then | ||
33 | print("OK") | ||
34 | end | ||
35 | if xpcall((func), function(err) | ||
36 | return print(err) | ||
37 | end, 1) then | ||
38 | print("OK") | ||
39 | end | ||
40 | do | ||
41 | do | 58 | do |
42 | local success, result = pcall(func, "abc", 123) | 59 | do |
60 | local success, result = pcall(func, "abc", 123) | ||
61 | if success then | ||
62 | print(result) | ||
63 | end | ||
64 | end | ||
65 | local success, result = xpcall(func, function(err) | ||
66 | return print(err) | ||
67 | end, "abc", 123) | ||
68 | success, result = xpcall(func, function(err) | ||
69 | return print(err) | ||
70 | end, "abc", 123) | ||
43 | if success then | 71 | if success then |
44 | print(result) | 72 | print(result) |
45 | end | 73 | end |
46 | end | 74 | end |
47 | local success, result = xpcall(func, function(err) | 75 | do |
48 | return print(err) | 76 | pcall(func, 1, 2, 3) |
49 | end, "abc", 123) | 77 | pcall(func, 1, 2, 3) |
50 | success, result = xpcall(func, function(err) | ||
51 | return print(err) | ||
52 | end, "abc", 123) | ||
53 | if success then | ||
54 | print(result) | ||
55 | end | 78 | end |
79 | return nil | ||
56 | end | 80 | end |
57 | do | ||
58 | pcall(func, 1, 2, 3) | ||
59 | pcall(func, 1, 2, 3) | ||
60 | end | ||
61 | return nil | ||
diff --git a/spec/outputs/unicode/try_catch.lua b/spec/outputs/unicode/try_catch.lua index fde63d6..7d95f9b 100644 --- a/spec/outputs/unicode/try_catch.lua +++ b/spec/outputs/unicode/try_catch.lua | |||
@@ -14,19 +14,28 @@ do | |||
14 | end, 1, 2, 3) | 14 | end, 1, 2, 3) |
15 | _u6210_u529f, _u7ed3_u679c = pcall(_u51fd_u6570, 1, 2, 3) | 15 | _u6210_u529f, _u7ed3_u679c = pcall(_u51fd_u6570, 1, 2, 3) |
16 | end | 16 | end |
17 | pcall(_u8868["函数"]) | 17 | pcall(function() |
18 | pcall(_u8868["函数"]) | 18 | return _u8868["函数"] |
19 | pcall(_u8868["函数"]) | 19 | end) |
20 | pcall((_u8868["函数"])) | 20 | pcall(function() |
21 | pcall(((function() | 21 | return _u8868["函数"]() |
22 | local _base_0 = _u8868 | 22 | end) |
23 | local _fn_0 = _base_0["函数"] | 23 | pcall(function() |
24 | return _fn_0 and function(...) | 24 | return _u8868["函数"]() |
25 | return _fn_0(_base_0, ...) | 25 | end) |
26 | end | 26 | pcall(function() |
27 | end)()), 1, 2, 3) | 27 | return _u8868["函数"]() |
28 | pcall(_u8868["函数"], 1) | 28 | end) |
29 | pcall(_u8868["函数"], 1) | 29 | pcall(function() |
30 | local _call_0 = _u8868 | ||
31 | return _call_0["函数"](_call_0, 1, 2, 3) | ||
32 | end) | ||
33 | pcall(function() | ||
34 | return _u8868["函数"](1) | ||
35 | end) | ||
36 | pcall(function() | ||
37 | return _u8868["函数"](1) | ||
38 | end) | ||
30 | if (xpcall(_u51fd_u6570, function(_u9519_u8bef) | 39 | if (xpcall(_u51fd_u6570, function(_u9519_u8bef) |
31 | return _u6253_u5370(_u9519_u8bef) | 40 | return _u6253_u5370(_u9519_u8bef) |
32 | end, 1)) then | 41 | end, 1)) then |
@@ -55,7 +64,7 @@ do | |||
55 | end | 64 | end |
56 | end | 65 | end |
57 | do | 66 | do |
58 | pcall(_u51fd_u6570, 1, 2, 3) | 67 | pcall(_u51fd_u6570, 1, 2, 3) |
59 | pcall(_u51fd_u6570, 1, 2, 3) | 68 | pcall(_u51fd_u6570, 1, 2, 3) |
60 | end | 69 | end |
61 | return nil | 70 | return nil |
diff --git a/src/yuescript/yue_compiler.cpp b/src/yuescript/yue_compiler.cpp index 9a632fb..c205031 100644 --- a/src/yuescript/yue_compiler.cpp +++ b/src/yuescript/yue_compiler.cpp | |||
@@ -75,7 +75,7 @@ static std::unordered_set<std::string> Metamethods = { | |||
75 | "close"s // Lua 5.4 | 75 | "close"s // Lua 5.4 |
76 | }; | 76 | }; |
77 | 77 | ||
78 | const std::string_view version = "0.23.3"sv; | 78 | const std::string_view version = "0.23.4"sv; |
79 | const std::string_view extension = "yue"sv; | 79 | const std::string_view extension = "yue"sv; |
80 | 80 | ||
81 | class CompileError : public std::logic_error { | 81 | class CompileError : public std::logic_error { |
@@ -4663,8 +4663,10 @@ private: | |||
4663 | return 503; | 4663 | return 503; |
4664 | } else if (target.value() == "5.4"sv) { | 4664 | } else if (target.value() == "5.4"sv) { |
4665 | return 504; | 4665 | return 504; |
4666 | } else if (target.value() == "5.5"sv) { | ||
4667 | return 505; | ||
4666 | } else { | 4668 | } else { |
4667 | throw CompileError("get invalid Lua target \""s + target.value() + "\", should be 5.1, 5.2, 5.3 or 5.4"s, x); | 4669 | throw CompileError("get invalid Lua target \""s + target.value() + "\", should be from 5.1 to 5.5"s, x); |
4668 | } | 4670 | } |
4669 | } | 4671 | } |
4670 | #ifndef YUE_NO_MACRO | 4672 | #ifndef YUE_NO_MACRO |
@@ -9112,7 +9114,9 @@ private: | |||
9112 | body->content.set(tryNode->catchBlock->block); | 9114 | body->content.set(tryNode->catchBlock->block); |
9113 | funLit->body.set(body); | 9115 | funLit->body.set(body); |
9114 | } | 9116 | } |
9115 | if (auto tryBlock = tryNode->func.as<Block_t>()) { | 9117 | ast_sel<false, Block_t, Exp_t> tryFunc; |
9118 | tryFunc.set(tryNode->func); | ||
9119 | if (auto tryBlock = tryFunc.as<Block_t>()) { | ||
9116 | BLOCK_START | 9120 | BLOCK_START |
9117 | BREAK_IF(tryBlock->statements.size() != 1); | 9121 | BREAK_IF(tryBlock->statements.size() != 1); |
9118 | auto stmt = static_cast<Statement_t*>(tryBlock->statements.front()); | 9122 | auto stmt = static_cast<Statement_t*>(tryBlock->statements.front()); |
@@ -9124,11 +9128,43 @@ private: | |||
9124 | auto chainValue = value->item.as<ChainValue_t>(); | 9128 | auto chainValue = value->item.as<ChainValue_t>(); |
9125 | BREAK_IF(!chainValue); | 9129 | BREAK_IF(!chainValue); |
9126 | BREAK_IF(!isChainValueCall(chainValue)); | 9130 | BREAK_IF(!isChainValueCall(chainValue)); |
9127 | tryNode->func.set(expListAssign->expList->exprs.front()); | 9131 | auto tmpChain = chainValue->new_ptr<ChainValue_t>(); |
9132 | tmpChain->items.dup(chainValue->items); | ||
9133 | tmpChain->items.pop_back(); | ||
9134 | auto var = singleVariableFrom(tmpChain, AccessType::None); | ||
9135 | BREAK_IF(var.empty()); | ||
9136 | tryFunc.set(expListAssign->expList->exprs.front()); | ||
9128 | BLOCK_END | 9137 | BLOCK_END |
9138 | } else { | ||
9139 | auto tryExp = tryFunc.as<Exp_t>(); | ||
9140 | bool needWrap = singleVariableFrom(tryExp, AccessType::None).empty(); | ||
9141 | BLOCK_START | ||
9142 | auto value = singleValueFrom(tryExp); | ||
9143 | BREAK_IF(!value); | ||
9144 | auto chainValue = value->item.as<ChainValue_t>(); | ||
9145 | BREAK_IF(!chainValue); | ||
9146 | BREAK_IF(!isChainValueCall(chainValue)); | ||
9147 | auto tmpChain = chainValue->new_ptr<ChainValue_t>(); | ||
9148 | tmpChain->items.dup(chainValue->items); | ||
9149 | tmpChain->items.pop_back(); | ||
9150 | auto var = singleVariableFrom(tmpChain, AccessType::None); | ||
9151 | BREAK_IF(var.empty()); | ||
9152 | needWrap = false; | ||
9153 | BLOCK_END | ||
9154 | if (needWrap) { | ||
9155 | auto expList = x->new_ptr<ExpList_t>(); | ||
9156 | expList->exprs.push_back(tryFunc); | ||
9157 | auto expListAssign = x->new_ptr<ExpListAssign_t>(); | ||
9158 | expListAssign->expList.set(expList); | ||
9159 | auto stmt = x->new_ptr<Statement_t>(); | ||
9160 | stmt->content.set(expListAssign); | ||
9161 | auto block = x->new_ptr<Block_t>(); | ||
9162 | block->statements.push_back(stmt); | ||
9163 | tryFunc.set(block); | ||
9164 | } | ||
9129 | } | 9165 | } |
9130 | if (auto tryBlock = tryNode->func.as<Block_t>()) { | 9166 | if (auto tryBlock = tryFunc.as<Block_t>()) { |
9131 | { | 9167 | if (getLuaTarget(tryBlock) >= 502 || !errHandler) { |
9132 | if (auto result = upValueFuncFrom(tryBlock)) { | 9168 | if (auto result = upValueFuncFrom(tryBlock)) { |
9133 | auto [funcName, args] = std::move(*result); | 9169 | auto [funcName, args] = std::move(*result); |
9134 | if (errHandler) { | 9170 | if (errHandler) { |
@@ -9150,6 +9186,7 @@ private: | |||
9150 | transformChainValue(pcall, out, ExpUsage::Closure); | 9186 | transformChainValue(pcall, out, ExpUsage::Closure); |
9151 | } | 9187 | } |
9152 | if (usage == ExpUsage::Common) { | 9188 | if (usage == ExpUsage::Common) { |
9189 | out.back().insert(0, indent()); | ||
9153 | out.back().append(nlr(x)); | 9190 | out.back().append(nlr(x)); |
9154 | } | 9191 | } |
9155 | return; | 9192 | return; |
@@ -9173,19 +9210,25 @@ private: | |||
9173 | transformChainValue(pcall, out, ExpUsage::Closure); | 9210 | transformChainValue(pcall, out, ExpUsage::Closure); |
9174 | } | 9211 | } |
9175 | if (usage == ExpUsage::Common) { | 9212 | if (usage == ExpUsage::Common) { |
9213 | out.back().insert(0, indent()); | ||
9176 | out.back().append(nlr(x)); | 9214 | out.back().append(nlr(x)); |
9177 | } | 9215 | } |
9178 | return; | 9216 | return; |
9179 | } else if (auto value = singleValueFrom(tryNode->func)) { | 9217 | } else if (auto value = singleValueFrom(tryFunc)) { |
9180 | BLOCK_START | 9218 | BLOCK_START |
9181 | auto chainValue = value->item.as<ChainValue_t>(); | 9219 | auto chainValue = value->item.as<ChainValue_t>(); |
9182 | BREAK_IF(!chainValue); | 9220 | BREAK_IF(!chainValue); |
9183 | BREAK_IF(!isChainValueCall(chainValue)); | 9221 | BREAK_IF(!isChainValueCall(chainValue)); |
9222 | auto tmpChain = chainValue->new_ptr<ChainValue_t>(); | ||
9223 | tmpChain->items.dup(chainValue->items); | ||
9224 | tmpChain->items.pop_back(); | ||
9225 | auto var = singleVariableFrom(tmpChain, AccessType::None); | ||
9226 | BREAK_IF(var.empty()); | ||
9184 | if (errHandler && getLuaTarget(x) < 502) { | 9227 | if (errHandler && getLuaTarget(x) < 502) { |
9185 | auto tryExp = toAst<Exp_t>("->"sv, x); | 9228 | auto tryExp = toAst<Exp_t>("->"sv, x); |
9186 | auto funLit = simpleSingleValueFrom(tryExp)->value.to<FunLit_t>(); | 9229 | auto funLit = simpleSingleValueFrom(tryExp)->value.to<FunLit_t>(); |
9187 | auto expList = x->new_ptr<ExpList_t>(); | 9230 | auto expList = x->new_ptr<ExpList_t>(); |
9188 | expList->exprs.push_back(tryNode->func); | 9231 | expList->exprs.push_back(tryFunc); |
9189 | auto expListAssign = x->new_ptr<ExpListAssign_t>(); | 9232 | auto expListAssign = x->new_ptr<ExpListAssign_t>(); |
9190 | expListAssign->expList.set(expList); | 9233 | expListAssign->expList.set(expList); |
9191 | auto stmt = x->new_ptr<Statement_t>(); | 9234 | auto stmt = x->new_ptr<Statement_t>(); |
@@ -9210,7 +9253,7 @@ private: | |||
9210 | if (errHandler) { | 9253 | if (errHandler) { |
9211 | auto xpcall = toAst<ChainValue_t>("xpcall()", x); | 9254 | auto xpcall = toAst<ChainValue_t>("xpcall()", x); |
9212 | auto invoke = ast_to<Invoke_t>(xpcall->items.back()); | 9255 | auto invoke = ast_to<Invoke_t>(xpcall->items.back()); |
9213 | invoke->args.push_back(tryNode->func); | 9256 | invoke->args.push_back(tryFunc); |
9214 | invoke->args.push_back(errHandler); | 9257 | invoke->args.push_back(errHandler); |
9215 | for (auto arg : args->objects()) { | 9258 | for (auto arg : args->objects()) { |
9216 | invoke->args.push_back(arg); | 9259 | invoke->args.push_back(arg); |
@@ -9219,7 +9262,7 @@ private: | |||
9219 | } else { | 9262 | } else { |
9220 | auto pcall = toAst<ChainValue_t>("pcall()", x); | 9263 | auto pcall = toAst<ChainValue_t>("pcall()", x); |
9221 | auto invoke = ast_to<Invoke_t>(pcall->items.back()); | 9264 | auto invoke = ast_to<Invoke_t>(pcall->items.back()); |
9222 | invoke->args.push_back(tryNode->func); | 9265 | invoke->args.push_back(tryFunc); |
9223 | for (auto arg : args->objects()) { | 9266 | for (auto arg : args->objects()) { |
9224 | invoke->args.push_back(arg); | 9267 | invoke->args.push_back(arg); |
9225 | } | 9268 | } |
@@ -9227,6 +9270,7 @@ private: | |||
9227 | } | 9270 | } |
9228 | } | 9271 | } |
9229 | if (usage == ExpUsage::Common) { | 9272 | if (usage == ExpUsage::Common) { |
9273 | out.back().insert(0, indent()); | ||
9230 | out.back().append(nlr(x)); | 9274 | out.back().append(nlr(x)); |
9231 | } | 9275 | } |
9232 | return; | 9276 | return; |
@@ -9235,16 +9279,17 @@ private: | |||
9235 | if (errHandler) { | 9279 | if (errHandler) { |
9236 | auto xpcall = toAst<ChainValue_t>("xpcall()", x); | 9280 | auto xpcall = toAst<ChainValue_t>("xpcall()", x); |
9237 | auto invoke = ast_to<Invoke_t>(xpcall->items.back()); | 9281 | auto invoke = ast_to<Invoke_t>(xpcall->items.back()); |
9238 | invoke->args.push_back(tryNode->func); | 9282 | invoke->args.push_back(tryFunc); |
9239 | invoke->args.push_back(errHandler); | 9283 | invoke->args.push_back(errHandler); |
9240 | transformChainValue(xpcall, out, ExpUsage::Closure); | 9284 | transformChainValue(xpcall, out, ExpUsage::Closure); |
9241 | } else { | 9285 | } else { |
9242 | auto pcall = toAst<ChainValue_t>("pcall()", x); | 9286 | auto pcall = toAst<ChainValue_t>("pcall()", x); |
9243 | auto invoke = ast_to<Invoke_t>(pcall->items.back()); | 9287 | auto invoke = ast_to<Invoke_t>(pcall->items.back()); |
9244 | invoke->args.push_back(tryNode->func); | 9288 | invoke->args.push_back(tryFunc); |
9245 | transformChainValue(pcall, out, ExpUsage::Closure); | 9289 | transformChainValue(pcall, out, ExpUsage::Closure); |
9246 | } | 9290 | } |
9247 | if (usage == ExpUsage::Common) { | 9291 | if (usage == ExpUsage::Common) { |
9292 | out.back().insert(0, indent()); | ||
9248 | out.back().append(nlr(x)); | 9293 | out.back().append(nlr(x)); |
9249 | } | 9294 | } |
9250 | } | 9295 | } |