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

// This test suite checks that the receiver value (i.e. the 'this' binding) is
// correctly converted even when the callee function is inlined. This behavior
// is specified by ES6, section 9.2.1.2 "OrdinaryCallBindThis".

var global = this;
function test(outer, inner, check) {
  check(outer());
  check(outer());
  %OptimizeFunctionOnNextCall(outer);
  check(outer());
}


// -----------------------------------------------------------------------------
// Test undefined in sloppy mode.
(function UndefinedSloppy() {
  function check(x) {
    assertEquals("object", typeof x);
    assertSame(global, x);
  }
  function inner(x) {
    return this;
  }
  function outer() {
    return sloppy();
  }
  global.sloppy = inner;
  test(outer, inner, check);
})();


// -----------------------------------------------------------------------------
// Test undefined in strict mode.
(function UndefinedStrict() {
  function check(x) {
    assertEquals("undefined", typeof x);
    assertSame(undefined, x);
  }
  function inner(x) {
    "use strict";
    return this;
  }
  function outer() {
    return strict();
  }
  global.strict = inner;
  test(outer, inner, check);
})();


// -----------------------------------------------------------------------------
// Test primitive number in sloppy mode.
(function NumberSloppy() {
  function check(x) {
    assertEquals("object", typeof x);
    assertInstanceof(x, Number);
  }
  function inner(x) {
    return this;
  }
  function outer() {
    return (0).sloppy();
  }
  Number.prototype.sloppy = inner;
  test(outer, inner, check);
})();


// -----------------------------------------------------------------------------
// Test primitive number in strict mode.
(function NumberStrict() {
  function check(x) {
    assertEquals("number", typeof x);
    assertSame(0, x);
  }
  function inner(x) {
    "use strict";
    return this;
  }
  function outer() {
    return (0).strict();
  }
  Number.prototype.strict = inner;
  test(outer, inner, check);
})();


// -----------------------------------------------------------------------------
// Test primitive string in sloppy mode.
(function StringSloppy() {
  function check(x) {
    assertEquals("object", typeof x);
    assertInstanceof(x, String);
  }
  function inner(x) {
    return this;
  }
  function outer() {
    return ("s").sloppy();
  }
  String.prototype.sloppy = inner;
  test(outer, inner, check);
})();


// -----------------------------------------------------------------------------
// Test primitive string in strict mode.
(function StringStrict() {
  function check(x) {
    assertEquals("string", typeof x);
    assertSame("s", x);
  }
  function inner(x) {
    "use strict";
    return this;
  }
  function outer() {
    return ("s").strict();
  }
  String.prototype.strict = inner;
  test(outer, inner, check);
})();
