/*
 * Any copyright is dedicated to the Public Domain.
 * http://creativecommons.org/licenses/publicdomain/
 */

if (!this.hasOwnProperty("TypedObject"))
  quit();

setJitCompilerOption("ion.warmup.trigger", 30);

var N = 100;
var T = TypedObject;
var Point = new T.StructType({x: T.uint32, y: T.uint32, z: T.uint32});
var PointArray = Point.array(N);

function bar(array, i, x, y, z) {
  assertEq(array[i].x, x);
  assertEq(array[i].y, y);
  assertEq(array[i].z, z);
}

function foo() {
  var array = new PointArray();
  for (var i = 0; i < N; i++) {
    array[i].x = i + 0;
    array[i].y = i + 1;
    array[i].z = i + 2;
  }

  // get it primed up..
  for (var i = 0; i < N; i++)
    bar(array, i, i, i + 1, i + 2);

  // ...do some OOB accesses...
  for (var i = 0; i < N; i++) {
    try {
      bar(array, N, undefined, undefined, undefined);
      assertEq(false, true);
    } catch(e) { }
  }

  // ...test again.
  for (var i = 0; i < N; i++)
    bar(array, i, i, i + 1, i + 2);
}

foo();
