Fix deletion of hidden property with inline-stored hash.

R=yangguo@chromium.org
BUG=chromium:157124
TEST=cctest/test-api/Regress157124

Review URL: https://codereview.chromium.org/11233033

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@12785 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent f07b2291
...@@ -3578,7 +3578,6 @@ Object* JSObject::GetHiddenProperty(String* key) { ...@@ -3578,7 +3578,6 @@ Object* JSObject::GetHiddenProperty(String* key) {
ASSERT(!IsJSGlobalProxy()); ASSERT(!IsJSGlobalProxy());
MaybeObject* hidden_lookup = MaybeObject* hidden_lookup =
GetHiddenPropertiesHashTable(ONLY_RETURN_INLINE_VALUE); GetHiddenPropertiesHashTable(ONLY_RETURN_INLINE_VALUE);
ASSERT(!hidden_lookup->IsFailure()); // No failure when passing false as arg.
Object* inline_value = hidden_lookup->ToObjectUnchecked(); Object* inline_value = hidden_lookup->ToObjectUnchecked();
if (inline_value->IsSmi()) { if (inline_value->IsSmi()) {
...@@ -3619,13 +3618,11 @@ MaybeObject* JSObject::SetHiddenProperty(String* key, Object* value) { ...@@ -3619,13 +3618,11 @@ MaybeObject* JSObject::SetHiddenProperty(String* key, Object* value) {
return JSObject::cast(proxy_parent)->SetHiddenProperty(key, value); return JSObject::cast(proxy_parent)->SetHiddenProperty(key, value);
} }
ASSERT(!IsJSGlobalProxy()); ASSERT(!IsJSGlobalProxy());
// If there is no backing store yet, store the identity hash inline.
MaybeObject* hidden_lookup = MaybeObject* hidden_lookup =
GetHiddenPropertiesHashTable(ONLY_RETURN_INLINE_VALUE); GetHiddenPropertiesHashTable(ONLY_RETURN_INLINE_VALUE);
ASSERT(!hidden_lookup->IsFailure());
Object* inline_value = hidden_lookup->ToObjectUnchecked(); Object* inline_value = hidden_lookup->ToObjectUnchecked();
// If there is no backing store yet, store the identity hash inline.
if (value->IsSmi() && if (value->IsSmi() &&
key == GetHeap()->identity_hash_symbol() && key == GetHeap()->identity_hash_symbol() &&
(inline_value->IsUndefined() || inline_value->IsSmi())) { (inline_value->IsUndefined() || inline_value->IsSmi())) {
...@@ -3662,15 +3659,16 @@ void JSObject::DeleteHiddenProperty(String* key) { ...@@ -3662,15 +3659,16 @@ void JSObject::DeleteHiddenProperty(String* key) {
JSObject::cast(proxy_parent)->DeleteHiddenProperty(key); JSObject::cast(proxy_parent)->DeleteHiddenProperty(key);
return; return;
} }
ASSERT(!IsJSGlobalProxy());
MaybeObject* hidden_lookup = MaybeObject* hidden_lookup =
GetHiddenPropertiesHashTable(ONLY_RETURN_INLINE_VALUE); GetHiddenPropertiesHashTable(ONLY_RETURN_INLINE_VALUE);
ASSERT(!hidden_lookup->IsFailure()); // No failure when passing false as arg. Object* inline_value = hidden_lookup->ToObjectUnchecked();
if (hidden_lookup->ToObjectUnchecked()->IsUndefined()) return;
// We never delete (inline-stored) identity hashes. // We never delete (inline-stored) identity hashes.
ASSERT(!hidden_lookup->ToObjectUnchecked()->IsSmi()); ASSERT(key != GetHeap()->identity_hash_symbol());
if (inline_value->IsUndefined() || inline_value->IsSmi()) return;
ObjectHashTable* hashtable = ObjectHashTable* hashtable = ObjectHashTable::cast(inline_value);
ObjectHashTable::cast(hidden_lookup->ToObjectUnchecked());
MaybeObject* delete_result = hashtable->Put(key, GetHeap()->the_hole_value()); MaybeObject* delete_result = hashtable->Put(key, GetHeap()->the_hole_value());
USE(delete_result); USE(delete_result);
ASSERT(!delete_result->IsFailure()); // Delete does not cause GC. ASSERT(!delete_result->IsFailure()); // Delete does not cause GC.
......
...@@ -17696,6 +17696,16 @@ THREADED_TEST(Regress149912) { ...@@ -17696,6 +17696,16 @@ THREADED_TEST(Regress149912) {
} }
THREADED_TEST(Regress157124) {
v8::HandleScope scope;
LocalContext context;
Local<ObjectTemplate> templ = ObjectTemplate::New();
Local<Object> obj = templ->NewInstance();
obj->GetIdentityHash();
obj->DeleteHiddenValue(v8_str("Bug"));
}
#ifndef WIN32 #ifndef WIN32
class ThreadInterruptTest { class ThreadInterruptTest {
public: public:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment