| Index: src/objects.cc
|
| diff --git a/src/objects.cc b/src/objects.cc
|
| index efe35ed30ecab035dc602df3b821b8f9002fd238..bb3bb5f19ca7d8635d6965f426f54db78de6dec3 100644
|
| --- a/src/objects.cc
|
| +++ b/src/objects.cc
|
| @@ -467,7 +467,8 @@ MaybeHandle<Object> Object::SetPropertyWithDefinedSetter(
|
| }
|
|
|
|
|
| -static bool FindAllCanReadHolder(LookupIterator* it) {
|
| +// static
|
| +bool JSObject::AllCanRead(LookupIterator* it) {
|
| // Skip current iteration, it's in state ACCESS_CHECK or INTERCEPTOR, both of
|
| // which have already been checked.
|
| DCHECK(it->state() == LookupIterator::ACCESS_CHECK ||
|
| @@ -489,7 +490,7 @@ static bool FindAllCanReadHolder(LookupIterator* it) {
|
| MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
|
| LookupIterator* it) {
|
| Handle<JSObject> checked = it->GetHolder<JSObject>();
|
| - while (FindAllCanReadHolder(it)) {
|
| + while (AllCanRead(it)) {
|
| if (it->state() == LookupIterator::ACCESSOR) {
|
| return GetPropertyWithAccessor(it, SLOPPY);
|
| }
|
| @@ -509,7 +510,7 @@ MaybeHandle<Object> JSObject::GetPropertyWithFailedAccessCheck(
|
| Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck(
|
| LookupIterator* it) {
|
| Handle<JSObject> checked = it->GetHolder<JSObject>();
|
| - while (FindAllCanReadHolder(it)) {
|
| + while (AllCanRead(it)) {
|
| if (it->state() == LookupIterator::ACCESSOR) {
|
| return Just(it->property_details().attributes());
|
| }
|
| @@ -525,7 +526,8 @@ Maybe<PropertyAttributes> JSObject::GetPropertyAttributesWithFailedAccessCheck(
|
| }
|
|
|
|
|
| -static bool FindAllCanWriteHolder(LookupIterator* it) {
|
| +// static
|
| +bool JSObject::AllCanWrite(LookupIterator* it) {
|
| for (; it->IsFound(); it->Next()) {
|
| if (it->state() == LookupIterator::ACCESSOR) {
|
| Handle<Object> accessors = it->GetAccessors();
|
| @@ -541,7 +543,7 @@ static bool FindAllCanWriteHolder(LookupIterator* it) {
|
| MaybeHandle<Object> JSObject::SetPropertyWithFailedAccessCheck(
|
| LookupIterator* it, Handle<Object> value) {
|
| Handle<JSObject> checked = it->GetHolder<JSObject>();
|
| - if (FindAllCanWriteHolder(it)) {
|
| + if (AllCanWrite(it)) {
|
| // The supplied language-mode is ignored by SetPropertyWithAccessor.
|
| return SetPropertyWithAccessor(it, value, SLOPPY);
|
| }
|
| @@ -12889,10 +12891,11 @@ void FixedArray::SortPairs(FixedArray* numbers, uint32_t len) {
|
| // Fill in the names of own properties into the supplied storage. The main
|
| // purpose of this function is to provide reflection information for the object
|
| // mirrors.
|
| -void JSObject::GetOwnPropertyNames(
|
| - FixedArray* storage, int index, PropertyAttributes filter) {
|
| +int JSObject::GetOwnPropertyNames(FixedArray* storage, int index,
|
| + PropertyAttributes filter) {
|
| DCHECK(storage->length() >= (NumberOfOwnProperties(filter) - index));
|
| if (HasFastProperties()) {
|
| + int start_index = index;
|
| int real_size = map()->NumberOfOwnDescriptors();
|
| DescriptorArray* descs = map()->instance_descriptors();
|
| for (int i = 0; i < real_size; i++) {
|
| @@ -12901,12 +12904,13 @@ void JSObject::GetOwnPropertyNames(
|
| storage->set(index++, descs->GetKey(i));
|
| }
|
| }
|
| + return index - start_index;
|
| } else if (IsGlobalObject()) {
|
| - global_dictionary()->CopyKeysTo(storage, index, filter,
|
| - GlobalDictionary::UNSORTED);
|
| + return global_dictionary()->CopyKeysTo(storage, index, filter,
|
| + GlobalDictionary::UNSORTED);
|
| } else {
|
| - property_dictionary()->CopyKeysTo(storage, index, filter,
|
| - NameDictionary::UNSORTED);
|
| + return property_dictionary()->CopyKeysTo(storage, index, filter,
|
| + NameDictionary::UNSORTED);
|
| }
|
| }
|
|
|
| @@ -13006,7 +13010,7 @@ int JSObject::GetOwnElementKeys(FixedArray* storage,
|
|
|
| case DICTIONARY_ELEMENTS: {
|
| if (storage != NULL) {
|
| - element_dictionary()->CopyKeysTo(storage, filter,
|
| + element_dictionary()->CopyKeysTo(storage, 0, filter,
|
| SeededNumberDictionary::SORTED);
|
| }
|
| counter += element_dictionary()->NumberOfElementsFilterAttributes(filter);
|
| @@ -13023,7 +13027,7 @@ int JSObject::GetOwnElementKeys(FixedArray* storage,
|
| SeededNumberDictionary* dictionary =
|
| SeededNumberDictionary::cast(arguments);
|
| if (storage != NULL) {
|
| - dictionary->CopyKeysTo(storage, filter,
|
| + dictionary->CopyKeysTo(storage, 0, filter,
|
| SeededNumberDictionary::UNSORTED);
|
| }
|
| counter += dictionary->NumberOfElementsFilterAttributes(filter);
|
| @@ -14753,29 +14757,6 @@ bool Dictionary<Derived, Shape, Key>::HasComplexElements() {
|
| }
|
|
|
|
|
| -template <typename Derived, typename Shape, typename Key>
|
| -void Dictionary<Derived, Shape, Key>::CopyKeysTo(
|
| - FixedArray* storage, PropertyAttributes filter,
|
| - typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) {
|
| - DCHECK(storage->length() >= NumberOfElementsFilterAttributes(filter));
|
| - int capacity = this->Capacity();
|
| - int index = 0;
|
| - for (int i = 0; i < capacity; i++) {
|
| - Object* k = this->KeyAt(i);
|
| - if (this->IsKey(k) && !FilterKey(k, filter)) {
|
| - if (this->IsDeleted(i)) continue;
|
| - PropertyDetails details = this->DetailsAt(i);
|
| - PropertyAttributes attr = details.attributes();
|
| - if ((attr & filter) == 0) storage->set(index++, k);
|
| - }
|
| - }
|
| - if (sort_mode == Dictionary::SORTED) {
|
| - storage->SortPairs(storage, index);
|
| - }
|
| - DCHECK(storage->length() >= index);
|
| -}
|
| -
|
| -
|
| template <typename Dictionary>
|
| struct EnumIndexComparator {
|
| explicit EnumIndexComparator(Dictionary* dict) : dict(dict) {}
|
| @@ -14815,10 +14796,11 @@ void Dictionary<Derived, Shape, Key>::CopyEnumKeysTo(FixedArray* storage) {
|
|
|
|
|
| template <typename Derived, typename Shape, typename Key>
|
| -void Dictionary<Derived, Shape, Key>::CopyKeysTo(
|
| +int Dictionary<Derived, Shape, Key>::CopyKeysTo(
|
| FixedArray* storage, int index, PropertyAttributes filter,
|
| typename Dictionary<Derived, Shape, Key>::SortMode sort_mode) {
|
| DCHECK(storage->length() >= NumberOfElementsFilterAttributes(filter));
|
| + int start_index = index;
|
| int capacity = this->Capacity();
|
| for (int i = 0; i < capacity; i++) {
|
| Object* k = this->KeyAt(i);
|
| @@ -14833,6 +14815,7 @@ void Dictionary<Derived, Shape, Key>::CopyKeysTo(
|
| storage->SortPairs(storage, index);
|
| }
|
| DCHECK(storage->length() >= index);
|
| + return index - start_index;
|
| }
|
|
|
|
|
|
|