| Index: src/objects.cc | 
| diff --git a/src/objects.cc b/src/objects.cc | 
| index cedba4cf03ae74da1a00fd8e067bd1ebcc745dc0..516ffb8964641dbaf0327481a118da5f2e434761 100644 | 
| --- a/src/objects.cc | 
| +++ b/src/objects.cc | 
| @@ -375,6 +375,9 @@ MaybeObject* JSProxy::GetPropertyWithHandler(Object* receiver_raw, | 
| Handle<Object> receiver(receiver_raw, isolate); | 
| Handle<Object> name(name_raw, isolate); | 
|  | 
| +  // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 
| +  if (name->IsSymbol()) return isolate->heap()->undefined_value(); | 
| + | 
| Handle<Object> args[] = { receiver, name }; | 
| Handle<Object> result = CallTrap( | 
| "get", isolate->derived_get_trap(), ARRAY_SIZE(args), args); | 
| @@ -2756,6 +2759,9 @@ bool JSProxy::HasPropertyWithHandler(Name* name_raw) { | 
| Handle<Object> receiver(this, isolate); | 
| Handle<Object> name(name_raw, isolate); | 
|  | 
| +  // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 
| +  if (name->IsSymbol()) return false; | 
| + | 
| Handle<Object> args[] = { name }; | 
| Handle<Object> result = CallTrap( | 
| "has", isolate->derived_has_trap(), ARRAY_SIZE(args), args); | 
| @@ -2777,6 +2783,9 @@ MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyWithHandler( | 
| Handle<Object> name(name_raw, isolate); | 
| Handle<Object> value(value_raw, isolate); | 
|  | 
| +  // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 
| +  if (name->IsSymbol()) return *value; | 
| + | 
| Handle<Object> args[] = { receiver, name, value }; | 
| CallTrap("set", isolate->derived_set_trap(), ARRAY_SIZE(args), args); | 
| if (isolate->has_pending_exception()) return Failure::Exception(); | 
| @@ -2799,6 +2808,12 @@ MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyViaPrototypesWithHandler( | 
| Handle<Object> value(value_raw, isolate); | 
| Handle<Object> handler(this->handler(), isolate);  // Trap might morph proxy. | 
|  | 
| +  // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 
| +  if (name->IsSymbol()) { | 
| +    *done = false; | 
| +    return isolate->heap()->the_hole_value(); | 
| +  } | 
| + | 
| *done = true;  // except where redefined... | 
| Handle<Object> args[] = { name }; | 
| Handle<Object> result = proxy->CallTrap( | 
| @@ -2807,7 +2822,7 @@ MUST_USE_RESULT MaybeObject* JSProxy::SetPropertyViaPrototypesWithHandler( | 
|  | 
| if (result->IsUndefined()) { | 
| *done = false; | 
| -    return GetHeap()->the_hole_value(); | 
| +    return isolate->heap()->the_hole_value(); | 
| } | 
|  | 
| // Emulate [[GetProperty]] semantics for proxies. | 
| @@ -2888,6 +2903,9 @@ MUST_USE_RESULT MaybeObject* JSProxy::DeletePropertyWithHandler( | 
| Handle<JSProxy> receiver(this); | 
| Handle<Object> name(name_raw, isolate); | 
|  | 
| +  // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 
| +  if (name->IsSymbol()) return isolate->heap()->false_value(); | 
| + | 
| Handle<Object> args[] = { name }; | 
| Handle<Object> result = CallTrap( | 
| "delete", Handle<Object>(), ARRAY_SIZE(args), args); | 
| @@ -2928,6 +2946,9 @@ MUST_USE_RESULT PropertyAttributes JSProxy::GetPropertyAttributeWithHandler( | 
| Handle<JSReceiver> receiver(receiver_raw); | 
| Handle<Object> name(name_raw, isolate); | 
|  | 
| +  // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 
| +  if (name->IsSymbol()) return ABSENT; | 
| + | 
| Handle<Object> args[] = { name }; | 
| Handle<Object> result = CallTrap( | 
| "getPropertyDescriptor", Handle<Object>(), ARRAY_SIZE(args), args); | 
| @@ -11587,18 +11608,22 @@ void FixedArray::SortPairs(FixedArray* numbers, uint32_t len) { | 
| // Fill in the names of local properties into the supplied storage. The main | 
| // purpose of this function is to provide reflection information for the object | 
| // mirrors. | 
| -void JSObject::GetLocalPropertyNames(FixedArray* storage, int index) { | 
| -  ASSERT(storage->length() >= (NumberOfLocalProperties() - index)); | 
| +void JSObject::GetLocalPropertyNames( | 
| +    FixedArray* storage, int index, PropertyAttributes filter) { | 
| +  ASSERT(storage->length() >= (NumberOfLocalProperties(filter) - index)); | 
| if (HasFastProperties()) { | 
| int real_size = map()->NumberOfOwnDescriptors(); | 
| DescriptorArray* descs = map()->instance_descriptors(); | 
| -    ASSERT(storage->length() >= index + real_size); | 
| for (int i = 0; i < real_size; i++) { | 
| -      storage->set(index + i, descs->GetKey(i)); | 
| +      if ((descs->GetDetails(i).attributes() & filter) == 0 && | 
| +          ((filter & SYMBOLIC) == 0 || !descs->GetKey(i)->IsSymbol())) { | 
| +        storage->set(index++, descs->GetKey(i)); | 
| +      } | 
| } | 
| } else { | 
| property_dictionary()->CopyKeysTo(storage, | 
| index, | 
| +                                      filter, | 
| NameDictionary::UNSORTED); | 
| } | 
| } | 
| @@ -12349,6 +12374,7 @@ template MaybeObject* Dictionary<SeededNumberDictionaryShape, uint32_t>::Shrink( | 
| template void Dictionary<NameDictionaryShape, Name*>::CopyKeysTo( | 
| FixedArray*, | 
| int, | 
| +    PropertyAttributes, | 
| Dictionary<NameDictionaryShape, Name*>::SortMode); | 
|  | 
| template int | 
| @@ -13591,6 +13617,7 @@ template<typename Shape, typename Key> | 
| void Dictionary<Shape, Key>::CopyKeysTo( | 
| FixedArray* storage, | 
| int index, | 
| +    PropertyAttributes filter, | 
| typename Dictionary<Shape, Key>::SortMode sort_mode) { | 
| ASSERT(storage->length() >= NumberOfElementsFilterAttributes( | 
| static_cast<PropertyAttributes>(NONE))); | 
| @@ -13600,7 +13627,8 @@ void Dictionary<Shape, Key>::CopyKeysTo( | 
| if (HashTable<Shape, Key>::IsKey(k)) { | 
| PropertyDetails details = DetailsAt(i); | 
| if (details.IsDeleted()) continue; | 
| -      storage->set(index++, k); | 
| +      PropertyAttributes attr = details.attributes(); | 
| +      if ((attr & filter) == 0) storage->set(index++, k); | 
| } | 
| } | 
| if (sort_mode == Dictionary<Shape, Key>::SORTED) { | 
|  |