/* -*- tab-width: 8; indent-tabs-mode: nil; js-indent-level: 2 -*-
 * This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

/* Susceptible to timeouts on some systems, see bug 1203595, if run
 * with --ion-eager --ion-offthread-compile=off.
 *
 * Probably only meaningful to run this with default flags.
 */

/* This test is intended to test Ion code generation for the internal
 * primitive TypeDescrIsArrayType(), available to self-hosted code.
 *
 * This test differs from the one in TypedObject-TypeDescrIsArrayType.js
 * in that it tries to hide type information from the JIT.  Sadly,
 * it turns out to be hard to write a test that causes a run-time test
 * to be inserted at the right spot.  This is my best effort,
 * but the test was still specialized as "true" in the generated code
 * last I looked.
 *
 * To do that, it must trigger enough uses of that primitive as well
 * as enough uses of a caller of the primitive to trigger inlining of
 * the primitive into its compiled caller.
 *
 * It turns out that TypeDescrIsArrayType() is used early in the map()
 * method on TypedObject arrays, so code that heavily uses the latter
 * method will usually be good enough.
 *
 * In practice this test just asserts that map() works, and thus that
 * the code for TypeDescrIsArrayType() is at least not completely
 * broken.
 *
 * The test is only meaningful if inlining actually happens.  Here is
 * how to verify that (manually):
 *
 * Run this with IONFLAGS=logs, generate pdfs with iongraph, and then
 * try running "pdfgrep TypeDescrIsArrayType func*pass00*.pdf", this
 * might net a function that is a likely candidate for manual inspection.
 *
 * (It is sometimes useful to neuter the assert() macro in the
 * self-hosted code.)
 */

if (!this.TypedObject) {
    print("No TypedObject, skipping");
    quit();
}

var T = TypedObject;
var AT = new T.ArrayType(T.int32, 100);

function check(v) {
    return v.map(x => x+1);
}

function Array_build(n, f) {
  var a = new Array(n);
  for ( var i=0 ; i < n ; i++ )
    a[i] = f(i);
  return a;
}

function test() {
    var w1 = AT.build(x => x+1);
    var w2 = Array_build(100, x => x+1);
    w2.map = w1.map;
    var a = [ w1, w2 ];
    for ( var i=0 ; i < 2000 ; i++ )
	try { a[i%2] = check(a[i%2]); } catch (e) { assertEq( i%2, 1 ); }
    return a[0];
}

var w = test();
assertEq(w.length, 100);
assertEq(w[99], 1100);
print("Done");
