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) { |