Reviewers: Jakob,

Message:
ptal

Description:
Cleanup API property handling

BUG=v8:4137
LOG=n

Please review this at https://codereview.chromium.org/1226473003/

Base URL: https://chromium.googlesource.com/v8/v8.git@master

Affected files (+21, -37 lines):
  M src/api.cc
  M src/objects.h
  M src/objects.cc
  M src/runtime/runtime-object.cc


Index: src/api.cc
diff --git a/src/api.cc b/src/api.cc
index 0dbebc14e564aa93c441a0eb7d38bacea217de02..be8c200cac35788638863bdcf1c1346d49fdd767 100644
--- a/src/api.cc
+++ b/src/api.cc
@@ -3568,16 +3568,9 @@ static i::MaybeHandle<i::Object> DefineObjectProperty(
   }

   i::Handle<i::Name> name;
-  if (key->IsName()) {
-    name = i::Handle<i::Name>::cast(key);
-  } else {
-    // Call-back into JavaScript to convert the key to a string.
-    i::Handle<i::Object> converted;
-    ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, converted,
-                                     i::Execution::ToString(isolate, key),
-                                     i::MaybeHandle<i::Object>());
-    name = i::Handle<i::String>::cast(converted);
-  }
+  ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, name,
+                                   i::Runtime::ToName(isolate, key),
+                                   i::MaybeHandle<i::Object>());

return i::JSObject::DefinePropertyOrElementIgnoreAttributes(js_object, name, value, attrs); @@ -3616,44 +3609,24 @@ bool v8::Object::ForceSet(v8::Handle<Value> key, v8::Handle<Value> value,
 }


-namespace {
-
-i::MaybeHandle<i::Object> DeleteObjectProperty(
+MUST_USE_RESULT
+static i::MaybeHandle<i::Object> DeleteObjectProperty(
     i::Isolate* isolate, i::Handle<i::JSReceiver> receiver,
     i::Handle<i::Object> key, i::LanguageMode language_mode) {
   // Check if the given key is an array index.
   uint32_t index = 0;
   if (key->ToArrayIndex(&index)) {
-    // In Firefox/SpiderMonkey, Safari and Opera you can access the
-    // characters of a string using [] notation.  In the case of a
-    // String object we just need to redirect the deletion to the
-    // underlying string if the index is in range.  Since the
-    // underlying string does nothing with the deletion, we can ignore
-    // such deletions.
-    if (receiver->IsStringObjectWithCharacterAt(index)) {
-      return isolate->factory()->false_value();
-    }
-
     return i::JSReceiver::DeleteElement(receiver, index, language_mode);
   }

   i::Handle<i::Name> name;
-  if (key->IsName()) {
-    name = i::Handle<i::Name>::cast(key);
-  } else {
-    // Call-back into JavaScript to convert the key to a string.
-    i::Handle<i::Object> converted;
-    if (!i::Execution::ToString(isolate, key).ToHandle(&converted)) {
-      return i::MaybeHandle<i::Object>();
-    }
-    name = i::Handle<i::String>::cast(converted);
-  }
+  ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, name,
+                                   i::Runtime::ToName(isolate, key),
+                                   i::MaybeHandle<i::Object>());

-  return i::JSReceiver::DeleteProperty(receiver, name, language_mode);
+ return i::JSReceiver::DeletePropertyOrElement(receiver, name, language_mode);
 }

-}  // namespace
-

 MaybeLocal<Value> v8::Object::Get(Local<v8::Context> context,
                                   Local<Value> key) {
Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 4eeb51d67c58d1a066dbd66d4abaf0eba8ea9dab..5941186dbdf9fed6a48669ae377c38e1ce7f5fcd 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -5238,6 +5238,13 @@ MaybeHandle<Object> JSReceiver::DeleteElement(Handle<JSReceiver> object,
 MaybeHandle<Object> JSReceiver::DeleteProperty(Handle<JSReceiver> object,
                                                Handle<Name> name,
LanguageMode language_mode) {
+  LookupIterator it(object, name, LookupIterator::HIDDEN);
+  return JSObject::DeleteProperty(&it, language_mode);
+}
+
+
+MaybeHandle<Object> JSReceiver::DeletePropertyOrElement(
+ Handle<JSReceiver> object, Handle<Name> name, LanguageMode language_mode) {
   LookupIterator it = LookupIterator::PropertyOrElement(
       name->GetIsolate(), object, name, LookupIterator::HIDDEN);
   return JSObject::DeleteProperty(&it, language_mode);
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index 72d9265b485f090124dd9628f9fbd49a89a48f5e..b3c32ff870d711fc873de82be3b46c87ec0fe0e0 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -1681,6 +1681,9 @@ class JSReceiver: public HeapObject {
       Handle<JSReceiver> object, uint32_t index);

   // Implementation of [[Delete]], ECMA-262 5th edition, section 8.12.7.
+  MUST_USE_RESULT static MaybeHandle<Object> DeletePropertyOrElement(
+      Handle<JSReceiver> object, Handle<Name> name,
+      LanguageMode language_mode = SLOPPY);
   MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty(
       Handle<JSReceiver> object, Handle<Name> name,
       LanguageMode language_mode = SLOPPY);
Index: src/runtime/runtime-object.cc
diff --git a/src/runtime/runtime-object.cc b/src/runtime/runtime-object.cc
index 4f94f24a7ac0c2d0d0d9b6e66f5fa442dfa01c28..556f9745dafae7df16d031e936ff0ceba8ac3417 100644
--- a/src/runtime/runtime-object.cc
+++ b/src/runtime/runtime-object.cc
@@ -585,7 +585,8 @@ RUNTIME_FUNCTION(Runtime_DeleteProperty) {
   CONVERT_LANGUAGE_MODE_ARG_CHECKED(language_mode, 2);
   Handle<Object> result;
   ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
- isolate, result, JSReceiver::DeleteProperty(object, key, language_mode));
+      isolate, result,
+      JSReceiver::DeletePropertyOrElement(object, key, language_mode));
   return *result;
 }



--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to