Reviewers: Mads Ager,

Description:
[Arguments] Support deletion of arguments properties.

Runtime support for deletion of indexed properties on the arguments object.
Enable a place where the debugger synthesizes an arguments object without
any parameter aliasing, in order to increase test coverage.

[email protected]


Please review this at http://codereview.chromium.org/6696068/

SVN Base: https://v8.googlecode.com/svn/branches/experimental/arguments

Affected files:
  M src/objects.h
  M src/objects.cc
  M src/runtime.cc


Index: src/objects.cc
diff --git a/src/objects.cc b/src/objects.cc
index 079b47c6eab1353599e57a13b26939911ea8add0..d86951f06cd8134c9bd1a1dceca556bc4245960d 100644
--- a/src/objects.cc
+++ b/src/objects.cc
@@ -2752,6 +2752,40 @@ MaybeObject* JSObject::DeleteElementWithInterceptor(uint32_t index) {
 }


+void JSObject::DeleteFromFastElements(FixedArray* elements, uint32_t index) {
+  ASSERT(elements->map() != elements->GetHeap()->fixed_cow_array_map());
+  int length = IsJSArray()
+      ? Smi::cast(JSArray::cast(this)->length())->value()
+      : elements->length();
+  if (index < static_cast<uint32_t>(length)) {
+    elements->set_the_hole(index);
+  }
+}
+
+
+MaybeObject* JSObject::DeleteFromDictionaryElements(NumberDictionary* elements,
+                                                    uint32_t index,
+                                                    DeleteMode mode) {
+  Isolate* isolate = GetIsolate();
+  int entry = elements->FindEntry(index);
+  if (entry != NumberDictionary::kNotFound) {
+    Object* result = elements->DeleteProperty(entry, mode);
+ if (mode == STRICT_DELETION && result == isolate->heap()->false_value()) {
+      // In strict mode, attempting to delete a non-configurable property
+      // throws an exception.
+      HandleScope scope(isolate);
+      Handle<Object> name = isolate->factory()->NewNumberFromUint(index);
+      Handle<Object> args[2] = { name, Handle<Object>(this) };
+      Handle<Object> error =
+          isolate->factory()->NewTypeError("strict_delete_property",
+                                           HandleVector(args, 2));
+      return isolate->Throw(*error);
+    }
+  }
+  return isolate->heap()->true_value();
+}
+
+
 MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) {
   Isolate* isolate = GetIsolate();
   // Check access rights if needed.
@@ -2782,12 +2816,7 @@ MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) {
       { MaybeObject* maybe_obj = EnsureWritableFastElements();
         if (!maybe_obj->ToObject(&obj)) return maybe_obj;
       }
-      uint32_t length = IsJSArray() ?
- static_cast<uint32_t>(Smi::cast(JSArray::cast(this)->length())->value()) :
-      static_cast<uint32_t>(FixedArray::cast(elements())->length());
-      if (index < length) {
-        FixedArray::cast(elements())->set_the_hole(index);
-      }
+      DeleteFromFastElements(FixedArray::cast(elements()), index);
       break;
     }

@@ -2803,29 +2832,30 @@ MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) {
       // silently ignore here.
       break;

-    case DICTIONARY_ELEMENTS: {
-      NumberDictionary* dictionary = element_dictionary();
-      int entry = dictionary->FindEntry(index);
-      if (entry != NumberDictionary::kNotFound) {
-        Object* result = dictionary->DeleteProperty(entry, mode);
-        if (mode == STRICT_DELETION && result ==
-            isolate->heap()->false_value()) {
-          // In strict mode, deleting a non-configurable property throws
- // exception. dictionary->DeleteProperty will return false_value()
-          // if a non-configurable property is being deleted.
-          HandleScope scope;
-          Handle<Object> i = isolate->factory()->NewNumberFromUint(index);
-          Handle<Object> args[2] = { i, Handle<Object>(this) };
-          return isolate->Throw(*isolate->factory()->NewTypeError(
-              "strict_delete_property", HandleVector(args, 2)));
+    case DICTIONARY_ELEMENTS:
+ return DeleteFromDictionaryElements(element_dictionary(), index, mode);
+
+    case NON_STRICT_ARGUMENTS_ELEMENTS: {
+      FixedArray* parameter_map = FixedArray::cast(elements());
+      uint32_t length = parameter_map->length();
+      Object* probe =
+          (index + 2) < length ? parameter_map->get(index + 2) : NULL;
+      if (probe != NULL && !probe->IsTheHole()) {
+        // TODO(kmillikin): We could check if this was the last aliased
+        // parameter, and revert to normal elements in that case.  That
+        // would enable GC of the context.
+        parameter_map->set_the_hole(index + 2);
+      } else {
+        FixedArray* arguments = FixedArray::cast(parameter_map->get(1));
+        if (arguments->IsDictionary()) {
+          NumberDictionary* dictionary = NumberDictionary::cast(arguments);
+          return DeleteFromDictionaryElements(dictionary, index, mode);
+        } else {
+          DeleteFromFastElements(arguments, index);
         }
       }
       break;
     }
-
-    case NON_STRICT_ARGUMENTS_ELEMENTS:
-      UNIMPLEMENTED();
-      break;
   }
   return isolate->heap()->true_value();
 }
Index: src/objects.h
diff --git a/src/objects.h b/src/objects.h
index 5443926691023bac454bb0bfd92629d7a9dffee8..d3083ccf3501c9d1933c099db3b1f077cbf1e10d 100644
--- a/src/objects.h
+++ b/src/objects.h
@@ -1871,6 +1871,13 @@ class JSObject: public HeapObject {
DeleteMode mode); MUST_USE_RESULT MaybeObject* DeleteElementWithInterceptor(uint32_t index);

+  // Deletion utilities taking an explicit backing store argument.
+  void DeleteFromFastElements(FixedArray* elements, uint32_t index);
+  MUST_USE_RESULT MaybeObject* DeleteFromDictionaryElements(
+      NumberDictionary* elements,
+      uint32_t index,
+      DeleteMode mode);
+
PropertyAttributes GetPropertyAttributePostInterceptor(JSObject* receiver,
                                                          String* name,
bool continue_search);
Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index 8bbb2f1cc8f42b14285fbf80deb3e6c99c1485e7..2f16d5f3183a803434fc44623300e9eb921f1360 100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -10781,7 +10781,6 @@ static Handle<Object> GetArgumentsObject(Isolate* isolate,
   }

   const int length = frame->ComputeParametersCount();
-  UNIMPLEMENTED();
   Handle<JSObject> arguments =
       isolate->factory()->NewArgumentsObject(function, length);
   Handle<FixedArray> array = isolate->factory()->NewFixedArray(length);


--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to