33
33
import org .junit .runner .RunWith ;
34
34
import org .junit .runners .JUnit4 ;
35
35
36
+ /** Tests for {@link Es6RewriteGenerators} */
36
37
@ RunWith (JUnit4 .class )
37
38
public final class Es6RewriteGeneratorsTest extends CompilerTestCase {
38
39
@@ -1914,9 +1915,46 @@ private Node getAndCheckGeneratorProgram(Node genFunction) {
1914
1915
return createGenerator .getNext ().getNext ();
1915
1916
}
1916
1917
1917
- // The following tests demonstrate the bug in how "break" is handled in a "finally" block.
1918
- // The "expected" output is the actual, incorrect output of the compiler, and a comment
1919
- // is added to the test to indicate that the test is expected to fail with the fix.
1918
+ @ Test
1919
+ public void testBreakInNestedFinally () {
1920
+ rewriteGeneratorSwitchBodyWithVars (
1921
+ """
1922
+ OUTER: do {
1923
+ try {
1924
+ try {
1925
+ yield 1;
1926
+ } finally {
1927
+ break OUTER;
1928
+ }
1929
+ } finally {
1930
+ break OUTER;
1931
+ }
1932
+ } while (false);
1933
+ """ ,
1934
+ "" ,
1935
+ """
1936
+ GEN_CONTEXT$0.setFinallyBlock(5);
1937
+ GEN_CONTEXT$0.setFinallyBlock(7);
1938
+ return GEN_CONTEXT$0.yield(1, 7);
1939
+ case 7:
1940
+ GEN_CONTEXT$0.enterFinallyBlock(0, 5);
1941
+ GEN_CONTEXT$0.jumpThroughFinallyBlocks(0);
1942
+ GEN_CONTEXT$0.leaveFinallyBlock(5);
1943
+ break;
1944
+ case 5:
1945
+ GEN_CONTEXT$0.enterFinallyBlock();
1946
+ GEN_CONTEXT$0.jumpThroughFinallyBlocks(0);
1947
+ GEN_CONTEXT$0.leaveFinallyBlock(2);
1948
+ break;
1949
+ case 2:
1950
+ if (false) {
1951
+ GEN_CONTEXT$0.jumpTo(1);
1952
+ break;
1953
+ }
1954
+ GEN_CONTEXT$0.jumpToEnd();
1955
+ """ );
1956
+ }
1957
+
1920
1958
@ Test
1921
1959
public void testFinallyReturnCancelledByOuterBreak () {
1922
1960
rewriteGeneratorSwitchBodyWithVars (
@@ -1938,8 +1976,7 @@ public void testFinallyReturnCancelledByOuterBreak() {
1938
1976
return GEN_CONTEXT$0.return("innerTry");
1939
1977
case 5:
1940
1978
GEN_CONTEXT$0.enterFinallyBlock();
1941
- GEN_CONTEXT$0.jumpTo(0);
1942
- break; // This break is wrong. It should not be here.
1979
+ GEN_CONTEXT$0.jumpThroughFinallyBlocks(0);
1943
1980
GEN_CONTEXT$0.leaveFinallyBlock(2);
1944
1981
break;
1945
1982
case 2:
@@ -1978,7 +2015,6 @@ public void testFinallyReturnCancelledByOuterBreak_nested() {
1978
2015
case 7:
1979
2016
GEN_CONTEXT$0.enterFinallyBlock(0, 5);
1980
2017
GEN_CONTEXT$0.jumpThroughFinallyBlocks(0);
1981
- break; // This break is wrong. It should not be here.
1982
2018
GEN_CONTEXT$0.leaveFinallyBlock(5);
1983
2019
break;
1984
2020
case 5:
@@ -1995,4 +2031,45 @@ public void testFinallyReturnCancelledByOuterBreak_nested() {
1995
2031
GEN_CONTEXT$0.jumpToEnd();
1996
2032
""" );
1997
2033
}
2034
+
2035
+ @ Test
2036
+ public void testContinueInNestedFinallyInLoop () {
2037
+ rewriteGeneratorSwitchBodyWithVars (
2038
+ """
2039
+ OUT: do {
2040
+ try {
2041
+ yield 1;
2042
+ } finally {
2043
+ try {
2044
+ yield 2;
2045
+ } finally {
2046
+ continue OUT;
2047
+ }
2048
+ }
2049
+ } while (false);
2050
+ """ ,
2051
+ "" ,
2052
+ """
2053
+ GEN_CONTEXT$0.setFinallyBlock(5);
2054
+ return GEN_CONTEXT$0.yield(1, 5);
2055
+ case 5:
2056
+ GEN_CONTEXT$0.enterFinallyBlock();
2057
+ GEN_CONTEXT$0.setFinallyBlock(8);
2058
+ return GEN_CONTEXT$0.yield(2, 8);
2059
+ case 8:
2060
+ GEN_CONTEXT$0.enterFinallyBlock(0, 0, 1);
2061
+ GEN_CONTEXT$0.jumpThroughFinallyBlocks(2);
2062
+ GEN_CONTEXT$0.leaveFinallyBlock(9, 1);
2063
+ break;
2064
+ case 9:
2065
+ GEN_CONTEXT$0.leaveFinallyBlock(2);
2066
+ break;
2067
+ case 2:
2068
+ if (false) {
2069
+ GEN_CONTEXT$0.jumpTo(1);
2070
+ break;
2071
+ }
2072
+ GEN_CONTEXT$0.jumpToEnd();
2073
+ """ );
2074
+ }
1998
2075
}
0 commit comments