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

Side by Side Diff: src/objects.cc

Issue 1768553002: [runtime] Clean up symbol access in identity hash code (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 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
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('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 <sstream> 9 #include <sstream>
10 10
(...skipping 1383 matching lines...) Expand 10 before | Expand all | Expand 10 after
1394 return constructor_function->initial_map(); 1394 return constructor_function->initial_map();
1395 } 1395 }
1396 return isolate->heap()->null_value()->map(); 1396 return isolate->heap()->null_value()->map();
1397 } 1397 }
1398 1398
1399 1399
1400 Object* Object::GetHash() { 1400 Object* Object::GetHash() {
1401 Object* hash = GetSimpleHash(); 1401 Object* hash = GetSimpleHash();
1402 if (hash->IsSmi()) return hash; 1402 if (hash->IsSmi()) return hash;
1403 1403
1404 DisallowHeapAllocation no_gc;
1404 DCHECK(IsJSReceiver()); 1405 DCHECK(IsJSReceiver());
1405 return JSReceiver::cast(this)->GetIdentityHash(); 1406 JSReceiver* receiver = JSReceiver::cast(this);
1407 Isolate* isolate = receiver->GetIsolate();
1408 return *JSReceiver::GetIdentityHash(isolate, handle(receiver, isolate));
1406 } 1409 }
1407 1410
1408 1411
1409 Object* Object::GetSimpleHash() { 1412 Object* Object::GetSimpleHash() {
1410 // The object is either a Smi, a HeapNumber, a name, an odd-ball, 1413 // The object is either a Smi, a HeapNumber, a name, an odd-ball,
1411 // a SIMD value type, a real JS object, or a Harmony proxy. 1414 // a SIMD value type, a real JS object, or a Harmony proxy.
1412 if (IsSmi()) { 1415 if (IsSmi()) {
1413 uint32_t hash = ComputeIntegerHash(Smi::cast(this)->value(), kZeroHashSeed); 1416 uint32_t hash = ComputeIntegerHash(Smi::cast(this)->value(), kZeroHashSeed);
1414 return Smi::FromInt(hash & Smi::kMaxValue); 1417 return Smi::FromInt(hash & Smi::kMaxValue);
1415 } 1418 }
(...skipping 4432 matching lines...) Expand 10 before | Expand all | Expand 10 after
5848 } while (hash_value == 0 && attempts < 30); 5851 } while (hash_value == 0 && attempts < 30);
5849 hash_value = hash_value != 0 ? hash_value : 1; // never return 0 5852 hash_value = hash_value != 0 ? hash_value : 1; // never return 0
5850 5853
5851 return Smi::FromInt(hash_value); 5854 return Smi::FromInt(hash_value);
5852 } 5855 }
5853 5856
5854 5857
5855 void JSObject::SetIdentityHash(Handle<JSObject> object, Handle<Smi> hash) { 5858 void JSObject::SetIdentityHash(Handle<JSObject> object, Handle<Smi> hash) {
5856 DCHECK(!object->IsJSGlobalProxy()); 5859 DCHECK(!object->IsJSGlobalProxy());
5857 Isolate* isolate = object->GetIsolate(); 5860 Isolate* isolate = object->GetIsolate();
5858 Handle<Name> hash_code_symbol(isolate->heap()->hash_code_symbol()); 5861 Handle<Name> hash_code_symbol = isolate->factory()->hash_code_symbol();
5859 JSObject::AddProperty(object, hash_code_symbol, hash, NONE); 5862 JSObject::AddProperty(object, hash_code_symbol, hash, NONE);
5860 } 5863 }
5861 5864
5862 5865
5863 template<typename ProxyType> 5866 template<typename ProxyType>
5864 static Handle<Smi> GetOrCreateIdentityHashHelper(Handle<ProxyType> proxy) { 5867 static Handle<Smi> GetOrCreateIdentityHashHelper(Handle<ProxyType> proxy) {
5865 Isolate* isolate = proxy->GetIsolate(); 5868 Isolate* isolate = proxy->GetIsolate();
5866 5869
5867 Handle<Object> maybe_hash(proxy->hash(), isolate); 5870 Handle<Object> maybe_hash(proxy->hash(), isolate);
5868 if (maybe_hash->IsSmi()) return Handle<Smi>::cast(maybe_hash); 5871 if (maybe_hash->IsSmi()) return Handle<Smi>::cast(maybe_hash);
5869 5872
5870 Handle<Smi> hash(GenerateIdentityHash(isolate), isolate); 5873 Handle<Smi> hash(GenerateIdentityHash(isolate), isolate);
5871 proxy->set_hash(*hash); 5874 proxy->set_hash(*hash);
5872 return hash; 5875 return hash;
5873 } 5876 }
5874 5877
5875 5878 // static
5876 Object* JSObject::GetIdentityHash() { 5879 Handle<Object> JSObject::GetIdentityHash(Isolate* isolate,
5877 DisallowHeapAllocation no_gc; 5880 Handle<JSObject> object) {
5878 Isolate* isolate = GetIsolate(); 5881 if (object->IsJSGlobalProxy()) {
5879 if (IsJSGlobalProxy()) { 5882 return handle(JSGlobalProxy::cast(*object)->hash(), isolate);
5880 return JSGlobalProxy::cast(this)->hash();
5881 } 5883 }
5882 Handle<Name> hash_code_symbol(isolate->heap()->hash_code_symbol()); 5884 Handle<Name> hash_code_symbol = isolate->factory()->hash_code_symbol();
5883 Handle<Object> stored_value = 5885 return JSReceiver::GetDataProperty(object, hash_code_symbol);
5884 Object::GetPropertyOrElement(Handle<Object>(this, isolate),
5885 hash_code_symbol).ToHandleChecked();
5886 return stored_value->IsSmi() ? *stored_value
5887 : isolate->heap()->undefined_value();
5888 } 5886 }
5889 5887
5890 5888 // static
5891 Handle<Smi> JSObject::GetOrCreateIdentityHash(Handle<JSObject> object) { 5889 Handle<Smi> JSObject::GetOrCreateIdentityHash(Handle<JSObject> object) {
5892 if (object->IsJSGlobalProxy()) { 5890 if (object->IsJSGlobalProxy()) {
5893 return GetOrCreateIdentityHashHelper(Handle<JSGlobalProxy>::cast(object)); 5891 return GetOrCreateIdentityHashHelper(Handle<JSGlobalProxy>::cast(object));
5894 } 5892 }
5895 Isolate* isolate = object->GetIsolate(); 5893 Isolate* isolate = object->GetIsolate();
5896 5894
5897 Handle<Object> maybe_hash(object->GetIdentityHash(), isolate); 5895 Handle<Object> maybe_hash = JSObject::GetIdentityHash(isolate, object);
5898 if (maybe_hash->IsSmi()) return Handle<Smi>::cast(maybe_hash); 5896 if (maybe_hash->IsSmi()) return Handle<Smi>::cast(maybe_hash);
5899 5897
5900 Handle<Smi> hash(GenerateIdentityHash(isolate), isolate); 5898 Handle<Smi> hash(GenerateIdentityHash(isolate), isolate);
5901 Handle<Name> hash_code_symbol(isolate->heap()->hash_code_symbol()); 5899 SetIdentityHash(object, hash);
5902 JSObject::AddProperty(object, hash_code_symbol, hash, NONE);
5903 return hash; 5900 return hash;
5904 } 5901 }
5905 5902
5906 5903 // static
5907 Object* JSProxy::GetIdentityHash() { 5904 Handle<Object> JSProxy::GetIdentityHash(Isolate* isolate,
5908 return this->hash(); 5905 Handle<JSProxy> proxy) {
5906 return handle(proxy->hash(), isolate);
5909 } 5907 }
5910 5908
5911 5909
5912 Handle<Smi> JSProxy::GetOrCreateIdentityHash(Handle<JSProxy> proxy) { 5910 Handle<Smi> JSProxy::GetOrCreateIdentityHash(Handle<JSProxy> proxy) {
5913 return GetOrCreateIdentityHashHelper(proxy); 5911 return GetOrCreateIdentityHashHelper(proxy);
5914 } 5912 }
5915 5913
5916 5914
5917 Object* JSObject::GetHiddenProperty(Handle<Name> key) { 5915 Object* JSObject::GetHiddenProperty(Handle<Name> key) {
5918 DisallowHeapAllocation no_gc; 5916 DisallowHeapAllocation no_gc;
(...skipping 13848 matching lines...) Expand 10 before | Expand all | Expand 10 after
19767 if (cell->value() != *new_value) { 19765 if (cell->value() != *new_value) {
19768 cell->set_value(*new_value); 19766 cell->set_value(*new_value);
19769 Isolate* isolate = cell->GetIsolate(); 19767 Isolate* isolate = cell->GetIsolate();
19770 cell->dependent_code()->DeoptimizeDependentCodeGroup( 19768 cell->dependent_code()->DeoptimizeDependentCodeGroup(
19771 isolate, DependentCode::kPropertyCellChangedGroup); 19769 isolate, DependentCode::kPropertyCellChangedGroup);
19772 } 19770 }
19773 } 19771 }
19774 19772
19775 } // namespace internal 19773 } // namespace internal
19776 } // namespace v8 19774 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698