diff options
author | Björn Gustavsson <[email protected]> | 2012-01-25 14:59:18 +0100 |
---|---|---|
committer | Björn Gustavsson <[email protected]> | 2012-01-25 14:59:18 +0100 |
commit | 328213de5cc0c93bf91559be938aff8fb4174b98 (patch) | |
tree | 973b44121f42d039e25b903aab1fdbdd85feb54d | |
parent | 8b129dda86fe28b943180153561423bbb7957582 (diff) | |
parent | 4c6e2c2d775bc785db7de174e12227e87d2bc542 (diff) | |
download | otp-328213de5cc0c93bf91559be938aff8fb4174b98.tar.gz otp-328213de5cc0c93bf91559be938aff8fb4174b98.tar.bz2 otp-328213de5cc0c93bf91559be938aff8fb4174b98.zip |
Merge branch 'bjorn/compiler/get-in-try/OTP-9867' into maint
* bjorn/compiler/get-in-try/OTP-9867:
compiler: Correct live calculation when get/1 is used in try...catch
-rw-r--r-- | lib/compiler/src/beam_utils.erl | 11 | ||||
-rw-r--r-- | lib/compiler/test/trycatch_SUITE.erl | 18 |
2 files changed, 25 insertions, 4 deletions
diff --git a/lib/compiler/src/beam_utils.erl b/lib/compiler/src/beam_utils.erl index a631b8cd69..116ede0bc9 100644 --- a/lib/compiler/src/beam_utils.erl +++ b/lib/compiler/src/beam_utils.erl @@ -474,8 +474,15 @@ check_liveness(R, [{make_fun2,_,_,_,NumFree}|Is], St) -> end; check_liveness(R, [{try_end,Y}|Is], St) -> case R of - Y -> {killed,St}; - _ -> check_liveness(R, Is, St) + Y -> + {killed,St}; + {y,_} -> + %% y registers will be used if an exception occurs and + %% control transfers to the label given in the previous + %% try/2 instruction. + {used,St}; + _ -> + check_liveness(R, Is, St) end; check_liveness(R, [{catch_end,Y}|Is], St) -> case R of diff --git a/lib/compiler/test/trycatch_SUITE.erl b/lib/compiler/test/trycatch_SUITE.erl index 760cf17225..09a23724fe 100644 --- a/lib/compiler/test/trycatch_SUITE.erl +++ b/lib/compiler/test/trycatch_SUITE.erl @@ -24,7 +24,7 @@ catch_oops/1,after_oops/1,eclectic/1,rethrow/1, nested_of/1,nested_catch/1,nested_after/1, nested_horrid/1,last_call_optimization/1,bool/1, - plain_catch_coverage/1,andalso_orelse/1]). + plain_catch_coverage/1,andalso_orelse/1,get_in_try/1]). -include_lib("test_server/include/test_server.hrl"). @@ -35,7 +35,7 @@ all() -> [basic, lean_throw, try_of, try_after, catch_oops, after_oops, eclectic, rethrow, nested_of, nested_catch, nested_after, nested_horrid, last_call_optimization, - bool, plain_catch_coverage, andalso_orelse]. + bool, plain_catch_coverage, andalso_orelse, get_in_try]. groups() -> []. @@ -928,3 +928,17 @@ andalso_orelse_2({Type,Keyval}) -> zero() -> 0.0. + +get_in_try(_) -> + undefined = get_valid_line([a], []), + ok. + +get_valid_line([_|T]=Path, Annotations) -> + try + get(Path) + %% beam_dead used to optimize away an assignment to {y,1} + %% because it didn't appear to be used. + catch + _:not_found -> + get_valid_line(T, Annotations) + end. |