// 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.

// This unit test of dart2js checks that a SSA bailout target
// instruction gets removed from the graph when it's not used.

import "package:expect/expect.dart";
import 'compiler_helper.dart';

String TEST = r'''
main() {
  foo(1);
  foo([]);
}

class A {
  operator -() => this;
}

foo(a) {
  new A(); // Force having another operator-
  // Make the method recursive to always enable bailouts
  // and force a list instantiation.
  foo([]);
  // Force bailout on [a].
  for (int i = 0; i < 100; i++) a[0] = 42;
  // Force bailout on [:a.length:].
  for (int i = 0; i < 200; i++) a[0] = -a.length;
}
''';

main() {
  String generated = compile(TEST, entry: 'foo');

  // Check that we only have one bailout call. The second bailout call
  // is dead code because we know [:a.length:] is an int.
  checkNumberOfMatches(new RegExp('bailout').allMatches(generated).iterator, 1);

  // Check that the foo method does not have any call to
  // 'getInterceptor'. The environment for the second bailout contains
  // the interceptor of [:a.length:], but since the bailout is
  // removed, the interceptor is removed too.
  if (generated.contains(r'getInterceptor(a).$is')) {
    // If we have an interceptor for a type check, it should be the only one.
    checkNumberOfMatches(
        new RegExp('getInterceptor').allMatches(generated).iterator, 1);
  } else {
    Expect.isTrue(!generated.contains('getInterceptor'));
  }

  generated = compileAll(TEST);
  
  // Check that the foo bailout method is generated.
  checkNumberOfMatches(
      new RegExp('foo\\\$bailout').allMatches(generated).iterator, 2);

  // Check that it's the only bailout method.
  checkNumberOfMatches(new RegExp('bailout').allMatches(generated).iterator, 2);

  // Check that the bailout method has a case 2 for the state, which
  // is the second bailout in foo.
  Expect.isTrue(generated.contains('case 2:'));

  // Finally, make sure that the reason foo does not contain
  // 'getInterceptor' is not because the compiler renamed it.
  Expect.isTrue(generated.contains('getInterceptor'));
}
