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