Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: src/objects.cc

Issue 2686513002: [key] Fix for-in with trailing shadowing keys with dict-mode receiver (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | test/mjsunit/for-in.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/objects.h" 5 #include "src/objects.h"
6 6
7 #include <cmath> 7 #include <cmath>
8 #include <iomanip> 8 #include <iomanip>
9 #include <memory> 9 #include <memory>
10 #include <sstream> 10 #include <sstream>
(...skipping 18029 matching lines...) Expand 10 before | Expand all | Expand 10 after
18040 return da.dictionary_index() < db.dictionary_index(); 18040 return da.dictionary_index() < db.dictionary_index();
18041 } 18041 }
18042 Dictionary* dict; 18042 Dictionary* dict;
18043 }; 18043 };
18044 18044
18045 template <typename Derived, typename Shape, typename Key> 18045 template <typename Derived, typename Shape, typename Key>
18046 void Dictionary<Derived, Shape, Key>::CopyEnumKeysTo( 18046 void Dictionary<Derived, Shape, Key>::CopyEnumKeysTo(
18047 Handle<Dictionary<Derived, Shape, Key>> dictionary, 18047 Handle<Dictionary<Derived, Shape, Key>> dictionary,
18048 Handle<FixedArray> storage, KeyCollectionMode mode, 18048 Handle<FixedArray> storage, KeyCollectionMode mode,
18049 KeyAccumulator* accumulator) { 18049 KeyAccumulator* accumulator) {
18050 DCHECK_IMPLIES(mode != KeyCollectionMode::kOwnOnly, accumulator != nullptr);
18050 Isolate* isolate = dictionary->GetIsolate(); 18051 Isolate* isolate = dictionary->GetIsolate();
18051 int length = storage->length(); 18052 int length = storage->length();
18052 int capacity = dictionary->Capacity(); 18053 int capacity = dictionary->Capacity();
18053 int properties = 0; 18054 int properties = 0;
18054 for (int i = 0; i < capacity; i++) { 18055 for (int i = 0; i < capacity; i++) {
18055 Object* key = dictionary->KeyAt(i); 18056 Object* key = dictionary->KeyAt(i);
18056 bool is_shadowing_key = false; 18057 bool is_shadowing_key = false;
18057 if (!dictionary->IsKey(isolate, key)) continue; 18058 if (!dictionary->IsKey(isolate, key)) continue;
18058 if (key->IsSymbol()) continue; 18059 if (key->IsSymbol()) continue;
18059 PropertyDetails details = dictionary->DetailsAt(i); 18060 PropertyDetails details = dictionary->DetailsAt(i);
18060 if (details.IsDontEnum()) { 18061 if (details.IsDontEnum()) {
18061 if (mode == KeyCollectionMode::kIncludePrototypes) { 18062 if (mode == KeyCollectionMode::kIncludePrototypes) {
18062 is_shadowing_key = true; 18063 is_shadowing_key = true;
18063 } else { 18064 } else {
18064 continue; 18065 continue;
18065 } 18066 }
18066 } 18067 }
18067 if (dictionary->IsDeleted(i)) continue; 18068 if (dictionary->IsDeleted(i)) continue;
18068 if (is_shadowing_key) { 18069 if (is_shadowing_key) {
18069 accumulator->AddShadowingKey(key); 18070 accumulator->AddShadowingKey(key);
18070 continue; 18071 continue;
18071 } else { 18072 } else {
18072 storage->set(properties, Smi::FromInt(i)); 18073 storage->set(properties, Smi::FromInt(i));
18073 } 18074 }
18074 properties++; 18075 properties++;
18075 if (properties == length) break; 18076 if (mode == KeyCollectionMode::kOwnOnly && properties == length) break;
18076 } 18077 }
18077 18078
18078 CHECK_EQ(length, properties); 18079 CHECK_EQ(length, properties);
18079 DisallowHeapAllocation no_gc; 18080 DisallowHeapAllocation no_gc;
18080 Dictionary<Derived, Shape, Key>* raw_dictionary = *dictionary; 18081 Dictionary<Derived, Shape, Key>* raw_dictionary = *dictionary;
18081 FixedArray* raw_storage = *storage; 18082 FixedArray* raw_storage = *storage;
18082 EnumIndexComparator<Derived> cmp(static_cast<Derived*>(*dictionary)); 18083 EnumIndexComparator<Derived> cmp(static_cast<Derived*>(*dictionary));
18083 Smi** start = reinterpret_cast<Smi**>(storage->GetFirstElementAddress()); 18084 Smi** start = reinterpret_cast<Smi**>(storage->GetFirstElementAddress());
18084 std::sort(start, start + length, cmp); 18085 std::sort(start, start + length, cmp);
18085 for (int i = 0; i < length; i++) { 18086 for (int i = 0; i < length; i++) {
(...skipping 2121 matching lines...) Expand 10 before | Expand all | Expand 10 after
20207 // depend on this. 20208 // depend on this.
20208 return DICTIONARY_ELEMENTS; 20209 return DICTIONARY_ELEMENTS;
20209 } 20210 }
20210 DCHECK_LE(kind, LAST_ELEMENTS_KIND); 20211 DCHECK_LE(kind, LAST_ELEMENTS_KIND);
20211 return kind; 20212 return kind;
20212 } 20213 }
20213 } 20214 }
20214 20215
20215 } // namespace internal 20216 } // namespace internal
20216 } // namespace v8 20217 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/for-in.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698