// Copyright (C) 2020 Alexey Shvayka. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-createdynamicfunction
description: >
  While default [[Prototype]] value derives from realm of the newTarget,
  "prototype" object inherits from %Object.prototype% of constructor's realm.
info: |
  Function ( p1, p2, … , pn, body )

  [...]
  3. Return ? CreateDynamicFunction(C, NewTarget, normal, args).

  CreateDynamicFunction ( constructor, newTarget, kind, args )

  [...]
  18. Let proto be ? GetPrototypeFromConstructor(newTarget, fallbackProto).
  19. Let realmF be the current Realm Record.
  20. Let scope be realmF.[[GlobalEnv]].
  21. Let F be ! OrdinaryFunctionCreate(proto, parameters, body, non-lexical-this, scope).
  [...]
  25. Else if kind is normal, perform MakeConstructor(F).
  [...]
  30. Return F.

  MakeConstructor ( F [ , writablePrototype [ , prototype ] ] )

  [...]
  7. If prototype is not present, then
    a. Set prototype to OrdinaryObjectCreate(%Object.prototype%).
    [...]
  8. Perform ! DefinePropertyOrThrow(F, "prototype", PropertyDescriptor {[[Value]]: prototype,
  [[Writable]]: writablePrototype, [[Enumerable]]: false, [[Configurable]]: false }).
features: [cross-realm, Reflect]
---*/

var realmA = $262.createRealm().global;
realmA.calls = 0;

var realmB = $262.createRealm().global;
var newTarget = new realmB.Function();
newTarget.prototype = null;

var fn = Reflect.construct(realmA.Function, ["calls += 1;"], newTarget);
assert.sameValue(Object.getPrototypeOf(fn), realmB.Function.prototype);
assert.sameValue(Object.getPrototypeOf(fn.prototype), realmA.Object.prototype);

assert(new fn() instanceof realmA.Object);
assert.sameValue(realmA.calls, 1);

reportCompare(0, 0);
