Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "src/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <iomanip> | 7 #include <iomanip> |
| 8 #include <sstream> | 8 #include <sstream> |
| 9 | 9 |
| 10 #include "src/accessors.h" | 10 #include "src/accessors.h" |
| (...skipping 7897 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7908 DisallowHeapAllocation no_allocation; | 7908 DisallowHeapAllocation no_allocation; |
| 7909 for (int i = 0; i < result->length(); i++) { | 7909 for (int i = 0; i < result->length(); i++) { |
| 7910 Object* current = result->get(i); | 7910 Object* current = result->get(i); |
| 7911 DCHECK(current->IsNumber() || current->IsName()); | 7911 DCHECK(current->IsNumber() || current->IsName()); |
| 7912 } | 7912 } |
| 7913 } | 7913 } |
| 7914 #endif | 7914 #endif |
| 7915 return result; | 7915 return result; |
| 7916 } | 7916 } |
| 7917 | 7917 |
| 7918 namespace { | |
| 7918 | 7919 |
| 7919 MaybeHandle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first, | 7920 inline MaybeHandle<FixedArray> LinearUnionOfKeys(Isolate* isolate, |
| 7920 Handle<FixedArray> second) { | 7921 Handle<FixedArray> first, |
| 7921 if (second->length() == 0) return first; | 7922 Handle<FixedArray> second) { |
| 7922 if (first->length() == 0) return second; | 7923 int second_length = second->length(); |
| 7923 Isolate* isolate = first->GetIsolate(); | 7924 int first_length = first->length(); |
| 7925 | |
| 7924 Handle<FixedArray> result = | 7926 Handle<FixedArray> result = |
| 7925 isolate->factory()->NewFixedArray(first->length() + second->length()); | 7927 isolate->factory()->NewFixedArray(first_length + second_length); |
| 7926 for (int i = 0; i < first->length(); i++) { | 7928 for (int i = 0; i < first_length; i++) { |
| 7927 result->set(i, first->get(i)); | 7929 result->set(i, first->get(i)); |
| 7928 } | 7930 } |
| 7929 int pos = first->length(); | 7931 int pos = first_length; |
| 7930 for (int j = 0; j < second->length(); j++) { | 7932 for (int j = 0; j < second_length; j++) { |
| 7931 Object* current = second->get(j); | 7933 Object* current = second->get(j); |
| 7932 int i; | 7934 int i; |
| 7933 for (i = 0; i < first->length(); i++) { | 7935 for (i = 0; i < first_length; i++) { |
| 7934 if (current->KeyEquals(first->get(i))) break; | 7936 if (current->KeyEquals(first->get(i))) break; |
| 7935 } | 7937 } |
| 7936 if (i == first->length()) { | 7938 if (i == first_length) { |
| 7937 result->set(pos++, current); | 7939 result->set(pos++, current); |
| 7938 } | 7940 } |
| 7939 } | 7941 } |
| 7940 | 7942 |
| 7941 result->Shrink(pos); | 7943 result->Shrink(pos); |
| 7942 return result; | 7944 return result; |
| 7943 } | 7945 } |
| 7944 | 7946 |
| 7947 inline MaybeHandle<FixedArray> SublinearUnionOfKeys(Isolate* isolate, | |
| 7948 Handle<FixedArray> first, | |
| 7949 Handle<FixedArray> second) { | |
| 7950 int second_length = second->length(); | |
| 7951 int first_length = first->length(); | |
| 7952 | |
| 7953 Handle<FixedArray> result = | |
| 7954 isolate->factory()->NewFixedArray(first_length + second_length); | |
| 7955 Handle<ObjectHashTable> cache = ObjectHashTable::New(isolate, first_length); | |
| 7956 | |
| 7957 for (int i = 0; i < first_length; i++) { | |
| 7958 Handle<Object> value(first->get(i), isolate); | |
| 7959 result->set(i, *value); | |
| 7960 ObjectHashTable::Put(isolate, cache, value, value); | |
| 7961 } | |
| 7962 int pos = first_length; | |
| 7963 for (int i = 0; i < second_length; i++) { | |
| 7964 Handle<Object> current(second->get(i), isolate); | |
| 7965 if (cache->HasKey(isolate, current)) { | |
| 7966 result->set(pos++, *current); | |
| 7967 } | |
| 7968 } | |
| 7969 | |
| 7970 result->Shrink(pos); | |
| 7971 return result; | |
| 7972 } | |
| 7973 | |
| 7974 } // namespace | |
| 7975 | |
| 7976 MaybeHandle<FixedArray> FixedArray::UnionOfKeys(Handle<FixedArray> first, | |
| 7977 Handle<FixedArray> second) { | |
| 7978 int second_length = second->length(); | |
| 7979 if (second_length == 0) return first; | |
| 7980 int first_length = first->length(); | |
| 7981 if (first_length == 0) return second; | |
| 7982 Isolate* isolate = first->GetIsolate(); | |
| 7983 if (first_length <= 2) { | |
| 7984 return LinearUnionOfKeys(isolate, first, second); | |
| 7985 } | |
| 7986 return SublinearUnionOfKeys(isolate, first, second); | |
| 7987 } | |
| 7988 | |
| 7945 | 7989 |
| 7946 void FixedArray::CopyTo(int pos, FixedArray* dest, int dest_pos, int len) { | 7990 void FixedArray::CopyTo(int pos, FixedArray* dest, int dest_pos, int len) { |
| 7947 DisallowHeapAllocation no_gc; | 7991 DisallowHeapAllocation no_gc; |
| 7948 WriteBarrierMode mode = dest->GetWriteBarrierMode(no_gc); | 7992 WriteBarrierMode mode = dest->GetWriteBarrierMode(no_gc); |
| 7949 for (int index = 0; index < len; index++) { | 7993 for (int index = 0; index < len; index++) { |
| 7950 dest->set(dest_pos+index, get(pos+index), mode); | 7994 dest->set(dest_pos+index, get(pos+index), mode); |
| 7951 } | 7995 } |
| 7952 } | 7996 } |
| 7953 | 7997 |
| 7954 | 7998 |
| (...skipping 7108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 15063 } | 15107 } |
| 15064 return Lookup(isolate, key, Smi::cast(hash)->value()); | 15108 return Lookup(isolate, key, Smi::cast(hash)->value()); |
| 15065 } | 15109 } |
| 15066 | 15110 |
| 15067 | 15111 |
| 15068 Object* ObjectHashTable::Lookup(Handle<Object> key, int32_t hash) { | 15112 Object* ObjectHashTable::Lookup(Handle<Object> key, int32_t hash) { |
| 15069 return Lookup(GetIsolate(), key, hash); | 15113 return Lookup(GetIsolate(), key, hash); |
| 15070 } | 15114 } |
| 15071 | 15115 |
| 15072 | 15116 |
| 15117 bool ObjectHashTable::HasKey(Isolate* isolate, Handle<Object> key) { | |
| 15118 DisallowHeapAllocation no_gc; | |
| 15119 DCHECK(IsKey(*key)); | |
| 15120 | |
| 15121 // If the object does not have an identity hash, it was never used as a key. | |
| 15122 Object* hash = key->GetHash(); | |
| 15123 if (hash->IsUndefined()) return false; | |
| 15124 int entry = FindEntry(isolate, key, Smi::cast(hash)->value()); | |
| 15125 return entry != kNotFound; | |
| 15126 } | |
| 15127 | |
| 15128 | |
| 15073 Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table, | 15129 Handle<ObjectHashTable> ObjectHashTable::Put(Handle<ObjectHashTable> table, |
| 15074 Handle<Object> key, | 15130 Handle<Object> key, |
| 15075 Handle<Object> value) { | 15131 Handle<Object> value) { |
| 15076 DCHECK(table->IsKey(*key)); | 15132 DCHECK(table->IsKey(*key)); |
| 15077 DCHECK(!value->IsTheHole()); | 15133 DCHECK(!value->IsTheHole()); |
| 15078 | 15134 |
| 15079 Isolate* isolate = table->GetIsolate(); | 15135 Isolate* isolate = table->GetIsolate(); |
| 15080 // Make sure the key object has an identity hash code. | 15136 // Make sure the key object has an identity hash code. |
| 15081 int32_t hash = Object::GetOrCreateHash(isolate, key)->value(); | 15137 int32_t hash = Object::GetOrCreateHash(isolate, key)->value(); |
| 15082 | 15138 |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 15101 return table; | 15157 return table; |
| 15102 } | 15158 } |
| 15103 | 15159 |
| 15104 // Check whether the hash table should be extended. | 15160 // Check whether the hash table should be extended. |
| 15105 table = EnsureCapacity(table, 1, key); | 15161 table = EnsureCapacity(table, 1, key); |
| 15106 table->AddEntry(table->FindInsertionEntry(hash), *key, *value); | 15162 table->AddEntry(table->FindInsertionEntry(hash), *key, *value); |
| 15107 return table; | 15163 return table; |
| 15108 } | 15164 } |
| 15109 | 15165 |
| 15110 | 15166 |
| 15167 Handle<ObjectHashTable> ObjectHashTable::Put(Isolate* isolate, | |
|
Camillo Bruni
2015/09/09 09:34:00
duplicated for tryout... has to be reverted
| |
| 15168 Handle<ObjectHashTable> table, | |
| 15169 Handle<Object> key, | |
| 15170 Handle<Object> value) { | |
| 15171 DCHECK(table->IsKey(*key)); | |
| 15172 DCHECK(!value->IsTheHole()); | |
| 15173 | |
| 15174 // Make sure the key object has an identity hash code. | |
| 15175 int32_t hash = Object::GetOrCreateHash(isolate, key)->value(); | |
| 15176 | |
| 15177 return Put(isolate, table, key, value, hash); | |
| 15178 } | |
| 15179 | |
| 15180 | |
| 15181 Handle<ObjectHashTable> ObjectHashTable::Put(Isolate* isolate, | |
| 15182 Handle<ObjectHashTable> table, | |
| 15183 Handle<Object> key, | |
| 15184 Handle<Object> value, | |
| 15185 int32_t hash) { | |
|
Camillo Bruni
2015/09/09 09:34:00
again, test duplication
| |
| 15186 DCHECK(table->IsKey(*key)); | |
| 15187 DCHECK(!value->IsTheHole()); | |
| 15188 | |
| 15189 int entry = table->FindEntry(isolate, key, hash); | |
| 15190 | |
| 15191 // Key is already in table, just overwrite value. | |
| 15192 if (entry != kNotFound) { | |
| 15193 table->set(EntryToIndex(entry) + 1, *value); | |
| 15194 return table; | |
| 15195 } | |
| 15196 | |
| 15197 // Check whether the hash table should be extended. | |
| 15198 table = EnsureCapacity(table, 1, key); | |
| 15199 table->AddEntry(table->FindInsertionEntry(hash), *key, *value); | |
| 15200 return table; | |
| 15201 } | |
| 15202 | |
| 15203 | |
| 15111 Handle<ObjectHashTable> ObjectHashTable::Remove(Handle<ObjectHashTable> table, | 15204 Handle<ObjectHashTable> ObjectHashTable::Remove(Handle<ObjectHashTable> table, |
| 15112 Handle<Object> key, | 15205 Handle<Object> key, |
| 15113 bool* was_present) { | 15206 bool* was_present) { |
| 15114 DCHECK(table->IsKey(*key)); | 15207 DCHECK(table->IsKey(*key)); |
| 15115 | 15208 |
| 15116 Object* hash = key->GetHash(); | 15209 Object* hash = key->GetHash(); |
| 15117 if (hash->IsUndefined()) { | 15210 if (hash->IsUndefined()) { |
| 15118 *was_present = false; | 15211 *was_present = false; |
| 15119 return table; | 15212 return table; |
| 15120 } | 15213 } |
| (...skipping 1043 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16164 if (cell->value() != *new_value) { | 16257 if (cell->value() != *new_value) { |
| 16165 cell->set_value(*new_value); | 16258 cell->set_value(*new_value); |
| 16166 Isolate* isolate = cell->GetIsolate(); | 16259 Isolate* isolate = cell->GetIsolate(); |
| 16167 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 16260 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 16168 isolate, DependentCode::kPropertyCellChangedGroup); | 16261 isolate, DependentCode::kPropertyCellChangedGroup); |
| 16169 } | 16262 } |
| 16170 } | 16263 } |
| 16171 | 16264 |
| 16172 } // namespace internal | 16265 } // namespace internal |
| 16173 } // namespace v8 | 16266 } // namespace v8 |
| OLD | NEW |