v8/test/mjsunit/regress/regress-776338.js
jgruber db09c2a60b [proxy] Fix invalid call to getter in [[Get/Set/Has]]
Fixes the implementation of step 9 in the Proxy's internal [[Get]]
method:

Let targetDesc be ? target.[[GetOwnProperty]](P)

If P is an accessor, this should not result in a call to the getter.
Likewise in [[Set]] and [[Has]].

https://tc39.github.io/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-get-p-receiver

Bug: chromium:776338
Change-Id: I2652ffab2b3e4c38de00a82b8419192fdc768951
Reviewed-on: https://chromium-review.googlesource.com/732897
Reviewed-by: Georg Neis <neis@chromium.org>
Commit-Queue: Jakob Gruber <jgruber@chromium.org>
Cr-Commit-Position: refs/heads/master@{#48825}
2017-10-23 11:21:26 +00:00

45 lines
1.1 KiB
JavaScript

// Copyright 2017 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.
const obj = {};
Object.defineProperty(obj, 'value', {
enumerable: true,
configurable: true,
get: assertUnreachable,
set: assertUnreachable,
});
let called_get = false;
let called_has = false;
let called_set = false;
const has = function(target, prop) {
assertEquals('value', prop);
called_has = true;
return false; // Need to return false to trigger GetOwnProperty call.
};
const get = function(target, prop) {
assertEquals('value', prop);
called_get = true;
return 'yep';
};
const set = function(target, prop, value) {
assertEquals('value', prop);
called_set = true;
return true; // Need to return true to trigger GetOwnProperty call.
};
const proxy = new Proxy(obj, { has, get, set });
assertFalse(Reflect.has(proxy, 'value'));
assertTrue(called_has);
assertEquals('nope', proxy.value = 'nope');
assertTrue(called_set);
assertEquals('yep', proxy.value);
assertTrue(called_get);