blob: 41b56b0fc52e433d2c7d93b16ef917d7187ddba5 [file] [log] [blame]
// Copyright (c) 2013, the Dart 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.
// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
// @dart = 2.9
import "package:expect/expect.dart";
maythrow(x) {
if (x == null) throw 42;
return 99;
}
f1(x) {
var result = 123;
try {
result = maythrow(x);
if (result > 100) throw 42;
} catch (e) {
Expect.equals(result, 123);
Expect.equals(42, e);
result = 0;
}
return result;
}
class A {
maythrow(x) {
if (x == null) throw 42;
return 99;
}
}
f2(x) {
var result = 123;
var a = new A();
try {
result++;
result = a.maythrow(x);
} catch (e) {
Expect.equals(124, result);
result = x;
}
return result;
}
f3(x, y) {
var result = 123;
var a = new A();
try {
result++;
result = a.maythrow(x);
} catch (e) {
result = y + 1; // Deopt on overflow
}
return result;
}
f4(x) {
try {
maythrow(x);
} catch (e) {
check_f4(e, "abc");
}
}
check_f4(e, s) {
if (e != 42) throw "ERROR";
if (s != "abc") throw "ERROR";
}
f5(x) {
try {
maythrow(x);
} catch (e) {
check_f5(e, "abc");
}
try {
maythrow(x);
} catch (e) {
check_f5(e, "abc");
}
}
check_f5(e, s) {
if (e != 42) throw "ERROR";
if (s != "abc") throw "ERROR";
}
f6(x, y) {
var a = x;
var b = y;
var c = 123;
check_f6(42, null, 1, 123, null, 1);
try {
maythrow(x);
} catch (e) {
check_f6(e, a, b, c, x, y);
}
}
check_f6(e, a, b, c, x, y) {
if (e != 42) throw "ERROR";
if (a != null) throw "ERROR";
if (b != 1) throw "ERROR";
if (c != 123) throw "ERROR";
if (x != null) throw "ERROR";
if (y != 1) throw "ERROR";
}
bool f7(String str) {
double d = double.parse(str);
var t = d;
try {
var a = d.toInt();
return false;
} on UnsupportedError catch (e) {
Expect.equals(true, identical(t, d));
return true;
}
}
f8(x, [a = 3, b = 4]) {
var c = 123;
var y = a;
try {
maythrow(x);
} catch (e, s) {
check_f8(e, s, a, b, c, x, y);
}
}
check_f8(e, s, a, b, c, x, y) {
if (e != 42) throw "ERROR";
if (s is! StackTrace) throw "ERROR";
if (a != 3) {
print(a);
throw "ERROR";
}
if (b != 4) throw "ERROR";
if (c != 123) throw "ERROR";
if (x != null) throw "ERROR";
if (y != a) throw "ERROR";
}
f9(x, [a = 3, b = 4]) {
var c = 123;
var y = a;
try {
if (x < a) maythrow(null);
maythrow(x);
} catch (e, s) {
check_f9(e, s, a, b, c, x, y);
}
}
check_f9(e, s, a, b, c, x, y) {
if (e != 42) throw "ERROR";
if (s is! StackTrace) throw "ERROR";
if (a != 3) {
print(a);
throw "ERROR";
}
if (b != 4) throw "ERROR";
if (c != 123) throw "ERROR";
if (x != null) throw "ERROR";
if (y != a) throw "ERROR";
}
f10(x, y) {
var result = 123;
try {
result = maythrow(x);
} catch (e) {
Expect.equals(123, result);
Expect.equals(0.5, y / 2.0);
result = 0;
}
return result;
}
f11(x) {
var result = 123;
var tmp = x;
try {
result = maythrow(x);
if (result > 100) throw 42;
} catch (e, s) {
Expect.equals(123, result);
Expect.equals(true, identical(tmp, x));
Expect.equals(true, s is StackTrace);
result = 0;
}
return result;
}
f12([x = null]) {
try {
maythrow(x);
} catch (e) {
check_f12(e, x);
}
}
check_f12(e, x) {
if (e != 42) throw "ERROR";
if (x != null) throw "ERROR";
}
f13(x) {
var result = 123;
try {
try {
result = maythrow(x);
if (result > 100) throw 42;
} catch (e) {
Expect.equals(123, result);
result = 0;
}
maythrow(x);
} catch (e) {
result++;
}
return result;
}
main() {
for (var i = 0; i < 20; i++) f1("abc");
Expect.equals(99, f1("abc"));
Expect.equals(0, f1(null));
for (var i = 0; i < 20; i++) f2("abc");
Expect.equals(99, f2("abc"));
Expect.equals(null, f2(null));
f3("123", 0);
for (var i = 0; i < 20; i++) f3(null, 0);
Expect.equals(99, f3("123", 0));
Expect.equals(0x40000000, f3(null, 0x3fffffff));
f4(null);
for (var i = 0; i < 20; i++) f4(123);
f4(null);
f5(null);
for (var i = 0; i < 20; i++) f5(123);
f5(null);
f6(null, 1);
for (var i = 0; i < 20; i++) f6(123, 1);
f6(null, 1);
f7("1.2");
f7("Infinity");
f7("-Infinity");
for (var i = 0; i < 20; i++) f7("1.2");
Expect.equals(false, f7("1.2"));
Expect.equals(true, f7("Infinity"));
Expect.equals(true, f7("-Infinity"));
Expect.equals(false, f7("123456789012345")); // Deopt.
for (var i = 0; i < 20; i++) f7("123456789012345");
Expect.equals(true, f7("Infinity"));
Expect.equals(true, f7("-Infinity"));
for (var i = 0; i < 20; i++) f8(null);
f8(null);
f9(5);
f9(5.0);
for (var i = 0; i < 20; i++) f9(3);
f9(3);
var y = 1.0;
Expect.equals(0, f10(null, y));
for (var i = 0; i < 20; i++) f10("abc", y);
Expect.equals(99, f10("abc", y));
Expect.equals(0, f10(null, y));
for (var i = 0; i < 20; i++) f11("abc");
Expect.equals(99, f11("abc"));
Expect.equals(0, f11(null));
for (var i = 0; i < 20; i++) f12(null);
f12(null);
f13(null);
for (var i = 0; i < 20; i++) f13("abc");
Expect.equals(99, f13("abc"));
Expect.equals(1, f13(null));
}