// Copyright 2012 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//     * Redistributions of source code must retain the above copyright
//       notice, this list of conditions and the following disclaimer.
//     * Redistributions in binary form must reproduce the above
//       copyright notice, this list of conditions and the following
//       disclaimer in the documentation and/or other materials provided
//       with the distribution.
//     * Neither the name of Google Inc. nor the names of its
//       contributors may be used to endorse or promote products derived
//       from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

// Flags: --allow-natives-syntax --expose-gc --nostress-opt --typed-array-max-size-in-heap=2048

var elements_kind = {
  fast_smi_only             :  'fast smi only elements',
  fast                      :  'fast elements',
  fast_double               :  'fast double elements',
  dictionary                :  'dictionary elements',
  fixed_int32               :  'fixed int8 elements',
  fixed_uint8               :  'fixed uint8 elements',
  fixed_int16               :  'fixed int16 elements',
  fixed_uint16              :  'fixed uint16 elements',
  fixed_int32               :  'fixed int32 elements',
  fixed_uint32              :  'fixed uint32 elements',
  fixed_float32             :  'fixed float32 elements',
  fixed_float64             :  'fixed float64 elements',
  fixed_uint8_clamped       :  'fixed uint8_clamped elements'
}

function getKind(obj) {
  if (%HasFastSmiElements(obj)) return elements_kind.fast_smi_only;
  if (%HasFastObjectElements(obj)) return elements_kind.fast;
  if (%HasFastDoubleElements(obj)) return elements_kind.fast_double;
  if (%HasDictionaryElements(obj)) return elements_kind.dictionary;

  if (%HasFixedInt8Elements(obj)) {
    return elements_kind.fixed_int8;
  }
  if (%HasFixedUint8Elements(obj)) {
    return elements_kind.fixed_uint8;
  }
  if (%HasFixedInt16Elements(obj)) {
    return elements_kind.fixed_int16;
  }
  if (%HasFixedUint16Elements(obj)) {
    return elements_kind.fixed_uint16;
  }
  if (%HasFixedInt32Elements(obj)) {
    return elements_kind.fixed_int32;
  }
  if (%HasFixedUint32Elements(obj)) {
    return elements_kind.fixed_uint32;
  }
  if (%HasFixedFloat32Elements(obj)) {
    return elements_kind.fixed_float32;
  }
  if (%HasFixedFloat64Elements(obj)) {
    return elements_kind.fixed_float64;
  }
  if (%HasFixedUint8ClampedElements(obj)) {
    return elements_kind.fixed_uint8_clamped;
  }
}

function assertKind(expected, obj, name_opt) {
  assertEquals(expected, getKind(obj), name_opt);
}

var me = {};
assertKind(elements_kind.fast, me);
me.dance = 0xD15C0;
me.drink = 0xC0C0A;
assertKind(elements_kind.fast, me);

var too = [1,2,3];
assertKind(elements_kind.fast_smi_only, too);
too.dance = 0xD15C0;
too.drink = 0xC0C0A;
assertKind(elements_kind.fast_smi_only, too);

