// |jit-test| --ion-osr=off

// Eval-in-frame with different type on non-youngest Ion frame.

load(libdir + "jitopts.js");

if (!jitTogglesMatch(Opts_Ion2NoOffthreadCompilation))
  quit(0);

withJitOptions(Opts_Ion2NoOffthreadCompilation, function () {
  function test(shadow) {
    var g = newGlobal({newCompartment: true});
    var dbg = new Debugger;

    // Note that we depend on CCW scripted functions being opaque to Ion
    // optimization for this test.
    g.h = function h(d) {
      if (d) {
        dbg.addDebuggee(g);
        var f = dbg.getNewestFrame().older;
        assertEq(f.implementation, "ion");
        assertEq(f.environment.getVariable("foo"), 42);

        // EIF of a different type too.
        f.eval((shadow ? "var " : "") + "foo = 'string of 42'");
        g.expected = shadow ? 42 : "string of 42";
      }
    }

    g.eval("" + function f(d) {
      var foo = 42;
      g(d);
      return foo;
    });
    g.eval("" + function g(d) {
      h(d);
    });

    g.eval("(" + function () {
      for (i = 0; i < 5; i++)
        f(false);
      assertEq(f(true), "string of 42");
    } + ")();");
  }

  test(false);
  test(true);
});
