[keys] propagate PropertyFilter to proxy targets in KeyAccumulator

BUG=v8:5174, v8:1543
R=cbruni@chromium.org, littledan@chromium.org

Review-Url: https://codereview.chromium.org/2129193003
Cr-Commit-Position: refs/heads/master@{#37634}
This commit is contained in:
caitp 2016-07-11 03:38:33 -07:00 committed by Commit bot
parent 3e2085eba4
commit 08d0012dda
4 changed files with 46 additions and 6 deletions

View File

@ -853,7 +853,11 @@ Maybe<bool> KeyAccumulator::CollectOwnJSProxyTargetKeys(
// TODO(cbruni): avoid creating another KeyAccumulator
Handle<FixedArray> keys;
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate_, keys, JSReceiver::OwnPropertyKeys(target), Nothing<bool>());
isolate_, keys,
KeyAccumulator::GetKeys(target, KeyCollectionMode::kOwnOnly, filter_,
GetKeysConversion::kConvertToString,
filter_proxy_keys_, is_for_in_),
Nothing<bool>());
bool prev_filter_proxy_keys_ = filter_proxy_keys_;
filter_proxy_keys_ = false;
Maybe<bool> result = AddKeysFromJSProxy(proxy, keys);

View File

@ -8308,11 +8308,13 @@ MaybeHandle<FixedArray> GetOwnValuesOrEntries(Isolate* isolate,
PropertyFilter key_filter =
static_cast<PropertyFilter>(filter & ~ONLY_ENUMERABLE);
KeyAccumulator accumulator(isolate, KeyCollectionMode::kOwnOnly, key_filter);
MAYBE_RETURN(accumulator.CollectKeys(object, object),
MaybeHandle<FixedArray>());
Handle<FixedArray> keys =
accumulator.GetKeys(GetKeysConversion::kConvertToString);
Handle<FixedArray> keys;
ASSIGN_RETURN_ON_EXCEPTION_VALUE(
isolate, keys,
KeyAccumulator::GetKeys(object, KeyCollectionMode::kOwnOnly, key_filter,
GetKeysConversion::kConvertToString),
MaybeHandle<FixedArray>());
values_or_entries = isolate->factory()->NewFixedArray(keys->length());
int length = 0;

View File

@ -48,3 +48,31 @@ assertEquals(["target"], Object.keys(proxy2));
assertEquals(["1","2"], Object.getOwnPropertyNames(p));
assertEquals([symbol], Object.getOwnPropertySymbols(p));
})();
(function testNoProxyTraps() {
var test_sym = Symbol("sym1");
var test_sym2 = Symbol("sym2");
var target = {
one: 1,
two: 2,
[test_sym]: 4,
0: 0,
};
Object.defineProperty(
target, "non-enum",
{ enumerable: false, value: "nope", configurable: true, writable: true });
target.__proto__ = {
target_proto: 3,
1: 1,
[test_sym2]: 5
};
Object.defineProperty(
target.__proto__, "non-enum2",
{ enumerable: false, value: "nope", configurable: true, writable: true });
var proxy = new Proxy(target, {});
assertEquals(["0", "one", "two"], Object.keys(proxy));
assertEquals(["0", "one", "two", "non-enum"],
Object.getOwnPropertyNames(proxy));
assertEquals([test_sym], Object.getOwnPropertySymbols(proxy));
})();

View File

@ -0,0 +1,6 @@
// Copyright 2016 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.
assertEquals([], Object.keys(new Proxy([], {})));
assertEquals([], Object.keys(new Proxy(/regex/, {})));