| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/objects.h" | 5 #include "src/objects.h" |
| 6 | 6 |
| 7 #include <cmath> | 7 #include <cmath> |
| 8 #include <iomanip> | 8 #include <iomanip> |
| 9 #include <sstream> | 9 #include <sstream> |
| 10 | 10 |
| (...skipping 7803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7814 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length); | 7814 Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length); |
| 7815 dictionary->CopyEnumKeysTo(*storage); | 7815 dictionary->CopyEnumKeysTo(*storage); |
| 7816 return storage; | 7816 return storage; |
| 7817 } | 7817 } |
| 7818 } | 7818 } |
| 7819 | 7819 |
| 7820 | 7820 |
| 7821 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, | 7821 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, |
| 7822 KeyCollectionType type, | 7822 KeyCollectionType type, |
| 7823 KeyFilter filter, | 7823 KeyFilter filter, |
| 7824 GetKeysConversion getConversion) { | 7824 GetKeysConversion getConversion, |
| 7825 Enumerability enum_policy) { |
| 7825 USE(ContainsOnlyValidKeys); | 7826 USE(ContainsOnlyValidKeys); |
| 7826 Isolate* isolate = object->GetIsolate(); | 7827 Isolate* isolate = object->GetIsolate(); |
| 7827 KeyAccumulator accumulator(isolate, filter); | 7828 KeyAccumulator accumulator(isolate, filter); |
| 7828 Handle<JSFunction> arguments_function( | 7829 Handle<JSFunction> arguments_function( |
| 7829 JSFunction::cast(isolate->sloppy_arguments_map()->GetConstructor())); | 7830 JSFunction::cast(isolate->sloppy_arguments_map()->GetConstructor())); |
| 7830 PrototypeIterator::WhereToEnd end = type == OWN_ONLY | 7831 PrototypeIterator::WhereToEnd end = type == OWN_ONLY |
| 7831 ? PrototypeIterator::END_AT_NON_HIDDEN | 7832 ? PrototypeIterator::END_AT_NON_HIDDEN |
| 7832 : PrototypeIterator::END_AT_NULL; | 7833 : PrototypeIterator::END_AT_NULL; |
| 7834 PropertyAttributes attr_filter = static_cast<PropertyAttributes>( |
| 7835 (enum_policy == RESPECT_ENUMERABILITY ? DONT_ENUM : NONE) | |
| 7836 PRIVATE_SYMBOL); |
| 7837 |
| 7833 // Only collect keys if access is permitted. | 7838 // Only collect keys if access is permitted. |
| 7834 for (PrototypeIterator iter(isolate, object, | 7839 for (PrototypeIterator iter(isolate, object, |
| 7835 PrototypeIterator::START_AT_RECEIVER); | 7840 PrototypeIterator::START_AT_RECEIVER); |
| 7836 !iter.IsAtEnd(end); iter.Advance()) { | 7841 !iter.IsAtEnd(end); iter.Advance()) { |
| 7837 accumulator.NextPrototype(); | 7842 accumulator.NextPrototype(); |
| 7838 if (PrototypeIterator::GetCurrent(iter)->IsJSProxy()) { | 7843 if (PrototypeIterator::GetCurrent(iter)->IsJSProxy()) { |
| 7839 Handle<JSProxy> proxy = PrototypeIterator::GetCurrent<JSProxy>(iter); | 7844 Handle<JSProxy> proxy = PrototypeIterator::GetCurrent<JSProxy>(iter); |
| 7840 Handle<Object> args[] = { proxy }; | 7845 Handle<Object> args[] = { proxy }; |
| 7841 Handle<Object> names; | 7846 Handle<Object> names; |
| 7842 ASSIGN_RETURN_ON_EXCEPTION( | 7847 ASSIGN_RETURN_ON_EXCEPTION( |
| (...skipping 13 matching lines...) Expand all Loading... |
| 7856 // Check access rights if required. | 7861 // Check access rights if required. |
| 7857 if (current->IsAccessCheckNeeded() && | 7862 if (current->IsAccessCheckNeeded() && |
| 7858 !isolate->MayAccess(handle(isolate->context()), current)) { | 7863 !isolate->MayAccess(handle(isolate->context()), current)) { |
| 7859 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { | 7864 if (iter.IsAtEnd(PrototypeIterator::END_AT_NON_HIDDEN)) { |
| 7860 isolate->ReportFailedAccessCheck(current); | 7865 isolate->ReportFailedAccessCheck(current); |
| 7861 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); | 7866 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); |
| 7862 } | 7867 } |
| 7863 break; | 7868 break; |
| 7864 } | 7869 } |
| 7865 | 7870 |
| 7866 JSObject::CollectOwnElementKeys(current, &accumulator, | 7871 JSObject::CollectOwnElementKeys(current, &accumulator, attr_filter); |
| 7867 static_cast<PropertyAttributes>(DONT_ENUM)); | |
| 7868 | 7872 |
| 7869 // Add the element keys from the interceptor. | 7873 // Add the element keys from the interceptor. |
| 7870 if (current->HasIndexedInterceptor()) { | 7874 if (current->HasIndexedInterceptor()) { |
| 7871 Handle<JSObject> result; | 7875 Handle<JSObject> result; |
| 7872 if (JSObject::GetKeysForIndexedInterceptor(current, object) | 7876 if (JSObject::GetKeysForIndexedInterceptor(current, object) |
| 7873 .ToHandle(&result)) { | 7877 .ToHandle(&result)) { |
| 7874 accumulator.AddElementKeysFromInterceptor(result); | 7878 accumulator.AddElementKeysFromInterceptor(result); |
| 7875 } | 7879 } |
| 7876 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); | 7880 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, FixedArray); |
| 7877 } | 7881 } |
| 7878 | 7882 |
| 7879 if (filter == SKIP_SYMBOLS) { | 7883 if (filter == SKIP_SYMBOLS) { |
| 7884 if (enum_policy == IGNORE_ENUMERABILITY) UNIMPLEMENTED(); |
| 7885 |
| 7880 // We can cache the computed property keys if access checks are | 7886 // We can cache the computed property keys if access checks are |
| 7881 // not needed and no interceptors are involved. | 7887 // not needed and no interceptors are involved. |
| 7882 // | 7888 // |
| 7883 // We do not use the cache if the object has elements and | 7889 // We do not use the cache if the object has elements and |
| 7884 // therefore it does not make sense to cache the property names | 7890 // therefore it does not make sense to cache the property names |
| 7885 // for arguments objects. Arguments objects will always have | 7891 // for arguments objects. Arguments objects will always have |
| 7886 // elements. | 7892 // elements. |
| 7887 // Wrapped strings have elements, but don't have an elements | 7893 // Wrapped strings have elements, but don't have an elements |
| 7888 // array or dictionary. So the fast inline test for whether to | 7894 // array or dictionary. So the fast inline test for whether to |
| 7889 // use the cache says yes, so we should not create a cache. | 7895 // use the cache says yes, so we should not create a cache. |
| 7890 bool cache_enum_length = | 7896 bool cache_enum_length = |
| 7891 ((current->map()->GetConstructor() != *arguments_function) && | 7897 ((current->map()->GetConstructor() != *arguments_function) && |
| 7892 !current->IsJSValue() && !current->IsAccessCheckNeeded() && | 7898 !current->IsJSValue() && !current->IsAccessCheckNeeded() && |
| 7893 !current->HasNamedInterceptor() && | 7899 !current->HasNamedInterceptor() && |
| 7894 !current->HasIndexedInterceptor()); | 7900 !current->HasIndexedInterceptor()); |
| 7895 // Compute the property keys and cache them if possible. | 7901 // Compute the property keys and cache them if possible. |
| 7896 Handle<FixedArray> enum_keys = | 7902 Handle<FixedArray> enum_keys = |
| 7897 JSObject::GetEnumPropertyKeys(current, cache_enum_length); | 7903 JSObject::GetEnumPropertyKeys(current, cache_enum_length); |
| 7898 accumulator.AddKeys(enum_keys); | 7904 accumulator.AddKeys(enum_keys); |
| 7899 } else { | 7905 } else { |
| 7900 DCHECK(filter == INCLUDE_SYMBOLS); | 7906 DCHECK(filter == INCLUDE_SYMBOLS); |
| 7901 PropertyAttributes attr_filter = | |
| 7902 static_cast<PropertyAttributes>(DONT_ENUM | PRIVATE_SYMBOL); | |
| 7903 current->CollectOwnPropertyNames(&accumulator, attr_filter); | 7907 current->CollectOwnPropertyNames(&accumulator, attr_filter); |
| 7904 } | 7908 } |
| 7905 | 7909 |
| 7906 // Add the property keys from the interceptor. | 7910 // Add the property keys from the interceptor. |
| 7907 if (current->HasNamedInterceptor()) { | 7911 if (current->HasNamedInterceptor()) { |
| 7908 Handle<JSObject> result; | 7912 Handle<JSObject> result; |
| 7909 if (JSObject::GetKeysForNamedInterceptor(current, object) | 7913 if (JSObject::GetKeysForNamedInterceptor(current, object) |
| 7910 .ToHandle(&result)) { | 7914 .ToHandle(&result)) { |
| 7911 accumulator.AddKeys(result); | 7915 accumulator.AddKeys(result); |
| 7912 } | 7916 } |
| (...skipping 10210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 18123 if (cell->value() != *new_value) { | 18127 if (cell->value() != *new_value) { |
| 18124 cell->set_value(*new_value); | 18128 cell->set_value(*new_value); |
| 18125 Isolate* isolate = cell->GetIsolate(); | 18129 Isolate* isolate = cell->GetIsolate(); |
| 18126 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18130 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 18127 isolate, DependentCode::kPropertyCellChangedGroup); | 18131 isolate, DependentCode::kPropertyCellChangedGroup); |
| 18128 } | 18132 } |
| 18129 } | 18133 } |
| 18130 | 18134 |
| 18131 } // namespace internal | 18135 } // namespace internal |
| 18132 } // namespace v8 | 18136 } // namespace v8 |
| OLD | NEW |