Index: src/objects.cc |
diff --git a/src/objects.cc b/src/objects.cc |
index 98b3056eedf7e528247cf4624c63925aff438566..4fa4cbbaca55026cf0f1266a65f54b4d963620b3 100644 |
--- a/src/objects.cc |
+++ b/src/objects.cc |
@@ -763,17 +763,6 @@ MaybeHandle<Object> Object::GetProperty(LookupIterator* it) { |
} |
-#define STACK_CHECK(result_value) \ |
- do { \ |
- StackLimitCheck stack_check(isolate); \ |
- if (stack_check.HasOverflowed()) { \ |
- isolate->Throw(*isolate->factory()->NewRangeError( \ |
- MessageTemplate::kStackOverflow)); \ |
- return result_value; \ |
- } \ |
- } while (false) |
- |
- |
// static |
MaybeHandle<Object> JSProxy::GetProperty(Isolate* isolate, |
Handle<JSProxy> proxy, |
@@ -789,7 +778,7 @@ MaybeHandle<Object> JSProxy::GetProperty(Isolate* isolate, |
} |
DCHECK(!name->IsPrivate()); |
- STACK_CHECK(MaybeHandle<Object>()); |
+ STACK_CHECK(isolate, MaybeHandle<Object>()); |
Handle<Name> trap_name = isolate->factory()->get_string(); |
// 1. Assert: IsPropertyKey(P) is true. |
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
@@ -1002,7 +991,7 @@ MaybeHandle<Object> JSProxy::GetPrototype(Handle<JSProxy> proxy) { |
Isolate* isolate = proxy->GetIsolate(); |
Handle<String> trap_name = isolate->factory()->getPrototypeOf_string(); |
- STACK_CHECK(MaybeHandle<Object>()); |
+ STACK_CHECK(isolate, MaybeHandle<Object>()); |
// 1. Let handler be the value of the [[ProxyHandler]] internal slot. |
// 2. If handler is null, throw a TypeError exception. |
@@ -4849,7 +4838,7 @@ void JSProxy::Revoke(Handle<JSProxy> proxy) { |
Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy, |
Handle<Name> name) { |
DCHECK(!name->IsPrivate()); |
- STACK_CHECK(Nothing<bool>()); |
+ STACK_CHECK(isolate, Nothing<bool>()); |
// 1. (Assert) |
// 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
Handle<Object> handler(proxy->handler(), isolate); |
@@ -4918,7 +4907,7 @@ Maybe<bool> JSProxy::SetProperty(Handle<JSProxy> proxy, Handle<Name> name, |
LanguageMode language_mode) { |
DCHECK(!name->IsPrivate()); |
Isolate* isolate = proxy->GetIsolate(); |
- STACK_CHECK(Nothing<bool>()); |
+ STACK_CHECK(isolate, Nothing<bool>()); |
Factory* factory = isolate->factory(); |
Handle<String> trap_name = factory->set_string(); |
ShouldThrow should_throw = |
@@ -4989,7 +4978,7 @@ Maybe<bool> JSProxy::DeletePropertyOrElement(Handle<JSProxy> proxy, |
ShouldThrow should_throw = |
is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
Isolate* isolate = proxy->GetIsolate(); |
- STACK_CHECK(Nothing<bool>()); |
+ STACK_CHECK(isolate, Nothing<bool>()); |
Factory* factory = isolate->factory(); |
Handle<String> trap_name = factory->deleteProperty_string(); |
@@ -6893,7 +6882,7 @@ Maybe<bool> JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy, |
Handle<Object> key, |
PropertyDescriptor* desc, |
ShouldThrow should_throw) { |
- STACK_CHECK(Nothing<bool>()); |
+ STACK_CHECK(isolate, Nothing<bool>()); |
if (key->IsSymbol() && Handle<Symbol>::cast(key)->IsPrivate()) { |
return SetPrivateProperty(isolate, proxy, Handle<Symbol>::cast(key), desc, |
should_throw); |
@@ -7114,7 +7103,7 @@ Maybe<bool> JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, |
Handle<Name> name, |
PropertyDescriptor* desc) { |
DCHECK(!name->IsPrivate()); |
- STACK_CHECK(Nothing<bool>()); |
+ STACK_CHECK(isolate, Nothing<bool>()); |
Handle<String> trap_name = |
isolate->factory()->getOwnPropertyDescriptor_string(); |
@@ -7472,7 +7461,7 @@ Maybe<bool> JSReceiver::PreventExtensions(Handle<JSReceiver> object, |
Maybe<bool> JSProxy::PreventExtensions(Handle<JSProxy> proxy, |
ShouldThrow should_throw) { |
Isolate* isolate = proxy->GetIsolate(); |
- STACK_CHECK(Nothing<bool>()); |
+ STACK_CHECK(isolate, Nothing<bool>()); |
Factory* factory = isolate->factory(); |
Handle<String> trap_name = factory->preventExtensions_string(); |
@@ -7574,7 +7563,7 @@ Maybe<bool> JSReceiver::IsExtensible(Handle<JSReceiver> object) { |
Maybe<bool> JSProxy::IsExtensible(Handle<JSProxy> proxy) { |
Isolate* isolate = proxy->GetIsolate(); |
- STACK_CHECK(Nothing<bool>()); |
+ STACK_CHECK(isolate, Nothing<bool>()); |
Factory* factory = isolate->factory(); |
Handle<String> trap_name = factory->isExtensible_string(); |
@@ -7908,7 +7897,7 @@ MaybeHandle<JSObject> JSObjectWalkVisitor<ContextObject>::StructureWalk( |
ONLY_WRITABLE | ONLY_ENUMERABLE | ONLY_CONFIGURABLE); |
KeyAccumulator accumulator(isolate, OWN_ONLY, filter); |
accumulator.NextPrototype(); |
- copy->CollectOwnPropertyNames(&accumulator, filter); |
+ accumulator.CollectOwnPropertyNames(copy); |
Handle<FixedArray> names = accumulator.GetKeys(); |
for (int i = 0; i < names->length(); i++) { |
DCHECK(names->get(i)->IsName()); |
@@ -8215,13 +8204,6 @@ static bool ContainsOnlyValidKeys(Handle<FixedArray> array) { |
} |
-static Handle<FixedArray> ReduceFixedArrayTo( |
- Handle<FixedArray> array, int length) { |
- DCHECK_LE(length, array->length()); |
- if (array->length() == length) return array; |
- return array->GetIsolate()->factory()->CopyFixedArrayUpTo(array, length); |
-} |
- |
bool Map::OnlyHasSimpleProperties() { |
// Wrapped string elements aren't explicitly stored in the elements backing |
// store, but are loaded indirectly from the underlying string. |
@@ -8230,404 +8212,6 @@ bool Map::OnlyHasSimpleProperties() { |
!has_hidden_prototype() && !is_dictionary_map(); |
} |
-// static |
-Handle<FixedArray> JSObject::GetFastEnumPropertyKeys(Isolate* isolate, |
- Handle<JSObject> object) { |
- Handle<Map> map(object->map()); |
- bool cache_enum_length = map->OnlyHasSimpleProperties(); |
- |
- Handle<DescriptorArray> descs = |
- Handle<DescriptorArray>(map->instance_descriptors(), isolate); |
- int own_property_count = map->EnumLength(); |
- // If the enum length of the given map is set 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 ENUMERABLE_STRINGS. |
- if (own_property_count == kInvalidEnumCacheSentinel) { |
- own_property_count = |
- map->NumberOfDescribedProperties(OWN_DESCRIPTORS, ENUMERABLE_STRINGS); |
- } else { |
- DCHECK( |
- own_property_count == |
- map->NumberOfDescribedProperties(OWN_DESCRIPTORS, ENUMERABLE_STRINGS)); |
- } |
- |
- if (descs->HasEnumCache()) { |
- Handle<FixedArray> keys(descs->GetEnumCache(), isolate); |
- // In case the number of properties required in the enum are actually |
- // present, we can reuse the enum cache. Otherwise, this means that the |
- // enum cache was generated for a previous (smaller) version of the |
- // Descriptor Array. In that case we regenerate the enum cache. |
- if (own_property_count <= keys->length()) { |
- isolate->counters()->enum_cache_hits()->Increment(); |
- if (cache_enum_length) map->SetEnumLength(own_property_count); |
- return ReduceFixedArrayTo(keys, own_property_count); |
- } |
- } |
- |
- if (descs->IsEmpty()) { |
- isolate->counters()->enum_cache_hits()->Increment(); |
- if (cache_enum_length) map->SetEnumLength(0); |
- return isolate->factory()->empty_fixed_array(); |
- } |
- |
- isolate->counters()->enum_cache_misses()->Increment(); |
- |
- Handle<FixedArray> storage = |
- isolate->factory()->NewFixedArray(own_property_count); |
- Handle<FixedArray> indices = |
- isolate->factory()->NewFixedArray(own_property_count); |
- |
- int size = map->NumberOfOwnDescriptors(); |
- int index = 0; |
- |
- for (int i = 0; i < size; i++) { |
- PropertyDetails details = descs->GetDetails(i); |
- if (details.IsDontEnum()) continue; |
- Object* key = descs->GetKey(i); |
- if (key->IsSymbol()) continue; |
- storage->set(index, key); |
- if (!indices.is_null()) { |
- if (details.type() != DATA) { |
- indices = Handle<FixedArray>(); |
- } else { |
- FieldIndex field_index = FieldIndex::ForDescriptor(*map, i); |
- int load_by_field_index = field_index.GetLoadByFieldIndex(); |
- indices->set(index, Smi::FromInt(load_by_field_index)); |
- } |
- } |
- index++; |
- } |
- DCHECK(index == storage->length()); |
- |
- DescriptorArray::SetEnumCache(descs, isolate, storage, indices); |
- if (cache_enum_length) { |
- map->SetEnumLength(own_property_count); |
- } |
- return storage; |
-} |
- |
- |
-Handle<FixedArray> JSObject::GetEnumPropertyKeys(Handle<JSObject> object) { |
- Isolate* isolate = object->GetIsolate(); |
- if (object->HasFastProperties()) { |
- return GetFastEnumPropertyKeys(isolate, object); |
- } else if (object->IsJSGlobalObject()) { |
- Handle<GlobalDictionary> dictionary(object->global_dictionary()); |
- int length = dictionary->NumberOfEnumElements(); |
- if (length == 0) { |
- return isolate->factory()->empty_fixed_array(); |
- } |
- Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length); |
- dictionary->CopyEnumKeysTo(*storage); |
- return storage; |
- } else { |
- Handle<NameDictionary> dictionary(object->property_dictionary()); |
- int length = dictionary->NumberOfEnumElements(); |
- if (length == 0) { |
- return isolate->factory()->empty_fixed_array(); |
- } |
- Handle<FixedArray> storage = isolate->factory()->NewFixedArray(length); |
- dictionary->CopyEnumKeysTo(*storage); |
- return storage; |
- } |
-} |
- |
- |
-enum IndexedOrNamed { kIndexed, kNamed }; |
- |
- |
-// Returns |true| on success, |nothing| on exception. |
-template <class Callback, IndexedOrNamed type> |
-static Maybe<bool> GetKeysFromInterceptor(Isolate* isolate, |
- Handle<JSReceiver> receiver, |
- Handle<JSObject> object, |
- PropertyFilter filter, |
- KeyAccumulator* accumulator) { |
- if (type == kIndexed) { |
- if (!object->HasIndexedInterceptor()) return Just(true); |
- } else { |
- if (!object->HasNamedInterceptor()) return Just(true); |
- } |
- Handle<InterceptorInfo> interceptor(type == kIndexed |
- ? object->GetIndexedInterceptor() |
- : object->GetNamedInterceptor(), |
- isolate); |
- if ((filter & ONLY_ALL_CAN_READ) && !interceptor->all_can_read()) { |
- return Just(true); |
- } |
- PropertyCallbackArguments args(isolate, interceptor->data(), *receiver, |
- *object, Object::DONT_THROW); |
- Handle<JSObject> result; |
- if (!interceptor->enumerator()->IsUndefined()) { |
- Callback enum_fun = v8::ToCData<Callback>(interceptor->enumerator()); |
- const char* log_tag = type == kIndexed ? "interceptor-indexed-enum" |
- : "interceptor-named-enum"; |
- LOG(isolate, ApiObjectAccess(log_tag, *object)); |
- result = args.Call(enum_fun); |
- } |
- RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
- if (result.is_null()) return Just(true); |
- DCHECK(result->IsJSArray() || result->HasSloppyArgumentsElements()); |
- // The accumulator takes care of string/symbol filtering. |
- if (type == kIndexed) { |
- accumulator->AddElementKeysFromInterceptor(result); |
- } else { |
- accumulator->AddKeys(result, DO_NOT_CONVERT); |
- } |
- return Just(true); |
-} |
- |
- |
-// Returns |true| on success, |false| if prototype walking should be stopped, |
-// |nothing| if an exception was thrown. |
-static Maybe<bool> GetKeysFromJSObject(Isolate* isolate, |
- Handle<JSReceiver> receiver, |
- Handle<JSObject> object, |
- PropertyFilter* filter, |
- KeyCollectionType type, |
- KeyAccumulator* accumulator) { |
- accumulator->NextPrototype(); |
- // Check access rights if required. |
- if (object->IsAccessCheckNeeded() && |
- !isolate->MayAccess(handle(isolate->context()), object)) { |
- // The cross-origin spec says that [[Enumerate]] shall return an empty |
- // iterator when it doesn't have access... |
- if (type == INCLUDE_PROTOS) { |
- return Just(false); |
- } |
- // ...whereas [[OwnPropertyKeys]] shall return whitelisted properties. |
- DCHECK_EQ(OWN_ONLY, type); |
- *filter = static_cast<PropertyFilter>(*filter | ONLY_ALL_CAN_READ); |
- } |
- |
- JSObject::CollectOwnElementKeys(object, accumulator, *filter); |
- |
- // Add the element keys from the interceptor. |
- Maybe<bool> success = |
- GetKeysFromInterceptor<v8::IndexedPropertyEnumeratorCallback, kIndexed>( |
- isolate, receiver, object, *filter, accumulator); |
- MAYBE_RETURN(success, Nothing<bool>()); |
- |
- if (*filter == ENUMERABLE_STRINGS) { |
- Handle<FixedArray> enum_keys = JSObject::GetEnumPropertyKeys(object); |
- accumulator->AddKeys(enum_keys, DO_NOT_CONVERT); |
- } else { |
- object->CollectOwnPropertyNames(accumulator, *filter); |
- } |
- |
- // Add the property keys from the interceptor. |
- success = GetKeysFromInterceptor<v8::GenericNamedPropertyEnumeratorCallback, |
- kNamed>(isolate, receiver, object, *filter, |
- accumulator); |
- MAYBE_RETURN(success, Nothing<bool>()); |
- return Just(true); |
-} |
- |
- |
-// Helper function for JSReceiver::GetKeys() below. Can be called recursively. |
-// Returns |true| or |nothing|. |
-static Maybe<bool> GetKeys_Internal(Isolate* isolate, |
- Handle<JSReceiver> receiver, |
- Handle<JSReceiver> object, |
- KeyCollectionType type, |
- PropertyFilter filter, |
- KeyAccumulator* accumulator) { |
- // Proxies have no hidden prototype and we should not trigger the |
- // [[GetPrototypeOf]] trap on the last iteration when using |
- // AdvanceFollowingProxies. |
- if (type == OWN_ONLY && object->IsJSProxy()) { |
- MAYBE_RETURN(JSProxy::OwnPropertyKeys(isolate, receiver, |
- Handle<JSProxy>::cast(object), filter, |
- accumulator), |
- Nothing<bool>()); |
- return Just(true); |
- } |
- |
- PrototypeIterator::WhereToEnd end = type == OWN_ONLY |
- ? PrototypeIterator::END_AT_NON_HIDDEN |
- : PrototypeIterator::END_AT_NULL; |
- for (PrototypeIterator iter(isolate, object, |
- PrototypeIterator::START_AT_RECEIVER, end); |
- !iter.IsAtEnd();) { |
- Handle<JSReceiver> current = |
- PrototypeIterator::GetCurrent<JSReceiver>(iter); |
- Maybe<bool> result = Just(false); // Dummy initialization. |
- if (current->IsJSProxy()) { |
- result = JSProxy::OwnPropertyKeys(isolate, receiver, |
- Handle<JSProxy>::cast(current), filter, |
- accumulator); |
- } else { |
- DCHECK(current->IsJSObject()); |
- result = GetKeysFromJSObject(isolate, receiver, |
- Handle<JSObject>::cast(current), &filter, |
- type, accumulator); |
- } |
- MAYBE_RETURN(result, Nothing<bool>()); |
- if (!result.FromJust()) break; // |false| means "stop iterating". |
- // Iterate through proxies but ignore access checks for the ALL_CAN_READ |
- // case on API objects for OWN_ONLY keys handlede in GgetKeysFromJSObject. |
- if (!iter.AdvanceFollowingProxiesIgnoringAccessChecks()) { |
- return Nothing<bool>(); |
- } |
- } |
- return Just(true); |
-} |
- |
- |
-// ES6 9.5.12 |
-// Returns |true| on success, |nothing| in case of exception. |
-// static |
-Maybe<bool> JSProxy::OwnPropertyKeys(Isolate* isolate, |
- Handle<JSReceiver> receiver, |
- Handle<JSProxy> proxy, |
- PropertyFilter filter, |
- KeyAccumulator* accumulator) { |
- STACK_CHECK(Nothing<bool>()); |
- // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
- Handle<Object> handler(proxy->handler(), isolate); |
- // 2. If handler is null, throw a TypeError exception. |
- // 3. Assert: Type(handler) is Object. |
- if (proxy->IsRevoked()) { |
- isolate->Throw(*isolate->factory()->NewTypeError( |
- MessageTemplate::kProxyRevoked, isolate->factory()->ownKeys_string())); |
- return Nothing<bool>(); |
- } |
- // 4. Let target be the value of the [[ProxyTarget]] internal slot of O. |
- Handle<JSReceiver> target(proxy->target(), isolate); |
- // 5. Let trap be ? GetMethod(handler, "ownKeys"). |
- Handle<Object> trap; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate, trap, Object::GetMethod(Handle<JSReceiver>::cast(handler), |
- isolate->factory()->ownKeys_string()), |
- Nothing<bool>()); |
- // 6. If trap is undefined, then |
- if (trap->IsUndefined()) { |
- // 6a. Return target.[[OwnPropertyKeys]](). |
- return GetKeys_Internal(isolate, receiver, target, OWN_ONLY, filter, |
- accumulator); |
- } |
- // 7. Let trapResultArray be Call(trap, handler, «target»). |
- Handle<Object> trap_result_array; |
- Handle<Object> args[] = {target}; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate, trap_result_array, |
- Execution::Call(isolate, trap, handler, arraysize(args), args), |
- Nothing<bool>()); |
- // 8. Let trapResult be ? CreateListFromArrayLike(trapResultArray, |
- // «String, Symbol»). |
- Handle<FixedArray> trap_result; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
- isolate, trap_result, |
- Object::CreateListFromArrayLike(isolate, trap_result_array, |
- ElementTypes::kStringAndSymbol), |
- Nothing<bool>()); |
- // 9. Let extensibleTarget be ? IsExtensible(target). |
- Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target); |
- MAYBE_RETURN(maybe_extensible, Nothing<bool>()); |
- bool extensible_target = maybe_extensible.FromJust(); |
- // 10. Let targetKeys be ? target.[[OwnPropertyKeys]](). |
- Handle<FixedArray> target_keys; |
- ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, target_keys, |
- JSReceiver::OwnPropertyKeys(target), |
- Nothing<bool>()); |
- // 11. (Assert) |
- // 12. Let targetConfigurableKeys be an empty List. |
- // To save memory, we're re-using target_keys and will modify it in-place. |
- Handle<FixedArray> target_configurable_keys = target_keys; |
- // 13. Let targetNonconfigurableKeys be an empty List. |
- Handle<FixedArray> target_nonconfigurable_keys = |
- isolate->factory()->NewFixedArray(target_keys->length()); |
- int nonconfigurable_keys_length = 0; |
- // 14. Repeat, for each element key of targetKeys: |
- for (int i = 0; i < target_keys->length(); ++i) { |
- // 14a. Let desc be ? target.[[GetOwnProperty]](key). |
- PropertyDescriptor desc; |
- Maybe<bool> found = JSReceiver::GetOwnPropertyDescriptor( |
- isolate, target, handle(target_keys->get(i), isolate), &desc); |
- MAYBE_RETURN(found, Nothing<bool>()); |
- // 14b. If desc is not undefined and desc.[[Configurable]] is false, then |
- if (found.FromJust() && !desc.configurable()) { |
- // 14b i. Append key as an element of targetNonconfigurableKeys. |
- target_nonconfigurable_keys->set(nonconfigurable_keys_length, |
- target_keys->get(i)); |
- nonconfigurable_keys_length++; |
- // The key was moved, null it out in the original list. |
- target_keys->set(i, Smi::FromInt(0)); |
- } else { |
- // 14c. Else, |
- // 14c i. Append key as an element of targetConfigurableKeys. |
- // (No-op, just keep it in |target_keys|.) |
- } |
- } |
- accumulator->NextPrototype(); // Prepare for accumulating keys. |
- // 15. If extensibleTarget is true and targetNonconfigurableKeys is empty, |
- // then: |
- if (extensible_target && nonconfigurable_keys_length == 0) { |
- // 15a. Return trapResult. |
- return accumulator->AddKeysFromProxy(proxy, trap_result); |
- } |
- // 16. Let uncheckedResultKeys be a new List which is a copy of trapResult. |
- Zone set_zone(isolate->allocator()); |
- const int kPresent = 1; |
- const int kGone = 0; |
- IdentityMap<int> unchecked_result_keys(isolate->heap(), &set_zone); |
- int unchecked_result_keys_size = 0; |
- for (int i = 0; i < trap_result->length(); ++i) { |
- DCHECK(trap_result->get(i)->IsUniqueName()); |
- Object* key = trap_result->get(i); |
- int* entry = unchecked_result_keys.Get(key); |
- if (*entry != kPresent) { |
- *entry = kPresent; |
- unchecked_result_keys_size++; |
- } |
- } |
- // 17. Repeat, for each key that is an element of targetNonconfigurableKeys: |
- for (int i = 0; i < nonconfigurable_keys_length; ++i) { |
- Object* key = target_nonconfigurable_keys->get(i); |
- // 17a. If key is not an element of uncheckedResultKeys, throw a |
- // TypeError exception. |
- int* found = unchecked_result_keys.Find(key); |
- if (found == nullptr || *found == kGone) { |
- isolate->Throw(*isolate->factory()->NewTypeError( |
- MessageTemplate::kProxyOwnKeysMissing, handle(key, isolate))); |
- return Nothing<bool>(); |
- } |
- // 17b. Remove key from uncheckedResultKeys. |
- *found = kGone; |
- unchecked_result_keys_size--; |
- } |
- // 18. If extensibleTarget is true, return trapResult. |
- if (extensible_target) { |
- return accumulator->AddKeysFromProxy(proxy, trap_result); |
- } |
- // 19. Repeat, for each key that is an element of targetConfigurableKeys: |
- for (int i = 0; i < target_configurable_keys->length(); ++i) { |
- Object* key = target_configurable_keys->get(i); |
- if (key->IsSmi()) continue; // Zapped entry, was nonconfigurable. |
- // 19a. If key is not an element of uncheckedResultKeys, throw a |
- // TypeError exception. |
- int* found = unchecked_result_keys.Find(key); |
- if (found == nullptr || *found == kGone) { |
- isolate->Throw(*isolate->factory()->NewTypeError( |
- MessageTemplate::kProxyOwnKeysMissing, handle(key, isolate))); |
- return Nothing<bool>(); |
- } |
- // 19b. Remove key from uncheckedResultKeys. |
- *found = kGone; |
- unchecked_result_keys_size--; |
- } |
- // 20. If uncheckedResultKeys is not empty, throw a TypeError exception. |
- if (unchecked_result_keys_size != 0) { |
- DCHECK_GT(unchecked_result_keys_size, 0); |
- isolate->Throw(*isolate->factory()->NewTypeError( |
- MessageTemplate::kProxyOwnKeysNonExtensible)); |
- return Nothing<bool>(); |
- } |
- // 21. Return trapResult. |
- return accumulator->AddKeysFromProxy(proxy, trap_result); |
-} |
- |
MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, |
KeyCollectionType type, |
PropertyFilter filter, |
@@ -8637,9 +8221,8 @@ MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, |
Isolate* isolate = object->GetIsolate(); |
KeyAccumulator accumulator(isolate, type, filter); |
accumulator.set_filter_proxy_keys(filter_proxy_keys); |
- MAYBE_RETURN( |
- GetKeys_Internal(isolate, object, object, type, filter, &accumulator), |
- MaybeHandle<FixedArray>()); |
+ MAYBE_RETURN(accumulator.GetKeys_Internal(object, object, type), |
+ MaybeHandle<FixedArray>()); |
Handle<FixedArray> keys = accumulator.GetKeys(keys_conversion); |
DCHECK(ContainsOnlyValidKeys(keys)); |
return keys; |
@@ -8736,8 +8319,7 @@ MaybeHandle<FixedArray> GetOwnValuesOrEntries(Isolate* isolate, |
PropertyFilter key_filter = |
static_cast<PropertyFilter>(filter & ~ONLY_ENUMERABLE); |
KeyAccumulator accumulator(isolate, OWN_ONLY, key_filter); |
- MAYBE_RETURN(GetKeys_Internal(isolate, object, object, OWN_ONLY, key_filter, |
- &accumulator), |
+ MAYBE_RETURN(accumulator.GetKeys_Internal(object, object, OWN_ONLY), |
MaybeHandle<FixedArray>()); |
Handle<FixedArray> keys = accumulator.GetKeys(CONVERT_TO_STRING); |
DCHECK(ContainsOnlyValidKeys(keys)); |
@@ -14814,7 +14396,7 @@ Maybe<bool> JSProxy::SetPrototype(Handle<JSProxy> proxy, Handle<Object> value, |
bool from_javascript, |
ShouldThrow should_throw) { |
Isolate* isolate = proxy->GetIsolate(); |
- STACK_CHECK(Nothing<bool>()); |
+ STACK_CHECK(isolate, Nothing<bool>()); |
Handle<Name> trap_name = isolate->factory()->setPrototypeOf_string(); |
// 1. Assert: Either Type(V) is Object or Type(V) is Null. |
DCHECK(value->IsJSReceiver() || value->IsNull()); |
@@ -15665,31 +15247,6 @@ void FixedArray::SortPairs(FixedArray* numbers, uint32_t len) { |
} |
} |
-void JSObject::CollectOwnPropertyNames(KeyAccumulator* keys, |
- PropertyFilter filter) { |
- if (HasFastProperties()) { |
- int real_size = map()->NumberOfOwnDescriptors(); |
- Handle<DescriptorArray> descs(map()->instance_descriptors()); |
- for (int i = 0; i < real_size; i++) { |
- PropertyDetails details = descs->GetDetails(i); |
- if ((details.attributes() & filter) != 0) continue; |
- if (filter & ONLY_ALL_CAN_READ) { |
- if (details.kind() != kAccessor) continue; |
- Object* accessors = descs->GetValue(i); |
- if (!accessors->IsAccessorInfo()) continue; |
- if (!AccessorInfo::cast(accessors)->all_can_read()) continue; |
- } |
- Name* key = descs->GetKey(i); |
- if (key->FilterKey(filter)) continue; |
- keys->AddKey(key, DO_NOT_CONVERT); |
- } |
- } else if (IsJSGlobalObject()) { |
- GlobalDictionary::CollectKeysTo(handle(global_dictionary()), keys, filter); |
- } else { |
- NameDictionary::CollectKeysTo(handle(property_dictionary()), keys, filter); |
- } |
-} |
- |
bool JSObject::WasConstructedFromApiFunction() { |
auto instance_type = map()->instance_type(); |
bool is_api_object = instance_type == JS_API_OBJECT_TYPE || |
@@ -15709,15 +15266,6 @@ bool JSObject::WasConstructedFromApiFunction() { |
return is_api_object; |
} |
-void JSObject::CollectOwnElementKeys(Handle<JSObject> object, |
- KeyAccumulator* keys, |
- PropertyFilter filter) { |
- if (filter & SKIP_STRINGS) return; |
- ElementsAccessor* accessor = object->GetElementsAccessor(); |
- accessor->CollectElementIndices(object, keys, kMaxUInt32, filter, 0); |
-} |
- |
- |
MaybeHandle<String> Object::ObjectProtoToString(Isolate* isolate, |
Handle<Object> object) { |
if (object->IsUndefined()) return isolate->factory()->undefined_to_string(); |
@@ -16570,6 +16118,30 @@ template int HashTable<SeededNumberDictionary, SeededNumberDictionaryShape, |
template int NameDictionaryBase<NameDictionary, NameDictionaryShape>::FindEntry( |
Handle<Name>); |
+template int Dictionary<GlobalDictionary, GlobalDictionaryShape, Handle<Name>>:: |
+ NumberOfElementsFilterAttributes(PropertyFilter filter); |
+ |
+template int Dictionary<NameDictionary, NameDictionaryShape, Handle<Name>>:: |
+ NumberOfElementsFilterAttributes(PropertyFilter filter); |
+ |
+template void Dictionary<GlobalDictionary, GlobalDictionaryShape, |
+ Handle<Name>>::CopyEnumKeysTo(FixedArray* storage); |
+ |
+template void Dictionary<NameDictionary, NameDictionaryShape, |
+ Handle<Name>>::CopyEnumKeysTo(FixedArray* storage); |
+ |
+template void |
+Dictionary<GlobalDictionary, GlobalDictionaryShape, Handle<Name>>:: |
+ CollectKeysTo(Handle<Dictionary<GlobalDictionary, GlobalDictionaryShape, |
+ Handle<Name>>> |
+ dictionary, |
+ KeyAccumulator* keys, PropertyFilter filter); |
+ |
+template void |
+Dictionary<NameDictionary, NameDictionaryShape, Handle<Name>>::CollectKeysTo( |
+ Handle<Dictionary<NameDictionary, NameDictionaryShape, Handle<Name>>> |
+ dictionary, |
+ KeyAccumulator* keys, PropertyFilter filter); |
Handle<Object> JSObject::PrepareSlowElementsForSort( |
Handle<JSObject> object, uint32_t limit) { |