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 | } |
