Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: src/objects.cc

Issue 1488873003: [proxies] Implement Symbol/DONT_ENUM filtering for GetKeys() (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: moved filtering into KeyAccumulator Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime-object.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 4768 matching lines...) Expand 10 before | Expand all | Expand 10 after
4779 } 4779 }
4780 4780
4781 return JSObject::GetFunctionRealm(Handle<JSObject>::cast(receiver)); 4781 return JSObject::GetFunctionRealm(Handle<JSObject>::cast(receiver));
4782 } 4782 }
4783 4783
4784 4784
4785 Maybe<PropertyAttributes> JSProxy::GetPropertyAttributes(LookupIterator* it) { 4785 Maybe<PropertyAttributes> JSProxy::GetPropertyAttributes(LookupIterator* it) {
4786 Isolate* isolate = it->isolate(); 4786 Isolate* isolate = it->isolate();
4787 HandleScope scope(isolate); 4787 HandleScope scope(isolate);
4788 PropertyDescriptor desc; 4788 PropertyDescriptor desc;
4789 bool found = JSProxy::GetOwnPropertyDescriptor(it, &desc); 4789 bool found = JSProxy::GetOwnPropertyDescriptor(
4790 isolate, it->GetHolder<JSProxy>(), it->GetName(), &desc);
4790 if (isolate->has_pending_exception()) return Nothing<PropertyAttributes>(); 4791 if (isolate->has_pending_exception()) return Nothing<PropertyAttributes>();
4791 if (!found) return Just(ABSENT); 4792 if (!found) return Just(ABSENT);
4792 return Just(desc.ToAttributes()); 4793 return Just(desc.ToAttributes());
4793 } 4794 }
4794 4795
4795 4796
4796 MaybeHandle<Object> JSProxy::GetTrap(Handle<JSProxy> proxy, 4797 MaybeHandle<Object> JSProxy::GetTrap(Handle<JSProxy> proxy,
4797 Handle<String> trap) { 4798 Handle<String> trap) {
4798 DCHECK(!proxy->IsRevoked()); 4799 DCHECK(!proxy->IsRevoked());
4799 Isolate* isolate = proxy->GetIsolate(); 4800 Isolate* isolate = proxy->GetIsolate();
(...skipping 2093 matching lines...) Expand 10 before | Expand all | Expand 10 after
6893 6894
6894 6895
6895 // TODO(jkummerow): Any chance to unify this with 6896 // TODO(jkummerow): Any chance to unify this with
6896 // "MaybeHandle<Object> GetOwnProperty()" in runtime-object.cc? 6897 // "MaybeHandle<Object> GetOwnProperty()" in runtime-object.cc?
6897 6898
6898 // ES6 9.1.5.1 6899 // ES6 9.1.5.1
6899 // Returns true on success; false if there was an exception or no property. 6900 // Returns true on success; false if there was an exception or no property.
6900 // static 6901 // static
6901 bool JSReceiver::GetOwnPropertyDescriptor(LookupIterator* it, 6902 bool JSReceiver::GetOwnPropertyDescriptor(LookupIterator* it,
6902 PropertyDescriptor* desc) { 6903 PropertyDescriptor* desc) {
6904 Isolate* isolate = it->isolate();
6903 // "Virtual" dispatch. 6905 // "Virtual" dispatch.
6904 if (it->IsFound() && it->GetHolder<JSReceiver>()->IsJSProxy()) { 6906 if (it->IsFound() && it->GetHolder<JSReceiver>()->IsJSProxy()) {
6905 return JSProxy::GetOwnPropertyDescriptor(it, desc); 6907 return JSProxy::GetOwnPropertyDescriptor(isolate, it->GetHolder<JSProxy>(),
6908 it->GetName(), desc);
6906 } 6909 }
6907 6910
6908 Isolate* isolate = it->isolate();
6909 // 1. (Assert) 6911 // 1. (Assert)
6910 // 2. If O does not have an own property with key P, return undefined. 6912 // 2. If O does not have an own property with key P, return undefined.
6911 Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(it); 6913 Maybe<PropertyAttributes> maybe = JSObject::GetPropertyAttributes(it);
6912 6914
6913 if (!maybe.IsJust()) return false; 6915 if (!maybe.IsJust()) return false;
6914 PropertyAttributes attrs = maybe.FromJust(); 6916 PropertyAttributes attrs = maybe.FromJust();
6915 if (attrs == ABSENT) return false; 6917 if (attrs == ABSENT) return false;
6916 DCHECK(!isolate->has_pending_exception()); 6918 DCHECK(!isolate->has_pending_exception());
6917 6919
6918 // 3. Let D be a newly created Property Descriptor with no fields. 6920 // 3. Let D be a newly created Property Descriptor with no fields.
(...skipping 28 matching lines...) Expand all
6947 desc->set_configurable((attrs & DONT_DELETE) == 0); 6949 desc->set_configurable((attrs & DONT_DELETE) == 0);
6948 // 9. Return D. 6950 // 9. Return D.
6949 DCHECK(PropertyDescriptor::IsAccessorDescriptor(desc) != 6951 DCHECK(PropertyDescriptor::IsAccessorDescriptor(desc) !=
6950 PropertyDescriptor::IsDataDescriptor(desc)); 6952 PropertyDescriptor::IsDataDescriptor(desc));
6951 return true; 6953 return true;
6952 } 6954 }
6953 6955
6954 6956
6955 // ES6 9.5.5 6957 // ES6 9.5.5
6956 // static 6958 // static
6957 bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it, 6959 bool JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, Handle<JSProxy> proxy,
6960 Handle<Name> name,
6958 PropertyDescriptor* desc) { 6961 PropertyDescriptor* desc) {
6959 Handle<JSProxy> proxy = it->GetHolder<JSProxy>();
6960 Isolate* isolate = it->isolate();
6961 Handle<String> trap_name = 6962 Handle<String> trap_name =
6962 isolate->factory()->getOwnPropertyDescriptor_string(); 6963 isolate->factory()->getOwnPropertyDescriptor_string();
6963 Handle<Name> property_name = it->GetName();
6964 // 1. (Assert) 6964 // 1. (Assert)
6965 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. 6965 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
6966 Handle<Object> handler(proxy->handler(), isolate); 6966 Handle<Object> handler(proxy->handler(), isolate);
6967 // 3. If handler is null, throw a TypeError exception. 6967 // 3. If handler is null, throw a TypeError exception.
6968 if (proxy->IsRevoked()) { 6968 if (proxy->IsRevoked()) {
6969 isolate->Throw(*isolate->factory()->NewTypeError( 6969 isolate->Throw(*isolate->factory()->NewTypeError(
6970 MessageTemplate::kProxyRevoked, trap_name)); 6970 MessageTemplate::kProxyRevoked, trap_name));
6971 return false; 6971 return false;
6972 } 6972 }
6973 // 4. Assert: Type(handler) is Object. 6973 // 4. Assert: Type(handler) is Object.
6974 DCHECK(handler->IsJSReceiver()); 6974 DCHECK(handler->IsJSReceiver());
6975 // If the handler is not null, the target can't be null either. 6975 // If the handler is not null, the target can't be null either.
6976 DCHECK(it->GetHolder<JSProxy>()->target()->IsJSReceiver()); 6976 DCHECK(proxy->target()->IsJSReceiver());
6977 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. 6977 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
6978 Handle<JSReceiver> target( 6978 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
6979 JSReceiver::cast(it->GetHolder<JSProxy>()->target()), isolate);
6980 // 6. Let trap be ? GetMethod(handler, "getOwnPropertyDescriptor"). 6979 // 6. Let trap be ? GetMethod(handler, "getOwnPropertyDescriptor").
6981 Handle<Object> trap; 6980 Handle<Object> trap;
6982 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 6981 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
6983 isolate, trap, 6982 isolate, trap,
6984 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), false); 6983 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), false);
6985 // 7. If trap is undefined, then 6984 // 7. If trap is undefined, then
6986 if (trap->IsUndefined()) { 6985 if (trap->IsUndefined()) {
6987 // 7a. Return target.[[GetOwnProperty]](P). 6986 // 7a. Return target.[[GetOwnProperty]](P).
6988 return JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name, 6987 return JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, desc);
6989 desc);
6990 } 6988 }
6991 // 8. Let trapResultObj be ? Call(trap, handler, «target, P»). 6989 // 8. Let trapResultObj be ? Call(trap, handler, «target, P»).
6992 Handle<Object> trap_result_obj; 6990 Handle<Object> trap_result_obj;
6993 Handle<Object> args[] = {target, property_name}; 6991 Handle<Object> args[] = {target, name};
6994 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 6992 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
6995 isolate, trap_result_obj, 6993 isolate, trap_result_obj,
6996 Execution::Call(isolate, trap, handler, arraysize(args), args), false); 6994 Execution::Call(isolate, trap, handler, arraysize(args), args), false);
6997 // 9. If Type(trapResultObj) is neither Object nor Undefined, throw a 6995 // 9. If Type(trapResultObj) is neither Object nor Undefined, throw a
6998 // TypeError exception. 6996 // TypeError exception.
6999 if (!trap_result_obj->IsJSReceiver() && !trap_result_obj->IsUndefined()) { 6997 if (!trap_result_obj->IsJSReceiver() && !trap_result_obj->IsUndefined()) {
7000 isolate->Throw(*isolate->factory()->NewTypeError( 6998 isolate->Throw(*isolate->factory()->NewTypeError(
7001 MessageTemplate::kProxyHandlerReturned, handler, trap_result_obj, 6999 MessageTemplate::kProxyHandlerReturned, handler, trap_result_obj,
7002 property_name)); 7000 name));
7003 return false; 7001 return false;
7004 } 7002 }
7005 // 10. Let targetDesc be ? target.[[GetOwnProperty]](P). 7003 // 10. Let targetDesc be ? target.[[GetOwnProperty]](P).
7006 PropertyDescriptor target_desc; 7004 PropertyDescriptor target_desc;
7007 JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name, 7005 JSReceiver::GetOwnPropertyDescriptor(isolate, target, name, &target_desc);
7008 &target_desc);
7009 if (isolate->has_pending_exception()) return false; 7006 if (isolate->has_pending_exception()) return false;
7010 // 11. If trapResultObj is undefined, then 7007 // 11. If trapResultObj is undefined, then
7011 if (trap_result_obj->IsUndefined()) { 7008 if (trap_result_obj->IsUndefined()) {
7012 // 11a. If targetDesc is undefined, return undefined. 7009 // 11a. If targetDesc is undefined, return undefined.
7013 if (target_desc.is_empty()) return false; 7010 if (target_desc.is_empty()) return false;
7014 // 11b. If targetDesc.[[Configurable]] is false, throw a TypeError 7011 // 11b. If targetDesc.[[Configurable]] is false, throw a TypeError
7015 // exception. 7012 // exception.
7016 if (!target_desc.configurable()) { 7013 if (!target_desc.configurable()) {
7017 isolate->Throw(*isolate->factory()->NewTypeError( 7014 isolate->Throw(*isolate->factory()->NewTypeError(
7018 MessageTemplate::kProxyTargetPropNotConfigurable, property_name)); 7015 MessageTemplate::kProxyTargetPropNotConfigurable, name));
7019 return false; 7016 return false;
7020 } 7017 }
7021 // 11c. Let extensibleTarget be ? IsExtensible(target). 7018 // 11c. Let extensibleTarget be ? IsExtensible(target).
7022 Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target); 7019 Maybe<bool> maybe_extensible = JSReceiver::IsExtensible(target);
7023 if (maybe_extensible.IsNothing()) return false; 7020 if (maybe_extensible.IsNothing()) return false;
7024 bool extensible_target = maybe_extensible.FromJust(); 7021 bool extensible_target = maybe_extensible.FromJust();
7025 // 11d. (Assert) 7022 // 11d. (Assert)
7026 // 11e. If extensibleTarget is false, throw a TypeError exception. 7023 // 11e. If extensibleTarget is false, throw a TypeError exception.
7027 if (!extensible_target) { 7024 if (!extensible_target) {
7028 isolate->Throw(*isolate->factory()->NewTypeError( 7025 isolate->Throw(*isolate->factory()->NewTypeError(
(...skipping 11 matching lines...) Expand all
7040 if (!PropertyDescriptor::ToPropertyDescriptor(isolate, trap_result_obj, 7037 if (!PropertyDescriptor::ToPropertyDescriptor(isolate, trap_result_obj,
7041 desc)) { 7038 desc)) {
7042 DCHECK(isolate->has_pending_exception()); 7039 DCHECK(isolate->has_pending_exception());
7043 return false; 7040 return false;
7044 } 7041 }
7045 // 14. Call CompletePropertyDescriptor(resultDesc). 7042 // 14. Call CompletePropertyDescriptor(resultDesc).
7046 PropertyDescriptor::CompletePropertyDescriptor(isolate, desc); 7043 PropertyDescriptor::CompletePropertyDescriptor(isolate, desc);
7047 // 15. Let valid be IsCompatiblePropertyDescriptor (extensibleTarget, 7044 // 15. Let valid be IsCompatiblePropertyDescriptor (extensibleTarget,
7048 // resultDesc, targetDesc). 7045 // resultDesc, targetDesc).
7049 bool valid = IsCompatiblePropertyDescriptor(isolate, extensible_target, desc, 7046 bool valid = IsCompatiblePropertyDescriptor(isolate, extensible_target, desc,
7050 &target_desc, property_name); 7047 &target_desc, name);
7051 // 16. If valid is false, throw a TypeError exception. 7048 // 16. If valid is false, throw a TypeError exception.
7052 if (!valid) { 7049 if (!valid) {
7053 DCHECK(isolate->has_pending_exception()); 7050 DCHECK(isolate->has_pending_exception());
7054 return false; 7051 return false;
7055 } 7052 }
7056 // 17. If resultDesc.[[Configurable]] is false, then 7053 // 17. If resultDesc.[[Configurable]] is false, then
7057 if (!desc->configurable()) { 7054 if (!desc->configurable()) {
7058 // 17a. If targetDesc is undefined or targetDesc.[[Configurable]] is true: 7055 // 17a. If targetDesc is undefined or targetDesc.[[Configurable]] is true:
7059 if (target_desc.is_empty() || target_desc.configurable()) { 7056 if (target_desc.is_empty() || target_desc.configurable()) {
7060 // 17a i. Throw a TypeError exception. 7057 // 17a i. Throw a TypeError exception.
7061 isolate->Throw(*isolate->factory()->NewTypeError( 7058 isolate->Throw(*isolate->factory()->NewTypeError(
7062 MessageTemplate::kRedefineDisallowed, property_name)); 7059 MessageTemplate::kRedefineDisallowed, name));
7063 return false; 7060 return false;
7064 } 7061 }
7065 } 7062 }
7066 // 18. Return resultDesc. 7063 // 18. Return resultDesc.
7067 return true; 7064 return true;
7068 } 7065 }
7069 7066
7070 7067
7071 bool JSObject::ReferencesObjectFromElements(FixedArray* elements, 7068 bool JSObject::ReferencesObjectFromElements(FixedArray* elements,
7072 ElementsKind kind, 7069 ElementsKind kind,
(...skipping 1215 matching lines...) Expand 10 before | Expand all | Expand 10 after
8288 list->set(index, *next); 8285 list->set(index, *next);
8289 // 7e. Set index to index + 1. (See loop header.) 8286 // 7e. Set index to index + 1. (See loop header.)
8290 } 8287 }
8291 // 8. Return list. 8288 // 8. Return list.
8292 return list; 8289 return list;
8293 } 8290 }
8294 8291
8295 8292
8296 // ES6 9.5.12 8293 // ES6 9.5.12
8297 // Returns "false" in case of exception. 8294 // Returns "false" in case of exception.
8298 // TODO(jkummerow): |filter| and |enum_policy| are currently ignored.
8299 // static 8295 // static
8300 bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, 8296 bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver,
8301 Handle<JSProxy> proxy, KeyFilter filter, 8297 Handle<JSProxy> proxy, KeyFilter filter,
8302 Enumerability enum_policy, 8298 Enumerability enum_policy,
8303 KeyAccumulator* accumulator) { 8299 KeyAccumulator* accumulator) {
8304 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. 8300 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
8305 Handle<Object> handler(proxy->handler(), isolate); 8301 Handle<Object> handler(proxy->handler(), isolate);
8306 // 2. If handler is null, throw a TypeError exception. 8302 // 2. If handler is null, throw a TypeError exception.
8307 if (proxy->IsRevoked()) { 8303 if (proxy->IsRevoked()) {
8308 isolate->Throw(*isolate->factory()->NewTypeError( 8304 isolate->Throw(*isolate->factory()->NewTypeError(
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
8375 // 14c. Else, 8371 // 14c. Else,
8376 // 14c i. Append key as an element of targetConfigurableKeys. 8372 // 14c i. Append key as an element of targetConfigurableKeys.
8377 // (No-op, just keep it in |target_keys|.) 8373 // (No-op, just keep it in |target_keys|.)
8378 } 8374 }
8379 } 8375 }
8380 accumulator->NextPrototype(); // Prepare for accumulating keys. 8376 accumulator->NextPrototype(); // Prepare for accumulating keys.
8381 // 15. If extensibleTarget is true and targetNonconfigurableKeys is empty, 8377 // 15. If extensibleTarget is true and targetNonconfigurableKeys is empty,
8382 // then: 8378 // then:
8383 if (extensible_target && nonconfigurable_keys_length == 0) { 8379 if (extensible_target && nonconfigurable_keys_length == 0) {
8384 // 15a. Return trapResult. 8380 // 15a. Return trapResult.
8385 accumulator->AddKeysFromProxy(trap_result); 8381 return accumulator->AddKeysFromProxy(proxy, trap_result, filter,
8386 return true; 8382 enum_policy);
8387 } 8383 }
8388 // 16. Let uncheckedResultKeys be a new List which is a copy of trapResult. 8384 // 16. Let uncheckedResultKeys be a new List which is a copy of trapResult.
8389 Zone set_zone; 8385 Zone set_zone;
8390 const int kPresent = 1; 8386 const int kPresent = 1;
8391 const int kGone = 0; 8387 const int kGone = 0;
8392 IdentityMap<int> unchecked_result_keys(isolate->heap(), &set_zone); 8388 IdentityMap<int> unchecked_result_keys(isolate->heap(), &set_zone);
8393 int unchecked_result_keys_size = trap_result->length(); 8389 int unchecked_result_keys_size = trap_result->length();
8394 for (int i = 0; i < trap_result->length(); ++i) { 8390 for (int i = 0; i < trap_result->length(); ++i) {
8395 DCHECK(trap_result->get(i)->IsUniqueName()); 8391 DCHECK(trap_result->get(i)->IsUniqueName());
8396 unchecked_result_keys.Set(trap_result->get(i), kPresent); 8392 unchecked_result_keys.Set(trap_result->get(i), kPresent);
8397 } 8393 }
8398 // 17. Repeat, for each key that is an element of targetNonconfigurableKeys: 8394 // 17. Repeat, for each key that is an element of targetNonconfigurableKeys:
8399 for (int i = 0; i < nonconfigurable_keys_length; ++i) { 8395 for (int i = 0; i < nonconfigurable_keys_length; ++i) {
8400 Object* key = target_nonconfigurable_keys->get(i); 8396 Object* key = target_nonconfigurable_keys->get(i);
8401 // 17a. If key is not an element of uncheckedResultKeys, throw a 8397 // 17a. If key is not an element of uncheckedResultKeys, throw a
8402 // TypeError exception. 8398 // TypeError exception.
8403 int* found = unchecked_result_keys.Find(key); 8399 int* found = unchecked_result_keys.Find(key);
8404 if (found == nullptr || *found == kGone) { 8400 if (found == nullptr || *found == kGone) {
8405 isolate->Throw(*isolate->factory()->NewTypeError( 8401 isolate->Throw(*isolate->factory()->NewTypeError(
8406 MessageTemplate::kProxyTrapResultMustInclude, handle(key, isolate))); 8402 MessageTemplate::kProxyTrapResultMustInclude, handle(key, isolate)));
8407 return false; 8403 return false;
8408 } 8404 }
8409 // 17b. Remove key from uncheckedResultKeys. 8405 // 17b. Remove key from uncheckedResultKeys.
8410 *found = kGone; 8406 *found = kGone;
8411 unchecked_result_keys_size--; 8407 unchecked_result_keys_size--;
8412 } 8408 }
8413 // 18. If extensibleTarget is true, return trapResult. 8409 // 18. If extensibleTarget is true, return trapResult.
8414 if (extensible_target) { 8410 if (extensible_target) {
8415 accumulator->AddKeysFromProxy(trap_result); 8411 return accumulator->AddKeysFromProxy(proxy, trap_result, filter,
8416 return true; 8412 enum_policy);
8417 } 8413 }
8418 // 19. Repeat, for each key that is an element of targetConfigurableKeys: 8414 // 19. Repeat, for each key that is an element of targetConfigurableKeys:
8419 for (int i = 0; i < target_configurable_keys->length(); ++i) { 8415 for (int i = 0; i < target_configurable_keys->length(); ++i) {
8420 Object* key = target_configurable_keys->get(i); 8416 Object* key = target_configurable_keys->get(i);
8421 if (key->IsSmi()) continue; // Zapped entry, was nonconfigurable. 8417 if (key->IsSmi()) continue; // Zapped entry, was nonconfigurable.
8422 // 19a. If key is not an element of uncheckedResultKeys, throw a 8418 // 19a. If key is not an element of uncheckedResultKeys, throw a
8423 // TypeError exception. 8419 // TypeError exception.
8424 int* found = unchecked_result_keys.Find(key); 8420 int* found = unchecked_result_keys.Find(key);
8425 if (found == nullptr || *found == kGone) { 8421 if (found == nullptr || *found == kGone) {
8426 isolate->Throw(*isolate->factory()->NewTypeError( 8422 isolate->Throw(*isolate->factory()->NewTypeError(
8427 MessageTemplate::kProxyTrapResultMustInclude, handle(key, isolate))); 8423 MessageTemplate::kProxyTrapResultMustInclude, handle(key, isolate)));
8428 return false; 8424 return false;
8429 } 8425 }
8430 // 19b. Remove key from uncheckedResultKeys. 8426 // 19b. Remove key from uncheckedResultKeys.
8431 *found = kGone; 8427 *found = kGone;
8432 unchecked_result_keys_size--; 8428 unchecked_result_keys_size--;
8433 } 8429 }
8434 // 20. If uncheckedResultKeys is not empty, throw a TypeError exception. 8430 // 20. If uncheckedResultKeys is not empty, throw a TypeError exception.
8435 if (unchecked_result_keys_size != 0) { 8431 if (unchecked_result_keys_size != 0) {
8436 DCHECK_GT(unchecked_result_keys_size, 0); 8432 DCHECK_GT(unchecked_result_keys_size, 0);
8437 isolate->Throw(*isolate->factory()->NewTypeError( 8433 isolate->Throw(*isolate->factory()->NewTypeError(
8438 MessageTemplate::kProxyTargetNotExtensible)); 8434 MessageTemplate::kProxyTargetNotExtensible));
8439 return false; 8435 return false;
8440 } 8436 }
8441 // 21. Return trapResult. 8437 // 21. Return trapResult.
8442 accumulator->AddKeysFromProxy(trap_result); 8438 return accumulator->AddKeysFromProxy(proxy, trap_result, filter, enum_policy);
8443 return true;
8444 } 8439 }
8445 8440
8446 8441
8447 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object, 8442 MaybeHandle<FixedArray> JSReceiver::GetKeys(Handle<JSReceiver> object,
8448 KeyCollectionType type, 8443 KeyCollectionType type,
8449 KeyFilter filter, 8444 KeyFilter filter,
8450 GetKeysConversion keys_conversion, 8445 GetKeysConversion keys_conversion,
8451 Enumerability enum_policy) { 8446 Enumerability enum_policy) {
8452 USE(ContainsOnlyValidKeys); 8447 USE(ContainsOnlyValidKeys);
8453 Isolate* isolate = object->GetIsolate(); 8448 Isolate* isolate = object->GetIsolate();
(...skipping 10524 matching lines...) Expand 10 before | Expand all | Expand 10 after
18978 if (cell->value() != *new_value) { 18973 if (cell->value() != *new_value) {
18979 cell->set_value(*new_value); 18974 cell->set_value(*new_value);
18980 Isolate* isolate = cell->GetIsolate(); 18975 Isolate* isolate = cell->GetIsolate();
18981 cell->dependent_code()->DeoptimizeDependentCodeGroup( 18976 cell->dependent_code()->DeoptimizeDependentCodeGroup(
18982 isolate, DependentCode::kPropertyCellChangedGroup); 18977 isolate, DependentCode::kPropertyCellChangedGroup);
18983 } 18978 }
18984 } 18979 }
18985 18980
18986 } // namespace internal 18981 } // namespace internal
18987 } // namespace v8 18982 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/runtime/runtime-object.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698