// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Flags: --allow-natives-syntax --opt

// Test that ObjectIsArrayBufferView lowering works correctly
// in EffectControlLinearizer in the case that the input is
// known to be a HeapObject by TurboFan. For this we use the
// simple trick with an object literal whose field `x` will
// only ever contain HeapObjects and so the representation
// tracking is going to pick it up.
(function() {
  function foo(x) {
    return ArrayBuffer.isView({x}.x);
  }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(Symbol()));
  assertFalse(foo("some string"));
  assertFalse(foo(new Object()));
  assertFalse(foo(new Array()));
  assertFalse(foo(new ArrayBuffer(1)));
  assertTrue(foo(new Int32Array(1)));
  assertTrue(foo(new DataView(new ArrayBuffer(1))));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(Symbol()));
  assertFalse(foo("some string"));
  assertFalse(foo(new Object()));
  assertFalse(foo(new Array()));
  assertFalse(foo(new ArrayBuffer(1)));
  assertTrue(foo(new Int32Array(1)));
  assertTrue(foo(new DataView(new ArrayBuffer(1))));
  assertOptimized(foo);
})();

// Test that ObjectIsArrayBufferView lowering works correctly
// in EffectControlLinearizer in the case that the input is
// some arbitrary tagged value.
(function() {
  function foo(x) {
    return ArrayBuffer.isView(x);
  }

  %PrepareFunctionForOptimization(foo);
  assertFalse(foo(1));
  assertFalse(foo(1.1));
  assertFalse(foo(Symbol()));
  assertFalse(foo("some string"));
  assertFalse(foo(new Object()));
  assertFalse(foo(new Array()));
  assertFalse(foo(new ArrayBuffer(1)));
  assertTrue(foo(new Int32Array(1)));
  assertTrue(foo(new DataView(new ArrayBuffer(1))));
  %OptimizeFunctionOnNextCall(foo);
  assertFalse(foo(1));
  assertFalse(foo(1.1));
  assertFalse(foo(Symbol()));
  assertFalse(foo("some string"));
  assertFalse(foo(new Object()));
  assertFalse(foo(new Array()));
  assertFalse(foo(new ArrayBuffer(1)));
  assertTrue(foo(new Int32Array(1)));
  assertTrue(foo(new DataView(new ArrayBuffer(1))));
  assertOptimized(foo);
})();
