| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index 6089558f78177ffb080cd41e98ec255c0a3a6f1c..d25569708180f31070aefb987799154667a0f1c8 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -5068,9 +5068,7 @@ Handle<SeededNumberDictionary> JSObject::NormalizeElements(
|
| }
|
|
|
|
|
| -Smi* JSReceiver::GenerateIdentityHash() {
|
| - Isolate* isolate = GetIsolate();
|
| -
|
| +static Smi* GenerateIdentityHash(Isolate* isolate) {
|
| int hash_value;
|
| int attempts = 0;
|
| do {
|
| @@ -5086,14 +5084,31 @@ Smi* JSReceiver::GenerateIdentityHash() {
|
|
|
|
|
| void JSObject::SetIdentityHash(Handle<JSObject> object, Handle<Smi> hash) {
|
| + ASSERT(!object->IsJSGlobalProxy());
|
| Isolate* isolate = object->GetIsolate();
|
| SetHiddenProperty(object, isolate->factory()->identity_hash_string(), hash);
|
| }
|
|
|
|
|
| +template<typename ProxyType>
|
| +static Handle<Object> GetOrCreateIdentityHashHelper(Handle<ProxyType> proxy) {
|
| + Isolate* isolate = proxy->GetIsolate();
|
| +
|
| + Handle<Object> hash(proxy->hash(), isolate);
|
| + if (hash->IsSmi()) return hash;
|
| +
|
| + hash = handle(GenerateIdentityHash(isolate), isolate);
|
| + proxy->set_hash(*hash);
|
| + return hash;
|
| +}
|
| +
|
| +
|
| Object* JSObject::GetIdentityHash() {
|
| DisallowHeapAllocation no_gc;
|
| Isolate* isolate = GetIsolate();
|
| + if (IsJSGlobalProxy()) {
|
| + return JSGlobalProxy::cast(this)->hash();
|
| + }
|
| Object* stored_value =
|
| GetHiddenProperty(isolate->factory()->identity_hash_string());
|
| return stored_value->IsSmi()
|
| @@ -5103,21 +5118,17 @@ Object* JSObject::GetIdentityHash() {
|
|
|
|
|
| Handle<Object> JSObject::GetOrCreateIdentityHash(Handle<JSObject> object) {
|
| - Handle<Object> hash(object->GetIdentityHash(), object->GetIsolate());
|
| - if (hash->IsSmi())
|
| - return hash;
|
| + if (object->IsJSGlobalProxy()) {
|
| + return GetOrCreateIdentityHashHelper(Handle<JSGlobalProxy>::cast(object));
|
| + }
|
|
|
| Isolate* isolate = object->GetIsolate();
|
|
|
| - hash = handle(object->GenerateIdentityHash(), isolate);
|
| - Handle<Object> result = SetHiddenProperty(object,
|
| - isolate->factory()->identity_hash_string(), hash);
|
| -
|
| - if (result->IsUndefined()) {
|
| - // Trying to get hash of detached proxy.
|
| - return handle(Smi::FromInt(0), isolate);
|
| - }
|
| + Handle<Object> hash(object->GetIdentityHash(), isolate);
|
| + if (hash->IsSmi()) return hash;
|
|
|
| + hash = handle(GenerateIdentityHash(isolate), isolate);
|
| + SetHiddenProperty(object, isolate->factory()->identity_hash_string(), hash);
|
| return hash;
|
| }
|
|
|
| @@ -5128,15 +5139,7 @@ Object* JSProxy::GetIdentityHash() {
|
|
|
|
|
| Handle<Object> JSProxy::GetOrCreateIdentityHash(Handle<JSProxy> proxy) {
|
| - Isolate* isolate = proxy->GetIsolate();
|
| -
|
| - Handle<Object> hash(proxy->GetIdentityHash(), isolate);
|
| - if (hash->IsSmi())
|
| - return hash;
|
| -
|
| - hash = handle(proxy->GenerateIdentityHash(), isolate);
|
| - proxy->set_hash(*hash);
|
| - return hash;
|
| + return GetOrCreateIdentityHashHelper(proxy);
|
| }
|
|
|
|
|
| @@ -5144,6 +5147,8 @@ Object* JSObject::GetHiddenProperty(Handle<Name> key) {
|
| DisallowHeapAllocation no_gc;
|
| ASSERT(key->IsUniqueName());
|
| if (IsJSGlobalProxy()) {
|
| + // JSGlobalProxies store their hash internally.
|
| + ASSERT(*key != GetHeap()->identity_hash_string());
|
| // For a proxy, use the prototype as target object.
|
| Object* proxy_parent = GetPrototype();
|
| // If the proxy is detached, return undefined.
|
| @@ -5178,6 +5183,8 @@ Handle<Object> JSObject::SetHiddenProperty(Handle<JSObject> object,
|
|
|
| ASSERT(key->IsUniqueName());
|
| if (object->IsJSGlobalProxy()) {
|
| + // JSGlobalProxies store their hash internally.
|
| + ASSERT(*key != *isolate->factory()->identity_hash_string());
|
| // For a proxy, use the prototype as target object.
|
| Handle<Object> proxy_parent(object->GetPrototype(), isolate);
|
| // If the proxy is detached, return undefined.
|
|
|