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

const limit = %MaxSmi() + 1;

(function() {
  function foo() {
    try { new Int8Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Int8Array/.test(foo()));
  assertTrue(/new Int8Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Int8Array/.test(foo()));
})();

(function() {
  function foo() {
    try { new Uint8Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Uint8Array/.test(foo()));
  assertTrue(/new Uint8Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Uint8Array/.test(foo()));
})();

(function() {
  function foo() {
    try { new Uint8ClampedArray(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Uint8ClampedArray/.test(foo()));
  assertTrue(/new Uint8ClampedArray/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Uint8ClampedArray/.test(foo()));
})();

(function() {
  function foo() {
    try { new Int16Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Int16Array/.test(foo()));
  assertTrue(/new Int16Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Int16Array/.test(foo()));
})();

(function() {
  function foo() {
    try { new Uint16Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Uint16Array/.test(foo()));
  assertTrue(/new Uint16Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Uint16Array/.test(foo()));
})();

(function() {
  function foo() {
    try { new Int32Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Int32Array/.test(foo()));
  assertTrue(/new Int32Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Int32Array/.test(foo()));
})();

(function() {
  function foo() {
    try { new Uint32Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Uint32Array/.test(foo()));
  assertTrue(/new Uint32Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Uint32Array/.test(foo()));
})();

(function() {
  function foo() {
    try { new Float32Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Float32Array/.test(foo()));
  assertTrue(/new Float32Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Float32Array/.test(foo()));
})();


(function() {
  function foo() {
    try { new Float64Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new Float64Array/.test(foo()));
  assertTrue(/new Float64Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new Float64Array/.test(foo()));
})();

(function() {
  function foo() {
    try { new BigInt64Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new BigInt64Array/.test(foo()));
  assertTrue(/new BigInt64Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new BigInt64Array/.test(foo()));
})();

(function() {
  function foo() {
    try { new BigUint64Array(limit); } catch (e) { return e.stack; }
  }

  %PrepareFunctionForOptimization(foo);
  assertTrue(/new BigUint64Array/.test(foo()));
  assertTrue(/new BigUint64Array/.test(foo()));
  %OptimizeFunctionOnNextCall(foo);
  assertTrue(/new BigUint64Array/.test(foo()));
})();
