// 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: --harmony-proxies --harmony-reflect

// Test that traps that involve walking the target object's prototype chain
// don't overflow the stack when the original proxy is on that chain.

(function TestGetPrototype() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  try { return p.__proto__; } catch(e) { assertInstanceof(e, RangeError); }
})();

(function TestSetPrototype() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  try { p.__proto__ = p; } catch(e) { assertInstanceof(e, RangeError); }
})();

(function TestHasProperty() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  try {
    return Reflect.has(p, "foo");
  } catch(e) { assertInstanceof(e, RangeError); }
})();

(function TestSet() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  try { p.foo = 1; } catch(e) { assertInstanceof(e, RangeError); }
})();

(function TestGet() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  try { return p.foo; } catch(e) { assertInstanceof(e, RangeError); }
})();

(function TestEnumerate() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  try { for (var x in p) {} } catch(e) { assertInstanceof(e, RangeError); }
})();

// The following traps don't involve the target object's prototype chain;
// we test them anyway for completeness.

(function TestIsExtensible() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  return Reflect.isExtensible(p);
})();

(function TestPreventExtensions() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  Reflect.preventExtensions(p);
})();

(function TestGetOwnPropertyDescriptor() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  return Object.getOwnPropertyDescriptor(p, "foo");
})();

(function TestDeleteProperty() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  delete p.foo;
})();

(function TestDefineProperty() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  Object.defineProperty(p, "foo", {value: "bar"});
})();

(function TestOwnKeys() {
  var p = new Proxy({}, {});
  p.__proto__ = p;
  return Reflect.ownKeys(p);
})();

(function TestCall() {
  var p = new Proxy(function() {}, {});
  p.__proto__ = p;
  return p();
})();

(function TestConstruct() {
  var p = new Proxy(function() { this.foo = 1; }, {});
  p.__proto__ = p;
  return new p();
})();
