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

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: Disable one more test Created 5 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
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 <sstream> 5 #include <sstream>
6 6
7 #include "src/v8.h" 7 #include "src/v8.h"
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/allocation-site-scopes.h" 10 #include "src/allocation-site-scopes.h"
(...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after
789 return context->symbol_function()->initial_map(); 789 return context->symbol_function()->initial_map();
790 } 790 }
791 if (heap_object->IsBoolean()) { 791 if (heap_object->IsBoolean()) {
792 return context->boolean_function()->initial_map(); 792 return context->boolean_function()->initial_map();
793 } 793 }
794 return isolate->heap()->null_value()->map(); 794 return isolate->heap()->null_value()->map();
795 } 795 }
796 796
797 797
798 Object* Object::GetHash() { 798 Object* Object::GetHash() {
799 // The object is either a number, a name, an odd-ball, 799 // The object is either a Smi, a HeapNumber, a name, an odd-ball,
800 // a real JS object, or a Harmony proxy. 800 // a real JS object, or a Harmony proxy.
801 if (IsSmi()) { 801 if (IsSmi()) {
802 int num = Smi::cast(this)->value(); 802 uint32_t hash = ComputeIntegerHash(Smi::cast(this)->value(), kZeroHashSeed);
803 uint32_t hash = ComputeLongHash(double_to_uint64(static_cast<double>(num)));
804 return Smi::FromInt(hash & Smi::kMaxValue); 803 return Smi::FromInt(hash & Smi::kMaxValue);
805 } 804 }
806 if (IsHeapNumber()) { 805 if (IsHeapNumber()) {
807 double num = HeapNumber::cast(this)->value(); 806 double num = HeapNumber::cast(this)->value();
808 if (std::isnan(num)) return Smi::FromInt(Smi::kMaxValue); 807 if (std::isnan(num)) return Smi::FromInt(Smi::kMaxValue);
809 if (i::IsMinusZero(num)) num = 0; 808 if (i::IsMinusZero(num)) num = 0;
809 if (IsSmiDouble(num)) {
810 return Smi::FromInt(FastD2I(num))->GetHash();
arv (Not doing code reviews) 2015/02/21 16:20:16 Why not call ComputeIntegerHash here directly so w
adamk 2015/02/23 18:43:35 Laziness, happy to clean this up.
811 }
810 uint32_t hash = ComputeLongHash(double_to_uint64(num)); 812 uint32_t hash = ComputeLongHash(double_to_uint64(num));
811 return Smi::FromInt(hash & Smi::kMaxValue); 813 return Smi::FromInt(hash & Smi::kMaxValue);
812 } 814 }
813 if (IsName()) { 815 if (IsName()) {
814 uint32_t hash = Name::cast(this)->Hash(); 816 uint32_t hash = Name::cast(this)->Hash();
815 return Smi::FromInt(hash); 817 return Smi::FromInt(hash);
816 } 818 }
817 if (IsOddball()) { 819 if (IsOddball()) {
818 uint32_t hash = Oddball::cast(this)->to_string()->Hash(); 820 uint32_t hash = Oddball::cast(this)->to_string()->Hash();
819 return Smi::FromInt(hash); 821 return Smi::FromInt(hash);
(...skipping 15658 matching lines...) Expand 10 before | Expand all | Expand 10 after
16478 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); 16480 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED);
16479 16481
16480 table->SetNextTable(*new_table); 16482 table->SetNextTable(*new_table);
16481 table->SetNumberOfDeletedElements(kClearedTableSentinel); 16483 table->SetNumberOfDeletedElements(kClearedTableSentinel);
16482 16484
16483 return new_table; 16485 return new_table;
16484 } 16486 }
16485 16487
16486 16488
16487 template<class Derived, class Iterator, int entrysize> 16489 template<class Derived, class Iterator, int entrysize>
16488 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Remove(
16489 Handle<Derived> table, Handle<Object> key, bool* was_present) {
16490 int entry = table->FindEntry(key);
16491 if (entry == kNotFound) {
16492 *was_present = false;
16493 return table;
16494 }
16495 *was_present = true;
16496 table->RemoveEntry(entry);
16497 return Shrink(table);
16498 }
16499
16500
16501 template<class Derived, class Iterator, int entrysize>
16502 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash( 16490 Handle<Derived> OrderedHashTable<Derived, Iterator, entrysize>::Rehash(
16503 Handle<Derived> table, int new_capacity) { 16491 Handle<Derived> table, int new_capacity) {
16504 DCHECK(!table->IsObsolete()); 16492 DCHECK(!table->IsObsolete());
16505 16493
16506 Handle<Derived> new_table = 16494 Handle<Derived> new_table =
16507 Allocate(table->GetIsolate(), 16495 Allocate(table->GetIsolate(),
16508 new_capacity, 16496 new_capacity,
16509 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED); 16497 table->GetHeap()->InNewSpace(*table) ? NOT_TENURED : TENURED);
16510 int nof = table->NumberOfElements(); 16498 int nof = table->NumberOfElements();
16511 int nod = table->NumberOfDeletedElements(); 16499 int nod = table->NumberOfDeletedElements();
(...skipping 24 matching lines...) Expand all
16536 16524
16537 DCHECK_EQ(nod, removed_holes_index); 16525 DCHECK_EQ(nod, removed_holes_index);
16538 16526
16539 new_table->SetNumberOfElements(nof); 16527 new_table->SetNumberOfElements(nof);
16540 table->SetNextTable(*new_table); 16528 table->SetNextTable(*new_table);
16541 16529
16542 return new_table; 16530 return new_table;
16543 } 16531 }
16544 16532
16545 16533
16546 template <class Derived, class Iterator, int entrysize>
16547 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry(
16548 Handle<Object> key, int hash) {
16549 DCHECK(!IsObsolete());
16550
16551 DisallowHeapAllocation no_gc;
16552 DCHECK(!key->IsTheHole());
16553 for (int entry = HashToEntry(hash); entry != kNotFound;
16554 entry = ChainAt(entry)) {
16555 Object* candidate = KeyAt(entry);
16556 if (candidate->SameValueZero(*key))
16557 return entry;
16558 }
16559 return kNotFound;
16560 }
16561
16562
16563 template <class Derived, class Iterator, int entrysize>
16564 int OrderedHashTable<Derived, Iterator, entrysize>::FindEntry(
16565 Handle<Object> key) {
16566 DisallowHeapAllocation no_gc;
16567 Object* hash = key->GetHash();
16568 if (!hash->IsSmi()) return kNotFound;
16569 return FindEntry(key, Smi::cast(hash)->value());
16570 }
16571
16572
16573 template <class Derived, class Iterator, int entrysize>
16574 int OrderedHashTable<Derived, Iterator, entrysize>::AddEntry(int hash) {
16575 DCHECK(!IsObsolete());
16576
16577 int entry = UsedCapacity();
16578 int bucket = HashToBucket(hash);
16579 int index = EntryToIndex(entry);
16580 Object* chain_entry = get(kHashTableStartIndex + bucket);
16581 set(kHashTableStartIndex + bucket, Smi::FromInt(entry));
16582 set(index + kChainOffset, chain_entry);
16583 SetNumberOfElements(NumberOfElements() + 1);
16584 return index;
16585 }
16586
16587
16588 template<class Derived, class Iterator, int entrysize>
16589 void OrderedHashTable<Derived, Iterator, entrysize>::RemoveEntry(int entry) {
16590 DCHECK(!IsObsolete());
16591
16592 int index = EntryToIndex(entry);
16593 for (int i = 0; i < entrysize; ++i) {
16594 set_the_hole(index + i);
16595 }
16596 SetNumberOfElements(NumberOfElements() - 1);
16597 SetNumberOfDeletedElements(NumberOfDeletedElements() + 1);
16598 }
16599
16600
16601 template Handle<OrderedHashSet> 16534 template Handle<OrderedHashSet>
16602 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate( 16535 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Allocate(
16603 Isolate* isolate, int capacity, PretenureFlag pretenure); 16536 Isolate* isolate, int capacity, PretenureFlag pretenure);
16604 16537
16605 template Handle<OrderedHashSet> 16538 template Handle<OrderedHashSet>
16606 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable( 16539 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::EnsureGrowable(
16607 Handle<OrderedHashSet> table); 16540 Handle<OrderedHashSet> table);
16608 16541
16609 template Handle<OrderedHashSet> 16542 template Handle<OrderedHashSet>
16610 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink( 16543 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Shrink(
16611 Handle<OrderedHashSet> table); 16544 Handle<OrderedHashSet> table);
16612 16545
16613 template Handle<OrderedHashSet> 16546 template Handle<OrderedHashSet>
16614 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear( 16547 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Clear(
16615 Handle<OrderedHashSet> table); 16548 Handle<OrderedHashSet> table);
16616 16549
16617 template Handle<OrderedHashSet>
16618 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::Remove(
16619 Handle<OrderedHashSet> table, Handle<Object> key, bool* was_present);
16620
16621 template int OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry(
16622 Handle<Object> key, int hash);
16623 template int OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::FindEntry(
16624 Handle<Object> key);
16625
16626 template int
16627 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::AddEntry(int hash);
16628
16629 template void
16630 OrderedHashTable<OrderedHashSet, JSSetIterator, 1>::RemoveEntry(int entry);
16631
16632 16550
16633 template Handle<OrderedHashMap> 16551 template Handle<OrderedHashMap>
16634 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate( 16552 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Allocate(
16635 Isolate* isolate, int capacity, PretenureFlag pretenure); 16553 Isolate* isolate, int capacity, PretenureFlag pretenure);
16636 16554
16637 template Handle<OrderedHashMap> 16555 template Handle<OrderedHashMap>
16638 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable( 16556 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::EnsureGrowable(
16639 Handle<OrderedHashMap> table); 16557 Handle<OrderedHashMap> table);
16640 16558
16641 template Handle<OrderedHashMap> 16559 template Handle<OrderedHashMap>
16642 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink( 16560 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Shrink(
16643 Handle<OrderedHashMap> table); 16561 Handle<OrderedHashMap> table);
16644 16562
16645 template Handle<OrderedHashMap> 16563 template Handle<OrderedHashMap>
16646 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear( 16564 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Clear(
16647 Handle<OrderedHashMap> table); 16565 Handle<OrderedHashMap> table);
16648 16566
16649 template Handle<OrderedHashMap>
16650 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::Remove(
16651 Handle<OrderedHashMap> table, Handle<Object> key, bool* was_present);
16652
16653 template int OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry(
16654 Handle<Object> key, int hash);
16655 template int OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::FindEntry(
16656 Handle<Object> key);
16657
16658 template int
16659 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::AddEntry(int hash);
16660
16661 template void
16662 OrderedHashTable<OrderedHashMap, JSMapIterator, 2>::RemoveEntry(int entry);
16663
16664
16665 bool OrderedHashSet::Contains(Handle<Object> key) {
16666 return FindEntry(key) != kNotFound;
16667 }
16668
16669
16670 Handle<OrderedHashSet> OrderedHashSet::Add(Handle<OrderedHashSet> table,
16671 Handle<Object> key) {
16672 int hash = GetOrCreateHash(table->GetIsolate(), key)->value();
16673 if (table->FindEntry(key, hash) != kNotFound) return table;
16674
16675 table = EnsureGrowable(table);
16676
16677 int index = table->AddEntry(hash);
16678 table->set(index, *key);
16679 return table;
16680 }
16681
16682
16683 Object* OrderedHashMap::Lookup(Handle<Object> key) {
16684 DisallowHeapAllocation no_gc;
16685 int entry = FindEntry(key);
16686 if (entry == kNotFound) return GetHeap()->the_hole_value();
16687 return ValueAt(entry);
16688 }
16689
16690
16691 Handle<OrderedHashMap> OrderedHashMap::Put(Handle<OrderedHashMap> table,
16692 Handle<Object> key,
16693 Handle<Object> value) {
16694 DCHECK(!key->IsTheHole());
16695
16696 int hash = GetOrCreateHash(table->GetIsolate(), key)->value();
16697 int entry = table->FindEntry(key, hash);
16698
16699 if (entry != kNotFound) {
16700 table->set(table->EntryToIndex(entry) + kValueOffset, *value);
16701 return table;
16702 }
16703
16704 table = EnsureGrowable(table);
16705
16706 int index = table->AddEntry(hash);
16707 table->set(index, *key);
16708 table->set(index + kValueOffset, *value);
16709 return table;
16710 }
16711
16712 16567
16713 template<class Derived, class TableType> 16568 template<class Derived, class TableType>
16714 void OrderedHashTableIterator<Derived, TableType>::Transition() { 16569 void OrderedHashTableIterator<Derived, TableType>::Transition() {
16715 DisallowHeapAllocation no_allocation; 16570 DisallowHeapAllocation no_allocation;
16716 TableType* table = TableType::cast(this->table()); 16571 TableType* table = TableType::cast(this->table());
16717 if (!table->IsObsolete()) return; 16572 if (!table->IsObsolete()) return;
16718 16573
16719 int index = Smi::cast(this->index())->value(); 16574 int index = Smi::cast(this->index())->value();
16720 while (table->IsObsolete()) { 16575 while (table->IsObsolete()) {
16721 TableType* next_table = table->NextTable(); 16576 TableType* next_table = table->NextTable();
(...skipping 622 matching lines...) Expand 10 before | Expand all | Expand 10 after
17344 CompilationInfo* info) { 17199 CompilationInfo* info) {
17345 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo( 17200 Handle<DependentCode> codes = DependentCode::InsertCompilationInfo(
17346 handle(cell->dependent_code(), info->isolate()), 17201 handle(cell->dependent_code(), info->isolate()),
17347 DependentCode::kPropertyCellChangedGroup, info->object_wrapper()); 17202 DependentCode::kPropertyCellChangedGroup, info->object_wrapper());
17348 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); 17203 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes);
17349 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( 17204 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add(
17350 cell, info->zone()); 17205 cell, info->zone());
17351 } 17206 }
17352 17207
17353 } } // namespace v8::internal 17208 } } // namespace v8::internal
OLDNEW
« src/hydrogen.cc ('K') | « src/objects.h ('k') | src/runtime.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698