1// Copyright 2015 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5// Flags: --allow-natives-syntax
6
7var obj = %GetUndetectable();
8
9function shouldNotBeTaken() {
10  fail("Undetectable branch should not be taken", "branch was taken");
11}
12
13function shouldBeTaken() {
14  fail("Inverted Undetectable branch should be taken", "branch was not taken");
15}
16
17function testCompares() {
18  assertTrue(!obj);
19  assertFalse(!!obj);
20  assertFalse(obj == true);
21  assertFalse(obj == false);
22  assertFalse(obj === true);
23  assertFalse(obj === false);
24  assertEquals(2, obj ? 1 : 2);
25  assertEquals(obj, true && obj);
26  assertEquals(obj, false || obj);
27}
28
29function testIfs() {
30  if (obj) {
31    shouldNotBeTaken();
32  }
33
34  if (obj) {
35    shouldNotBeTaken();
36  } else {
37    // do nothing
38  }
39
40  if (!obj) {
41    // do nothing
42  } else {
43    shouldBeTaken();
44  }
45}
46
47function testWhiles() {
48  while (obj) {
49    shouldNotBeTaken();
50  }
51
52  var i = 0;
53  while (!obj) {
54    i++;
55    break;
56  }
57
58  assertEquals(1, i);
59}
60
61function testFors() {
62  for (var i = 0; obj; i++) {
63    shouldNotBeTaken();
64  }
65
66  var j = 0;
67  for (var i = 0; !obj; i++) {
68    j++;
69    break;
70  }
71
72  assertEquals(1, j);
73}
74
75for (var j = 0; j < 5; j++) {
76  testCompares();
77  testIfs();
78  testWhiles();
79  testFors();
80
81  if (j == 3) {
82    %OptimizeFunctionOnNextCall(testCompares);
83    %OptimizeFunctionOnNextCall(testIfs);
84    %OptimizeFunctionOnNextCall(testWhiles);
85    %OptimizeFunctionOnNextCall(testFors);
86  }
87}
88