// Make sure the element kind transitions from smi when a non-smi is stored.
function test_wrapper() {
  var you = new Array();
  assertKind(elements_kind.fast_smi_only, you);
  for (var i = 0; i < 1337; i++) {
    var val = i;
    if (i == 1336) {
      assertKind(elements_kind.fast_smi_only, you);
      val = new Object();
    }
    you[i] = val;
  }
  assertKind(elements_kind.fast, you);

  var temp = [];
  temp[0xDECAF] = 0;
  assertKind(elements_kind.dictionary, temp);

  var fast_double_array = new Array(0xDECAF);
  for (var i = 0; i < 0xDECAF; i++) fast_double_array[i] = i / 2;
  assertKind(elements_kind.fast_double, fast_double_array);

  assertKind(elements_kind.fixed_int8,    new Int8Array(007));
  assertKind(elements_kind.fixed_uint8,   new Uint8Array(007));
  assertKind(elements_kind.fixed_int16,   new Int16Array(666));
  assertKind(elements_kind.fixed_uint16,  new Uint16Array(42));
  assertKind(elements_kind.fixed_int32,   new Int32Array(0xF));
  assertKind(elements_kind.fixed_uint32,  new Uint32Array(23));
  assertKind(elements_kind.fixed_float32, new Float32Array(7));
  assertKind(elements_kind.fixed_float64, new Float64Array(0));
  assertKind(elements_kind.fixed_uint8_clamped, new Uint8ClampedArray(512));

  var ab = new ArrayBuffer(128);
  assertKind(elements_kind.fixed_int8,    new Int8Array(ab));
  assertKind(elements_kind.fixed_uint8,   new Uint8Array(ab));
  assertKind(elements_kind.fixed_int16,   new Int16Array(ab));
  assertKind(elements_kind.fixed_uint16,  new Uint16Array(ab));
  assertKind(elements_kind.fixed_int32,   new Int32Array(ab));
  assertKind(elements_kind.fixed_uint32,  new Uint32Array(ab));
  assertKind(elements_kind.fixed_float32, new Float32Array(ab));
  assertKind(elements_kind.fixed_float64, new Float64Array(ab));
  assertKind(elements_kind.fixed_uint8_clamped, new Uint8ClampedArray(ab));

  // Crankshaft support for smi-only array elements.
  function monomorphic(array) {
    assertKind(elements_kind.fast_smi_only, array);
    for (var i = 0; i < 3; i++) {
      array[i] = i + 10;
    }
    assertKind(elements_kind.fast_smi_only, array);
    for (var i = 0; i < 3; i++) {
      var a = array[i];
      assertEquals(i + 10, a);
    }
  }
  var smi_only = new Array(1, 2, 3);
  assertKind(elements_kind.fast_smi_only, smi_only);
  for (var i = 0; i < 3; i++) monomorphic(smi_only);
    %OptimizeFunctionOnNextCall(monomorphic);
  monomorphic(smi_only);
}

// The test is called in a wrapper function to eliminate the transition learning
// feedback of AllocationSites.
test_wrapper();
%ClearFunctionTypeFeedback(test_wrapper);

%NeverOptimizeFunction(construct_smis);

// This code exists to eliminate the learning influence of AllocationSites
// on the following tests.
var __sequence = 0;
function make_array_string() {
  this.__sequence = this.__sequence + 1;
  return "/* " + this.__sequence + " */  [0, 0, 0];"
}
function make_array() {
  return eval(make_array_string());
}

function construct_smis() {
  var a = make_array();
  a[0] = 0;  // Send the COW array map to the steak house.
  assertKind(elements_kind.fast_smi_only, a);
  return a;
}
  %NeverOptimizeFunction(construct_doubles);
function construct_doubles() {
  var a = construct_smis();
  a[0] = 1.5;
  assertKind(elements_kind.fast_double, a);
  return a;
}
  %NeverOptimizeFunction(construct_objects);
function construct_objects() {
  var a = construct_smis();
  a[0] = "one";
  assertKind(elements_kind.fast, a);
  return a;
}

// Test crankshafted transition SMI->DOUBLE.
  %NeverOptimizeFunction(convert_to_double);
function convert_to_double(array) {
  array[1] = 2.5;
  assertKind(elements_kind.fast_double, array);
  assertEquals(2.5, array[1]);
}
var smis = construct_smis();
for (var i = 0; i < 3; i++) convert_to_double(smis);
  %OptimizeFunctionOnNextCall(convert_to_double);
smis = construct_smis();
convert_to_double(smis);
// Test crankshafted transitions SMI->FAST and DOUBLE->FAST.
  %NeverOptimizeFunction(convert_to_fast);
function convert_to_fast(array) {
  array[1] = "two";
  assertKind(elements_kind.fast, array);
  assertEquals("two", array[1]);
}
smis = construct_smis();
for (var i = 0; i < 3; i++) convert_to_fast(smis);
var doubles = construct_doubles();
for (var i = 0; i < 3; i++) convert_to_fast(doubles);
smis = construct_smis();
doubles = construct_doubles();
  %OptimizeFunctionOnNextCall(convert_to_fast);
convert_to_fast(smis);
convert_to_fast(doubles);
// Test transition chain SMI->DOUBLE->FAST (crankshafted function will
// transition to FAST directly).
  %NeverOptimizeFunction(convert_mixed);
function convert_mixed(array, value, kind) {
  array[1] = value;
  assertKind(kind, array);
  assertEquals(value, array[1]);
}
smis = construct_smis();
for (var i = 0; i < 3; i++) {
  convert_mixed(smis, 1.5, elements_kind.fast_double);
}
doubles = construct_doubles();
for (var i = 0; i < 3; i++) {
  convert_mixed(doubles, "three", elements_kind.fast);
}
convert_mixed(construct_smis(), "three", elements_kind.fast);
convert_mixed(construct_doubles(), "three", elements_kind.fast);
  %OptimizeFunctionOnNextCall(convert_mixed);
