// Copyright (C) 2016 the V8 project authors. All rights reserved.
// This code is governed by the BSD license found in the LICENSE file.
/*---
esid: sec-ecmascript-function-objects-construct-argumentslist-newtarget
description: >
  Error retrieving function realm from revoked Proxy exotic object (honoring
  the Realm of the current execution context)
info: |
  [...]
  5. If kind is "base", then
     a. Let thisArgument be ? OrdinaryCreateFromConstructor(newTarget,
        "%ObjectPrototype%").
  [...]

  9.1.13 OrdinaryCreateFromConstructor

  [...]
  2. Let proto be ? GetPrototypeFromConstructor(constructor,
     intrinsicDefaultProto).
  [...]

  9.1.14 GetPrototypeFromConstructor

  [...]
  3. Let proto be ? Get(constructor, "prototype").
  4. If Type(proto) is not Object, then
     a. Let realm be ? GetFunctionRealm(constructor).

  7.3.22 GetFunctionRealm

  [...]
  2. If obj has a [[Realm]] internal slot, then
     [...]
  3. If obj is a Bound Function exotic object, then
     [...]
  4. If obj is a Proxy exotic object, then
     a. If the value of the [[ProxyHandler]] internal slot of obj is null,
        throw a TypeError exception.
features: [cross-realm, Proxy]
---*/

var other = $262.createRealm().global;
// Defer proxy revocation until after the `constructor` property has been
// accessed
var handlers = {
  get: function() {
    handle.revoke();
  }
};
var handle = other.Proxy.revocable(function() {}, handlers);
var f = handle.proxy;

assert.sameValue(typeof f, 'function');

assert.throws(TypeError, function() {
  new f();
});
