Commit bbc32bd2 authored by Toon Verwaest's avatar Toon Verwaest Committed by Commit Bot

[keys] Fix dictionary-mode prototype invalidation

When the enumerability flag is flipped we need to invalidate the
prototype info.

Bug: chromium:1163499
Change-Id: Iceeaa5fc47eebfe7d333c9eb594bf0763e6cef92
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2831871
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Auto-Submit: Toon Verwaest <verwaest@chromium.org>
Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Cr-Commit-Position: refs/heads/master@{#74013}
parent 567f4828
...@@ -488,11 +488,15 @@ void LookupIterator::ReconfigureDataProperty(Handle<Object> value, ...@@ -488,11 +488,15 @@ void LookupIterator::ReconfigureDataProperty(Handle<Object> value,
if (!IsElement(*holder) && !holder_obj->HasFastProperties(isolate_)) { if (!IsElement(*holder) && !holder_obj->HasFastProperties(isolate_)) {
if (holder_obj->map(isolate_).is_prototype_map() && if (holder_obj->map(isolate_).is_prototype_map() &&
(property_details_.attributes() & READ_ONLY) == 0 && (((property_details_.attributes() & READ_ONLY) == 0 &&
(attributes & READ_ONLY) != 0) { (attributes & READ_ONLY) != 0) ||
(property_details_.attributes() & DONT_ENUM) !=
(attributes & DONT_ENUM))) {
// Invalidate prototype validity cell when a property is reconfigured // Invalidate prototype validity cell when a property is reconfigured
// from writable to read-only as this may invalidate transitioning store // from writable to read-only as this may invalidate transitioning store
// IC handlers. // IC handlers.
// Invalidate prototype validity cell when a property changes
// enumerability to clear the prototype chain enum cache.
JSObject::InvalidatePrototypeChains(holder->map(isolate_)); JSObject::InvalidatePrototypeChains(holder->map(isolate_));
} }
if (holder_obj->IsJSGlobalObject(isolate_)) { if (holder_obj->IsJSGlobalObject(isolate_)) {
......
// Copyright 2021 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 o1 = {k:1};
const o2 = Object.create(o1);
for (let i = 0; i < 1100; i++) {
Object.defineProperty(o1, "k" + i, {value: 0, enumerable: false});
}
Object.defineProperty(o1, "enum", {value: 1, enumerable: false, configurable: true});
for (let k in o2) {}
Object.defineProperty(o1, "enum", {value: 1, enumerable: true, configurable: true});
let last;
for (let k in o2) { last = k }
assertEquals("enum", last);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment