Index: src/handles.cc |
diff --git a/src/handles.cc b/src/handles.cc |
index 6584bdbaaec3159d120e44910bf7a2d8d470b636..2958d2cc0a8cb985dcb6407a04b83b2969d1d55a 100644 |
--- a/src/handles.cc |
+++ b/src/handles.cc |
@@ -551,6 +551,7 @@ void CustomArguments::IterateInstance(ObjectVisitor* v) { |
// Compute the property keys from the interceptor. |
+// TODO(rossberg): support symbols in API, and filter here if needed. |
v8::Handle<v8::Array> GetKeysForNamedInterceptor(Handle<JSReceiver> receiver, |
Handle<JSObject> object) { |
Isolate* isolate = receiver->GetIsolate(); |
@@ -625,7 +626,7 @@ static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { |
int len = array->length(); |
for (int i = 0; i < len; i++) { |
Object* e = array->get(i); |
- if (!(e->IsName() || e->IsNumber())) return false; |
+ if (!(e->IsString() || e->IsNumber())) return false; |
} |
return true; |
} |
@@ -754,10 +755,10 @@ Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, |
// to kInvalidEnumCache, this means that the map itself has never used the |
// present enum cache. The first step to using the cache is to set the |
// enum length of the map by counting the number of own descriptors that |
- // are not DONT_ENUM. |
+ // are not DONT_ENUM or SYMBOLIC. |
if (own_property_count == Map::kInvalidEnumCache) { |
own_property_count = object->map()->NumberOfDescribedProperties( |
- OWN_DESCRIPTORS, DONT_ENUM); |
+ OWN_DESCRIPTORS, DONT_SHOW); |
if (cache_result) object->map()->SetEnumLength(own_property_count); |
} |
@@ -784,7 +785,7 @@ Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, |
} |
isolate->counters()->enum_cache_misses()->Increment(); |
- int num_enum = map->NumberOfDescribedProperties(ALL_DESCRIPTORS, DONT_ENUM); |
+ int num_enum = map->NumberOfDescribedProperties(ALL_DESCRIPTORS, DONT_SHOW); |
Handle<FixedArray> storage = isolate->factory()->NewFixedArray(num_enum); |
Handle<FixedArray> indices = isolate->factory()->NewFixedArray(num_enum); |
@@ -798,9 +799,10 @@ Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, |
for (int i = 0; i < descs->number_of_descriptors(); i++) { |
PropertyDetails details = descs->GetDetails(i); |
- if (!details.IsDontEnum()) { |
+ Object* key = descs->GetKey(i); |
+ if (!(details.IsDontEnum() || key->IsSymbol())) { |
if (i < real_size) ++enum_size; |
- storage->set(index, descs->GetKey(i)); |
+ storage->set(index, key); |
if (!indices.is_null()) { |
if (details.type() != FIELD) { |
indices = Handle<FixedArray>(); |
@@ -860,7 +862,7 @@ Handle<FixedArray> GetEnumPropertyKeys(Handle<JSObject> object, |
isolate->factory()->NewFixedArray(next_enumeration); |
storage = Handle<FixedArray>(dictionary->CopyEnumKeysTo(*storage)); |
- ASSERT(storage->length() == object->NumberOfLocalProperties(DONT_ENUM)); |
+ ASSERT(storage->length() == object->NumberOfLocalProperties(DONT_SHOW)); |
return storage; |
} |
} |