blob: 509e7c9aafca328da8ed48b08ada568ce8108416 [file] [log] [blame]
// Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// This code is not run directly. It needs to be compiled to dex code.
// 'trycatch.dex' is what is run.
package trycatch;
class TryCatch {
private static class Thrower {
private boolean shouldThrow;
public Thrower(boolean shouldThrow) {
this.shouldThrow = shouldThrow;
}
public void maybeThrow() {
if (shouldThrow) {
throw new RuntimeException();
}
}
}
private static void throwOrCatch(Thrower thrower) {
String firstJunk = "junk 1";
String result = "Did not throw";
String secondJunk = "junk 2";
try {
thrower.maybeThrow();
} catch (Throwable e) {
String tmp = secondJunk;
secondJunk = firstJunk;
result = "Did throw";
firstJunk = tmp;
}
System.out.println(result);
System.out.println(firstJunk);
System.out.println(secondJunk);
}
private static void throwOnPositive(int i) {
if (i > 0) {
throw new RuntimeException();
}
}
private static int loopWhileThrow(int i) {
while (true) {
int result = 100;
try {
throwOnPositive(i--);
return result;
} catch (Throwable e) {
}
}
}
private static void foo() {
try {
throw new RuntimeException();
} catch (IllegalStateException e) {
System.out.println("Error!");
}
}
private static String tryCatchPhi(int i) {
String result = "one";
String otherResult = "two";
try {
throwOnPositive(i++);
result = otherResult;
throwOnPositive(i);
} catch (Throwable e) {
return result;
}
return "three";
}
private static void emptyMethod(int x) {
}
private static int regressRemoveCatchHandlers(int a, int b) {
try {
if (a == b) {
emptyMethod(a);
return 0;
} else {
emptyMethod(a);
return a / b;
}
} catch (IllegalStateException | ArithmeticException e) {
System.out.println("Error!");
}
return -1;
}
static final int NUM_OF_EVENTS_PER_FILE = 8192;
public static Object regressMultiNewArray() {
try {
int[][] args = new int[3][NUM_OF_EVENTS_PER_FILE];
return args;
} catch (Exception e) {
return null;
}
}
// Create a class hierarchy which introduces a bridge method (B::x returning Object) by
// overriding a method (A::x) with one with a narrower type.
public static class A {
public Object x() {
return null;
}
}
public static class B extends A {
// This bridge method will be generated.
// public Object x() {
// return result of call "String x()"
//}
public String x() {
return null;
}
}
static B b = new B();
public static Object regressBridgeMethod() {
String s;
try {
s = b.x();
} catch (ClassCastException e) {
return null;
}
return s;
}
public static void main(String[] args) {
loopWhileThrow(-100);
throwOrCatch(new Thrower(false));
throwOrCatch(new Thrower(true));
System.out.println(tryCatchPhi(-1));
System.out.println(tryCatchPhi(0));
System.out.println(tryCatchPhi(1));
try {
foo();
} catch (RuntimeException e) {
System.out.print("Success!");
}
regressRemoveCatchHandlers(1, 0);
regressMultiNewArray();
regressBridgeMethod();
}
}