Fix v8::Object::DeleteHiddenValue to not bail when there are no hidden properties.
authorasargent@chromium.org <asargent@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 8 Apr 2009 21:05:29 +0000 (21:05 +0000)
committerasargent@chromium.org <asargent@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 8 Apr 2009 21:05:29 +0000 (21:05 +0000)
Review URL: http://codereview.chromium.org/58016

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@1687 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/api.cc
test/cctest/test-api.cc

index 9d95a34..d5b42c5 100644 (file)
@@ -2077,13 +2077,13 @@ bool v8::Object::DeleteHiddenValue(v8::Handle<v8::String> key) {
   ON_BAILOUT("v8::DeleteHiddenValue()", return false);
   ENTER_V8;
   i::Handle<i::JSObject> self = Utils::OpenHandle(this);
-  i::Handle<i::JSObject> hidden_props(
-      i::JSObject::cast(*i::GetHiddenProperties(self, false)));
+  i::Handle<i::Object> hidden_props(i::GetHiddenProperties(self, false));
   if (hidden_props->IsUndefined()) {
-    return false;
+    return true;
   }
+  i::Handle<i::JSObject> js_obj(i::JSObject::cast(*hidden_props));
   i::Handle<i::String> key_obj = Utils::OpenHandle(*key);
-  return i::DeleteProperty(hidden_props, key_obj)->IsTrue();
+  return i::DeleteProperty(js_obj, key_obj)->IsTrue();
 }
 
 
index dd705d2..d899e8d 100644 (file)
@@ -1293,6 +1293,9 @@ THREADED_TEST(HiddenProperties) {
 
   i::Heap::CollectAllGarbage();
 
+  // Make sure delete of a non-existent hidden value works
+  CHECK(obj->DeleteHiddenValue(key));
+
   CHECK(obj->SetHiddenValue(key, v8::Integer::New(1503)));
   CHECK_EQ(1503, obj->GetHiddenValue(key)->Int32Value());
   CHECK(obj->SetHiddenValue(key, v8::Integer::New(2002)));