Index: src/elements.cc |
diff --git a/src/elements.cc b/src/elements.cc |
index 742942b844c718e04f0956799c61acf5df7fa50d..4a4e92802985185ca5e54c339351d3f29c484eaa 100644 |
--- a/src/elements.cc |
+++ b/src/elements.cc |
@@ -2310,6 +2310,113 @@ class SlowSloppyArgumentsElementsAccessor |
object, arguments, entry - length, value, attributes); |
} |
} |
+ |
+ static void CollectElementIndicesImpl(Handle<JSObject> object, |
+ Handle<FixedArrayBase> backing_store, |
+ KeyAccumulator* keys, uint32_t range, |
+ PropertyFilter filter, |
+ uint32_t offset) { |
+ Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(backing_store); |
+ uint32_t length = parameter_map->length() - 2; |
+ uint32_t i; |
+ for (i = offset; i < length; ++i) { |
+ if (!parameter_map->get(i + 2)->IsTheHole()) { |
+ keys->AddKey(i); |
+ } |
+ } |
+ |
+ { |
+ DisallowHeapAllocation no_allocation; |
+ Handle<SeededNumberDictionary> dict( |
+ SeededNumberDictionary::cast(parameter_map->get(1))); |
+ uint32_t arguments_length = dict->Capacity(); |
+ if (range < arguments_length) arguments_length = range; |
+ uint32_t index; |
+ for (; i < arguments_length; ++i) { |
+ Object* key = dict->KeyAt(i); |
+ if (!key->IsTheHole() && key->ToUint32(&index)) { |
+ if (filter != ALL_PROPERTIES && |
+ DictionaryElementsAccessor::GetDetailsImpl(*dict, i).attributes()) |
+ continue; |
+ keys->AddKey(index); |
+ } |
+ } |
+ } |
+ keys->SortCurrentElementsList(); |
Camillo Bruni
2016/03/10 09:15:14
I would prefer a base implementation in SloppyArgu
caitp (gmail)
2016/03/10 16:58:33
Done.
|
+ } |
+ |
+ static Handle<FixedArray> DirectCollectElementIndicesImpl( |
+ Isolate* isolate, Handle<JSObject> object, |
+ Handle<FixedArrayBase> backing_store, GetKeysConversion convert, |
+ PropertyFilter filter, Handle<FixedArray> list, uint32_t* nof_indices) { |
+ Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(backing_store); |
+ uint32_t length = parameter_map->length() - 2; |
+ uint32_t insertion_index = 0; |
+ uint32_t i; |
+ for (i = 0; i < length; ++i) { |
+ if (!parameter_map->get(i + 2)->IsTheHole()) { |
+ if (convert == CONVERT_TO_STRING) { |
+ Handle<String> index_string = isolate->factory()->Uint32ToString(i); |
+ list->set(insertion_index, *index_string); |
+ } else { |
+ list->set(insertion_index, Smi::FromInt(i), SKIP_WRITE_BARRIER); |
+ } |
+ insertion_index++; |
+ } |
+ } |
+ |
+ { |
+ Handle<SeededNumberDictionary> dict( |
+ SeededNumberDictionary::cast(parameter_map->get(1))); |
+ uint32_t arguments_length = dict->Capacity(); |
+ for (; i < arguments_length; ++i) { |
+ Object* key = dict->KeyAt(i); |
+ uint32_t index; |
+ if (!key->IsTheHole() && key->ToUint32(&index)) { |
+ if (filter != ALL_PROPERTIES && |
+ DictionaryElementsAccessor::GetDetailsImpl(*dict, i).attributes()) |
+ continue; |
+ if (convert == CONVERT_TO_STRING) { |
+ Handle<String> index_string = |
+ isolate->factory()->Uint32ToString(index); |
+ list->set(insertion_index, *index_string); |
+ } else { |
+ list->set(insertion_index, Smi::FromInt(index), SKIP_WRITE_BARRIER); |
+ } |
+ insertion_index++; |
+ } |
+ } |
+ } |
+ |
+ *nof_indices = insertion_index; |
+ return list; |
+ } |
+ |
+ static void AddElementsToKeyAccumulatorImpl(Handle<JSObject> receiver, |
+ KeyAccumulator* accumulator, |
+ AddKeyConversion convert) { |
+ Handle<FixedArray> parameter_map(FixedArray::cast(receiver->elements())); |
+ uint32_t length = parameter_map->length() - 2; |
+ uint32_t i; |
+ for (i = 0; i < length; ++i) { |
+ if (!parameter_map->get(i + 2)->IsTheHole()) { |
+ accumulator->AddKey(Smi::FromInt(i), convert); |
+ } |
+ } |
+ |
+ { |
+ Handle<SeededNumberDictionary> dict( |
+ SeededNumberDictionary::cast(parameter_map->get(1))); |
+ uint32_t arguments_length = dict->Capacity(); |
+ for (; i < arguments_length; ++i) { |
+ Object* key = dict->KeyAt(i); |
+ uint32_t index; |
+ if (!key->IsTheHole() && key->ToUint32(&index)) { |
+ accumulator->AddKey(key, convert); |
+ } |
+ } |
+ } |
+ } |
}; |