smis = construct_smis();
doubles = construct_doubles();
convert_mixed(smis, 1, elements_kind.fast);
convert_mixed(doubles, 1, elements_kind.fast);
assertTrue(%HaveSameMap(smis, doubles));

// Crankshaft support for smi-only elements in dynamic array literals.
function get(foo) { return foo; }  // Used to generate dynamic values.

function crankshaft_test() {
  var a1 = [get(1), get(2), get(3)];
  assertKind(elements_kind.fast_smi_only, a1);

  var a2 = new Array(get(1), get(2), get(3));
  assertKind(elements_kind.fast_smi_only, a2);
  var b = [get(1), get(2), get("three")];
  assertKind(elements_kind.fast, b);
  var c = [get(1), get(2), get(3.5)];
  assertKind(elements_kind.fast_double, c);
}
for (var i = 0; i < 3; i++) {
  crankshaft_test();
}
%OptimizeFunctionOnNextCall(crankshaft_test);
crankshaft_test();

// Elements_kind transitions for arrays.

// A map can have three different elements_kind transitions: SMI->DOUBLE,
// DOUBLE->OBJECT, and SMI->OBJECT. No matter in which order these three are
// created, they must always end up with the same FAST map.

// Preparation: create one pair of identical objects for each case.
var a = [1, 2, 3];
var b = [1, 2, 3];
assertTrue(%HaveSameMap(a, b));
assertKind(elements_kind.fast_smi_only, a);
var c = [1, 2, 3];
c["case2"] = true;
var d = [1, 2, 3];
d["case2"] = true;
assertTrue(%HaveSameMap(c, d));
assertFalse(%HaveSameMap(a, c));
assertKind(elements_kind.fast_smi_only, c);
var e = [1, 2, 3];
e["case3"] = true;
var f = [1, 2, 3];
f["case3"] = true;
assertTrue(%HaveSameMap(e, f));
assertFalse(%HaveSameMap(a, e));
assertFalse(%HaveSameMap(c, e));
assertKind(elements_kind.fast_smi_only, e);
// Case 1: SMI->DOUBLE, DOUBLE->OBJECT, SMI->OBJECT.
a[0] = 1.5;
assertKind(elements_kind.fast_double, a);
a[0] = "foo";
assertKind(elements_kind.fast, a);
b[0] = "bar";
assertTrue(%HaveSameMap(a, b));
// Case 2: SMI->DOUBLE, SMI->OBJECT, DOUBLE->OBJECT.
c[0] = 1.5;
assertKind(elements_kind.fast_double, c);
assertFalse(%HaveSameMap(c, d));
d[0] = "foo";
assertKind(elements_kind.fast, d);
assertFalse(%HaveSameMap(c, d));
c[0] = "bar";
assertTrue(%HaveSameMap(c, d));
// Case 3: SMI->OBJECT, SMI->DOUBLE, DOUBLE->OBJECT.
e[0] = "foo";
assertKind(elements_kind.fast, e);
assertFalse(%HaveSameMap(e, f));
f[0] = 1.5;
assertKind(elements_kind.fast_double, f);
assertFalse(%HaveSameMap(e, f));
f[0] = "bar";
assertKind(elements_kind.fast, f);
assertTrue(%HaveSameMap(e, f));

// Test if Array.concat() works correctly with DOUBLE elements.
var a = [1, 2];
assertKind(elements_kind.fast_smi_only, a);
var b = [4.5, 5.5];
assertKind(elements_kind.fast_double, b);
var c = a.concat(b);
assertEquals([1, 2, 4.5, 5.5], c);
assertKind(elements_kind.fast_double, c);

// Test that Array.push() correctly handles SMI elements.
var a = [1, 2];
assertKind(elements_kind.fast_smi_only, a);
a.push(3, 4, 5);
assertKind(elements_kind.fast_smi_only, a);
assertEquals([1, 2, 3, 4, 5], a);

// Test that Array.splice() and Array.slice() return correct ElementsKinds.
var a = ["foo", "bar"];
assertKind(elements_kind.fast, a);
var b = a.splice(0, 1);
assertKind(elements_kind.fast, b);
var c = a.slice(0, 1);
assertKind(elements_kind.fast, c);

// Throw away type information in the ICs for next stress run.
gc();
