| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 785bd4ce4f579d7b04d43fda5e97360d4233dcdc..7db464e8c901207c569be2ef6daf8929f924371b 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -5679,7 +5679,8 @@ static void FreezeDictionary(Dictionary* dictionary) {
|
| int capacity = dictionary->Capacity();
|
| for (int i = 0; i < capacity; i++) {
|
| Object* k = dictionary->KeyAt(i);
|
| - if (dictionary->IsKey(k)) {
|
| + if (dictionary->IsKey(k) &&
|
| + !(k->IsSymbol() && Symbol::cast(k)->is_private())) {
|
| PropertyDetails details = dictionary->DetailsAt(i);
|
| int attrs = DONT_DELETE;
|
| // READ_ONLY is an invalid attribute for JS setters/getters.
|
| @@ -7453,17 +7454,20 @@ Handle<DescriptorArray> DescriptorArray::CopyUpToAddAttributes(
|
| if (attributes != NONE) {
|
| for (int i = 0; i < size; ++i) {
|
| Object* value = desc->GetValue(i);
|
| + Name* key = desc->GetKey(i);
|
| PropertyDetails details = desc->GetDetails(i);
|
| - int mask = DONT_DELETE | DONT_ENUM;
|
| - // READ_ONLY is an invalid attribute for JS setters/getters.
|
| - if (details.type() != CALLBACKS || !value->IsAccessorPair()) {
|
| - mask |= READ_ONLY;
|
| + // Bulk attribute changes never affect private properties.
|
| + if (!key->IsSymbol() || !Symbol::cast(key)->is_private()) {
|
| + int mask = DONT_DELETE | DONT_ENUM;
|
| + // READ_ONLY is an invalid attribute for JS setters/getters.
|
| + if (details.type() != CALLBACKS || !value->IsAccessorPair()) {
|
| + mask |= READ_ONLY;
|
| + }
|
| + details = details.CopyAddAttributes(
|
| + static_cast<PropertyAttributes>(attributes & mask));
|
| }
|
| - details = details.CopyAddAttributes(
|
| - static_cast<PropertyAttributes>(attributes & mask));
|
| - Descriptor inner_desc(handle(desc->GetKey(i)),
|
| - handle(value, desc->GetIsolate()),
|
| - details);
|
| + Descriptor inner_desc(
|
| + handle(key), handle(value, desc->GetIsolate()), details);
|
| descriptors->Set(i, &inner_desc, witness);
|
| }
|
| } else {
|
|
|