1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Flags: --use-osr --allow-natives-syntax --turbo-osr
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvar global_counter = 0;
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction thrower() {
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  var x = global_counter++;
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (x == 5)  %OptimizeOsr(thrower.caller);
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  if (x == 10) throw "terminate";
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch%NeverOptimizeFunction(thrower);  // Don't want to inline the thrower.
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch%NeverOptimizeFunction(test);     // Don't want to inline the func into test.
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction test(func) {
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (var i = 0; i < 3; i++) {
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    global_counter = 0;
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    assertThrows(func);
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction n1() {
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (true) thrower();
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction n2() {
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (true) while (true) thrower();
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction n3() {
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (true) while (true) while (true) thrower();
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction n4() {
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (true) while (true) while (true) while (true) thrower();
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction b1(a) {
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (true) {
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    thrower();
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    if (a) break
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction b2(a) {
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (true) {
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    while (true) {
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      thrower();
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (a) break
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochfunction b3(a) {
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  while (true) {
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    while (true) {
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      while (true) {
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        thrower();
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        if (a) break
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (a) break
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtest(n1);
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtest(n2);
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtest(n3);
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtest(n4);
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtest(b1);
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtest(b2);
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtest(b3);
79