| // 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 | |
| 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) { | |
| dynamic 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)); | |
| } |