| Index: src/objects.cc
 | 
| diff --git a/src/objects.cc b/src/objects.cc
 | 
| index ca780dbe0ea44bbf81cf337e7494afcd507fd933..8d5aa922f1b057b88ef6ce43c4b42b33c9f7f30f 100644
 | 
| --- a/src/objects.cc
 | 
| +++ b/src/objects.cc
 | 
| @@ -194,7 +194,7 @@ MaybeObject* Object::GetPropertyWithCallback(Object* receiver,
 | 
|      AccessorInfo* data = AccessorInfo::cast(structure);
 | 
|      Object* fun_obj = data->getter();
 | 
|      v8::AccessorGetter call_fun = v8::ToCData<v8::AccessorGetter>(fun_obj);
 | 
| -    HandleScope scope;
 | 
| +    HandleScope scope(isolate);
 | 
|      JSObject* self = JSObject::cast(receiver);
 | 
|      JSObject* holder_handle = JSObject::cast(holder);
 | 
|      Handle<String> key(name);
 | 
| @@ -234,7 +234,7 @@ MaybeObject* Object::GetPropertyWithHandler(Object* receiver_raw,
 | 
|                                              String* name_raw,
 | 
|                                              Object* handler_raw) {
 | 
|    Isolate* isolate = name_raw->GetIsolate();
 | 
| -  HandleScope scope;
 | 
| +  HandleScope scope(isolate);
 | 
|    Handle<Object> receiver(receiver_raw);
 | 
|    Handle<Object> name(name_raw);
 | 
|    Handle<Object> handler(handler_raw);
 | 
| @@ -2178,9 +2178,9 @@ MaybeObject* JSObject::SetPropertyWithFailedAccessCheck(
 | 
|      }
 | 
|    }
 | 
|  
 | 
| -  HandleScope scope;
 | 
| -  Handle<Object> value_handle(value);
 | 
|    Heap* heap = GetHeap();
 | 
| +  HandleScope scope(heap->isolate());
 | 
| +  Handle<Object> value_handle(value);
 | 
|    heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_SET);
 | 
|    return *value_handle;
 | 
|  }
 | 
