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

Side by Side Diff: src/objects.cc

Issue 947683002: Reimplement Maps and Sets in JS (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rename all the things, add more macros, and remove unnecessary %_CallFunctions Created 5 years, 9 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 <iomanip> 5 #include <iomanip>
6 #include <sstream> 6 #include <sstream>
7 7
8 #include "src/v8.h" 8 #include "src/v8.h"
9 9
10 #include "src/accessors.h" 10 #include "src/accessors.h"
(...skipping 785 matching lines...) Expand 10 before | Expand all | Expand 10 after
796 return context->symbol_function()->initial_map(); 796 return context->symbol_function()->initial_map();
797 } 797 }
798 if (heap_object->IsBoolean()) { 798 if (heap_object->IsBoolean()) {
799 return context->boolean_function()->initial_map(); 799 return context->boolean_function()->initial_map();
800 } 800 }
801 return isolate->heap()->null_value()->map(); 801 return isolate->heap()->null_value()->map();
802 } 802 }
803 803
804 804
805 Object* Object::GetHash() { 805 Object* Object::GetHash() {
806 // The object is either a number, a name, an odd-ball, 806 // The object is either a Smi, a HeapNumber, a name, an odd-ball,
807 // a real JS object, or a Harmony proxy. 807 // a real JS object, or a Harmony proxy.
808 if (IsSmi()) { 808 if (IsSmi()) {
809 int num = Smi::cast(this)->value(); 809 uint32_t hash = ComputeIntegerHash(Smi::cast(this)->value(), kZeroHashSeed);
810 uint32_t hash = ComputeLongHash(double_to_uint64(static_cast<double>(num)));
811 return Smi::FromInt(hash & Smi::kMaxValue); 810 return Smi::FromInt(hash & Smi::kMaxValue);
812 } 811 }
813 if (IsHeapNumber()) { 812 if (IsHeapNumber()) {
814 double num = HeapNumber::cast(this)->value(); 813 double num = HeapNumber::cast(this)->value();
815 if (std::isnan(num)) return Smi::FromInt(Smi::kMaxValue); 814 if (std::isnan(num)) return Smi::FromInt(Smi::kMaxValue);
816 if (i::IsMinusZero(num)) num = 0; 815 if (i::IsMinusZero(num)) num = 0;
816 if (IsSmiDouble(num)) {
817 return Smi::FromInt(FastD2I(num))->GetHash();
818 }
817 uint32_t hash = ComputeLongHash(double_to_uint64(num)); 819 uint32_t hash = ComputeLongHash(double_to_uint64(num));
818 return Smi::FromInt(hash & Smi::kMaxValue); 820 return Smi::FromInt(hash & Smi::kMaxValue);
819 } 821 }
820 if (IsName()) { 822 if (IsName()) {
821 uint32_t hash = Name::cast(this)->Hash(); 823 uint32_t hash = Name::cast(this)->Hash();
822 return Smi::FromInt(hash); 824 return Smi::FromInt(hash);
823 } 825 }
824 if (IsOddball()) { 826 if (IsOddball()) {
825 uint32_t hash = Oddball::cast(this)->to_string()->Hash(); 827 uint32_t hash = Oddball::cast(this)->to_string()->Hash();
826 return Smi::FromInt(hash); 828 return Smi::FromInt(hash);
(...skipping 15378 matching lines...) Expand 10 before | Expand all | Expand 10 after
16205 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); 16207 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED);
16206 16208
16207 table->SetNextTable(*new_table); 16209 table->SetNextTable(*new_table);
16208 table->SetNumberOfDeletedElements(kClearedTableSentinel); 16210 table->SetNumberOfDeletedElements(kClearedTableSentinel);
16209 16211
16210 return new_table; 16212 return new_table;
16211 } 16213 }
16212 16214
16213 16215
16214 template<class Derived, class Iterator, int entrysize> 16216 template<class Derived, class Iterator, int entrysize>
16215 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Remove(
16216 Handle<Derived> table, Handle<Object> key, bool* was_present) {
16217 int entry = table->FindEntry(key);
16218 if (entry == kNotFound) {
16219 *was_present = false;
16220 return table;
16221 }
16222 *was_present = true;
16223 table->RemoveEntry(entry);
16224 return Shrink(table);
16225 }
16226
16227
16228 template<class Derived, class Iterator, int entrysize>
16229 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( 16217 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash(
16230 Handle<Derived> table, int new_capacity) { 16218 Handle<Derived> table, int new_capacity) {
16231 DCHECK(!table->IsObsolete()); 16219 DCHECK(!table->IsObsolete());
16232 16220
16233 Handle<Derived> new_table = 16221 Handle<Derived> new_table =
16234 Allocate(table->GetIsolate(), 16222 Allocate(table->GetIsolate(),
16235 new_capacity, 16223 new_capacity,
16236 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); 16224 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED);
16237 int nof = table->NumberOfElements(); 16225 int nof = table->NumberOfElements();
16238 int nod = table->NumberOfDeletedElements(); 16226 int nod = table->NumberOfDeletedElements();
(...skipping 24 matching lines...) Expand all
16263 16251
16264 DCHECK_EQ(nod, removed_holes_index); 16252 DCHECK_EQ(nod, removed_holes_index);
16265 16253
16266 new_table->SetNumberOfElements(nof); 16254 new_table->SetNumberOfElements(nof);
16267 table->SetNextTable(*new_table); 16255 table->SetNextTable(*new_table);
16268 16256
16269 return new_table; 16257 return new_table;
16270 } 16258 }
16271 16259
16272 16260
16273 template <class Derived, class Iterator, int entrysize>
16274 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry(
16275 Handle<Object> key, int hash) {
16276 DCHECK(!IsObsolete());
16277
16278 DisallowHeapAllocation no_gc;
16279 DCHECK(!key->IsTheHole());
16280 for (int entry = HashToEntry(hash); entry != kNotFound;
16281 entry = ChainAt(entry)) {
16282 Object* candidate = KeyAt(entry);
16283 if (candidate->SameValueZero(*key))
16284 return entry;
16285 }
16286 return kNotFound;
16287 }
16288
16289
16290 template <class Derived, class Iterator, int entrysize>
16291 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry(
16292 Handle<Object> key) {
16293 DisallowHeapAllocation no_gc;
16294 Object* hash = key->GetHash();
16295 if (!hash->IsSmi()) return kNotFound;
16296 return FindEntry(key, Smi::cast(hash)->value());
16297 }
16298
16299
16300 template <class Derived, class Iterator, int entrysize>
16301 int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) {
16302 DCHECK(!IsObsolete());
16303
16304 int entry = UsedCapacity();
16305 int bucket = HashToBucket(hash);
16306 int index = EntryToIndex(entry);
16307 Object* chain_entry = get(kHashTableStartIndex + bucket);
16308 set(kHashTableStartIndex + bucket, Smi::FromInt(entry));
16309 set(index + kChainOffset, chain_entry);
16310 SetNumberOfElements(NumberOfElements() + 1);
16311 return index;
16312 }
16313
16314
16315 template<class Derived, class Iterator, int entrysize>
16316 void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) {
16317 DCHECK(!IsObsolete());
16318
16319 int index = EntryToIndex(entry);
16320 for (int i = 0; i < entrysize; ++i) {
16321 set_the_hole(index + i);
16322 }
16323 SetNumberOfElements(NumberOfElements() - 1);
16324 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1);
16325 }
16326
16327
16328 template Handle<OrderedHashSet> 16261 template Handle<OrderedHashSet>
16329 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate( 16262 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate(
16330 Isolate* isolate, int capacity, PretenureFlag pretenure); 16263 Isolate* isolate, int capacity, PretenureFlag pretenure);
16331 16264
16332 template Handle<OrderedHashSet> 16265 template Handle<OrderedHashSet>
16333 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable( 16266 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable(
16334 Handle<OrderedHashSet> table); 16267 Handle<OrderedHashSet> table);
16335 16268
16336 template Handle<OrderedHashSet> 16269 template Handle<OrderedHashSet>
16337 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink( 16270 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink(
16338 Handle<OrderedHashSet> table); 16271 Handle<OrderedHashSet> table);
16339 16272
16340 template Handle<OrderedHashSet> 16273 template Handle<OrderedHashSet>
16341 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear( 16274 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear(
16342 Handle<OrderedHashSet> table); 16275 Handle<OrderedHashSet> table);
16343 16276
16344 template Handle<OrderedHashSet>
16345 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Remove(
16346 Handle<OrderedHashSet> table, Handle<Object> key, bool* was_present);
16347
16348 template int OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry(
16349 Handle<Object> key, int hash);
16350 template int OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry(
16351 Handle<Object> key);
16352
16353 template int
16354 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::AddEntry(int hash);
16355
16356 template void
16357 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::RemoveEntry(int entry);
16358
16359 16277
16360 template Handle<OrderedHashMap> 16278 template Handle<OrderedHashMap>
16361 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate( 16279 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate(
16362 Isolate* isolate, int capacity, PretenureFlag pretenure); 16280 Isolate* isolate, int capacity, PretenureFlag pretenure);
16363 16281
16364 template Handle<OrderedHashMap> 16282 template Handle<OrderedHashMap>
16365 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable( 16283 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable(
16366 Handle<OrderedHashMap> table); 16284 Handle<OrderedHashMap> table);
16367 16285
16368 template Handle<OrderedHashMap> 16286 template Handle<OrderedHashMap>
16369 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink( 16287 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink(
16370 Handle<OrderedHashMap> table); 16288 Handle<OrderedHashMap> table);
16371 16289
16372 template Handle<OrderedHashMap> 16290 template Handle<OrderedHashMap>
16373 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear( 16291 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear(
16374 Handle<OrderedHashMap> table); 16292 Handle<OrderedHashMap> table);
16375 16293
16376 template Handle<OrderedHashMap>
16377 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Remove(
16378 Handle<OrderedHashMap> table, Handle<Object> key, bool* was_present);
16379
16380 template int OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry(
16381 Handle<Object> key, int hash);
16382 template int OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry(
16383 Handle<Object> key);
16384
16385 template int
16386 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::AddEntry(int hash);
16387
16388 template void
16389 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::RemoveEntry(int entry);
16390
16391
16392 bool OrderedHashSet::Contains(Handle<Object> key) {
16393 return FindEntry(key) != kNotFound;
16394 }
16395
16396
16397 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table,
16398 Handle<Object> key) {
16399 int hash = GetOrCreateHash(table->GetIsolate(), key)->value();
16400 if (table->FindEntry(key, hash) != kNotFound) return table;
16401
16402 table = EnsureGrowable(table);
16403
16404 int index = table->AddEntry(hash);
16405 table->set(index, *key);
16406 return table;
16407 }
16408
16409
16410 Object* OrderedHashMap::Lookup(Handle<Object> key) {
16411 DisallowHeapAllocation no_gc;
16412 int entry = FindEntry(key);
16413 if (entry == kNotFound) return GetHeap()->the_hole_value();
16414 return ValueAt(entry);
16415 }
16416
16417
16418 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table,
16419 Handle<Object> key,
16420 Handle<Object> value) {
16421 DCHECK(!key->IsTheHole());
16422
16423 int hash = GetOrCreateHash(table->GetIsolate(), key)->value();
16424 int entry = table->FindEntry(key, hash);
16425
16426 if (entry != kNotFound) {
16427 table->set(table->EntryToIndex(entry) + kValueOffset, *value);
16428 return table;
16429 }
16430
16431 table = EnsureGrowable(table);
16432
16433 int index = table->AddEntry(hash);
16434 table->set(index, *key);
16435 table->set(index + kValueOffset, *value);
16436 return table;
16437 }
16438
16439 16294
16440 template<class Derived, class TableType> 16295 template<class Derived, class TableType>
16441 void OrderedHashTableIterator<Derived, TableType>::Transition() { 16296 void OrderedHashTableIterator<Derived, TableType>::Transition() {
16442 DisallowHeapAllocation no_allocation; 16297 DisallowHeapAllocation no_allocation;
16443 TableType* table = TableType::cast(this->table()); 16298 TableType* table = TableType::cast(this->table());
16444 if (!table->IsObsolete()) return; 16299 if (!table->IsObsolete()) return;
16445 16300
16446 int index = Smi::cast(this->index())->value(); 16301 int index = Smi::cast(this->index())->value();
16447 while (table->IsObsolete()) { 16302 while (table->IsObsolete()) {
16448 TableType* next_table = table->NextTable(); 16303 TableType* next_table = table->NextTable();
(...skipping 631 matching lines...) Expand 10 before | Expand all | Expand 10 after
17080 CompilationInfo* info) { 16935 CompilationInfo* info) {
17081 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( 16936 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo(
17082 handle(cell->dependent_code(), info->isolate()), 16937 handle(cell->dependent_code(), info->isolate()),
17083 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); 16938 DependentCode::kPropertyCellChangedGroup, info->object_wrapper());
17084 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); 16939 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes);
17085 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( 16940 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add(
17086 cell, info->zone()); 16941 cell, info->zone());
17087 } 16942 }
17088 16943
17089 } } // namespace v8::internal 16944 } } // namespace v8::internal
OLDNEW
« src/hydrogen.cc ('K') | « src/objects.h ('k') | src/ppc/code-stubs-ppc.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698