| @@ -2207,7 +2207,7 @@ MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyWithHandler(
 | 
|      PropertyAttributes attributes,
 | 
|      StrictModeFlag strict_mode) {
 | 
|    Isolate* isolate = GetIsolate();
 | 
| -  HandleScope scope;
 | 
| +  HandleScope scope(isolate);
 | 
|    Handle<Object> receiver(this);
 | 
|    Handle<Object> name(name_raw);
 | 
|    Handle<Object> value(value_raw);
 | 
| @@ -2233,12 +2233,50 @@ MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyWithHandler(
 | 
|  }
 | 
|  
 | 
|  
 | 
| +MUST_USE_RESULT MaybeObject* JSProxy::DeletePropertyWithHandler(
 | 
| +    String* name_raw, DeleteMode mode) {
 | 
| +  Isolate* isolate = GetIsolate();
 | 
| +  HandleScope scope(isolate);
 | 
| +  Handle<Object> receiver(this);
 | 
| +  Handle<Object> name(name_raw);
 | 
| +  Handle<Object> handler(this->handler());
 | 
| +
 | 
| +  // Extract trap function.
 | 
| +  Handle<String> trap_name = isolate->factory()->LookupAsciiSymbol("delete");
 | 
| +  Handle<Object> trap(v8::internal::GetProperty(handler, trap_name));
 | 
| +  if (trap->IsUndefined()) {
 | 
| +    Handle<Object> args[] = { handler, trap_name };
 | 
| +    Handle<Object> error = isolate->factory()->NewTypeError(
 | 
| +        "handler_trap_missing", HandleVector(args, ARRAY_SIZE(args)));
 | 
| +    isolate->Throw(*error);
 | 
| +    return Failure::Exception();
 | 
| +  }
 | 
| +
 | 
| +  // Call trap function.
 | 
| +  Object** args[] = { name.location() };
 | 
| +  bool has_exception;
 | 
| +  Handle<Object> result =
 | 
| +      Execution::Call(trap, handler, ARRAY_SIZE(args), args, &has_exception);
 | 
| +  if (has_exception) return Failure::Exception();
 | 
| +
 | 
| +  Object* bool_result = result->ToBoolean();
 | 
| +  if (mode == STRICT_DELETION && bool_result == GetHeap()->false_value()) {
 | 
| +    Handle<Object> args[] = { handler, trap_name };
 | 
| +    Handle<Object> error = isolate->factory()->NewTypeError(
 | 
| +        "handler_failed", HandleVector(args, ARRAY_SIZE(args)));
 | 
| +    isolate->Throw(*error);
 | 
| +    return Failure::Exception();
 | 
| +  }
 | 
| +  return bool_result;
 | 
| +}
 | 
| +
 | 
| +
 | 
|  MUST_USE_RESULT PropertyAttributes JSProxy::GetPropertyAttributeWithHandler(
 | 
|      JSReceiver* receiver_raw,
 | 
|      String* name_raw,
 | 
|      bool* has_exception) {
 | 
|    Isolate* isolate = GetIsolate();
 | 
| -  HandleScope scope;
 | 
| +  HandleScope scope(isolate);
 | 
|    Handle<JSReceiver> receiver(receiver_raw);
 | 
|    Handle<Object> name(name_raw);
 | 
|    Handle<Object> handler(this->handler());
 | 
| @@ -2327,7 +2365,7 @@ MaybeObject* JSObject::SetPropertyForResult(LookupResult* result,
 | 
|    }
 | 
|    if (result->IsReadOnly() && result->IsProperty()) {
 | 
|      if (strict_mode == kStrictMode) {
 | 
| -      HandleScope scope;
 | 
| +      HandleScope scope(heap->isolate());
 | 
|        Handle<String> key(name);
 | 
|        Handle<Object> holder(this);
 | 
|        Handle<Object> args[2] = { key, holder };
 | 
| @@ -3179,6 +3217,15 @@ MaybeObject* JSObject::DeleteElement(uint32_t index, DeleteMode mode) {
 | 
|  }
 | 
|  
 | 
|  
 | 
| +MaybeObject* JSReceiver::DeleteProperty(String* name, DeleteMode mode) {
 | 
| +  if (IsJSProxy()) {
 | 
| +    return JSProxy::cast(this)->DeletePropertyWithHandler(name, mode);
 | 
| +  } else {
 | 
| +    return JSObject::cast(this)->DeleteProperty(name, mode);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +
 | 
|  MaybeObject* JSObject::DeleteProperty(String* name, DeleteMode mode) {
 | 
|    Isolate* isolate = GetIsolate();
 | 
|    // ECMA-262, 3rd, 8.6.2.5
 | 
| @@ -7520,7 +7567,7 @@ void JSArray::Expand(int required_size) {
 | 
|  
 | 
|  
 | 
|  static Failure* ArrayLengthRangeError(Heap* heap) {
 | 
| -  HandleScope scope;
 | 
| +  HandleScope scope(heap->isolate());
 | 
|    return heap->isolate()->Throw(
 | 
|        *FACTORY->NewRangeError("invalid_array_length",
 | 
|            HandleVector<Object>(NULL, 0)));
 | 
| @@ -7718,7 +7765,7 @@ MaybeObject* JSReceiver::SetPrototype(Object* value,
 | 
|    // or [[Extensible]] must not violate the invariants defined in the preceding
 | 
|    // paragraph.
 | 
|    if (!this->map()->is_extensible()) {
 | 
| -    HandleScope scope;
 | 
| +    HandleScope scope(heap->isolate());
 | 
|      Handle<Object> handle(this, heap->isolate());
 | 
|      return heap->isolate()->Throw(
 | 
|          *FACTORY->NewTypeError("non_extensible_proto",
 | 
| @@ -7732,7 +7779,7 @@ MaybeObject* JSReceiver::SetPrototype(Object* value,
 | 
|    for (Object* pt = value; pt != heap->null_value(); pt = pt->GetPrototype()) {
 | 
|      if (JSObject::cast(pt) == this) {
 | 
|        // Cycle detected.
 | 
| -      HandleScope scope;
 | 
| +      HandleScope scope(heap->isolate());
 | 
|        return heap->isolate()->Throw(
 | 
|            *FACTORY->NewError("cyclic_proto", HandleVector<Object>(NULL, 0)));
 | 
|      }
 | 
| @@ -8512,7 +8559,7 @@ MaybeObject* JSObject::SetElement(uint32_t index,
 | 
|    if (IsAccessCheckNeeded()) {
 | 
|      Heap* heap = GetHeap();
 | 
|      if (!heap->isolate()->MayIndexedAccess(this, index, v8::ACCESS_SET)) {
 | 
| -      HandleScope scope;
 | 
| +      HandleScope scope(heap->isolate());
 | 
|        Handle<Object> value_handle(value);
 | 
|        heap->isolate()->ReportFailedAccessCheck(this, v8::ACCESS_SET);
 | 
|        return *value_handle;
 | 
| @@ -11053,11 +11100,11 @@ void NumberDictionary::RemoveNumberEntries(uint32_t from, uint32_t to) {
 | 
|  
 | 
|  template<typename Shape, typename Key>
 | 
|  Object* Dictionary<Shape, Key>::DeleteProperty(int entry,
 | 
| -                                               JSObject::DeleteMode mode) {
 | 
| +                                               JSReceiver::DeleteMode mode) {
 | 
|    Heap* heap = Dictionary<Shape, Key>::GetHeap();
 | 
|    PropertyDetails details = DetailsAt(entry);
 | 
|    // Ignore attributes if forcing a deletion.
 | 
| -  if (details.IsDontDelete() && mode != JSObject::FORCE_DELETION) {
 | 
| +  if (details.IsDontDelete() && mode != JSReceiver::FORCE_DELETION) {
 | 
|      return heap->false_value();
 | 
|    }
 | 
|    SetEntry(entry, heap->null_value(), heap->null_value());
 | 
| 
 |