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

Side by Side Diff: src/builtins.cc

Issue 1767123002: [runtime] Pass in receiver as target to the LookupIterator if known to be JSReceiver (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: property-descriptor Created 4 years, 9 months 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/api.cc ('k') | src/contexts.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/builtins.h" 5 #include "src/builtins.h"
6 6
7 #include "src/api.h" 7 #include "src/api.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/arguments.h" 9 #include "src/arguments.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after
346 346
347 if (object->IsJSObject()) { 347 if (object->IsJSObject()) {
348 Handle<JSObject> js_obj = Handle<JSObject>::cast(object); 348 Handle<JSObject> js_obj = Handle<JSObject>::cast(object);
349 // Fast case: either the key is a real named property or it is not 349 // Fast case: either the key is a real named property or it is not
350 // an array index and there are no interceptors or hidden 350 // an array index and there are no interceptors or hidden
351 // prototypes. 351 // prototypes.
352 // TODO(jkummerow): Make JSReceiver::HasOwnProperty fast enough to 352 // TODO(jkummerow): Make JSReceiver::HasOwnProperty fast enough to
353 // handle all cases directly (without this custom fast path). 353 // handle all cases directly (without this custom fast path).
354 { 354 {
355 LookupIterator::Configuration c = LookupIterator::OWN_SKIP_INTERCEPTOR; 355 LookupIterator::Configuration c = LookupIterator::OWN_SKIP_INTERCEPTOR;
356 LookupIterator it = key_is_array_index 356 LookupIterator it =
357 ? LookupIterator(isolate, js_obj, index, c) 357 key_is_array_index ? LookupIterator(isolate, js_obj, index, js_obj, c)
358 : LookupIterator(js_obj, key, c); 358 : LookupIterator(js_obj, key, js_obj, c);
359 Maybe<bool> maybe = JSReceiver::HasProperty(&it); 359 Maybe<bool> maybe = JSReceiver::HasProperty(&it);
360 if (maybe.IsNothing()) return isolate->heap()->exception(); 360 if (maybe.IsNothing()) return isolate->heap()->exception();
361 DCHECK(!isolate->has_pending_exception()); 361 DCHECK(!isolate->has_pending_exception());
362 if (maybe.FromJust()) return isolate->heap()->true_value(); 362 if (maybe.FromJust()) return isolate->heap()->true_value();
363 } 363 }
364 364
365 Map* map = js_obj->map(); 365 Map* map = js_obj->map();
366 if (!map->has_hidden_prototype() && 366 if (!map->has_hidden_prototype() &&
367 (key_is_array_index ? !map->has_indexed_interceptor() 367 (key_is_array_index ? !map->has_indexed_interceptor()
368 : !map->has_named_interceptor())) { 368 : !map->has_named_interceptor())) {
369 return isolate->heap()->false_value(); 369 return isolate->heap()->false_value();
370 } 370 }
371 371
372 // Slow case. 372 // Slow case.
373 LookupIterator::Configuration c = LookupIterator::HIDDEN; 373 LookupIterator::Configuration c = LookupIterator::HIDDEN;
374 LookupIterator it = key_is_array_index 374 LookupIterator it = key_is_array_index
375 ? LookupIterator(isolate, js_obj, index, c) 375 ? LookupIterator(isolate, js_obj, index, js_obj, c)
376 : LookupIterator(js_obj, key, c); 376 : LookupIterator(js_obj, key, js_obj, c);
377 377
378 Maybe<bool> maybe = JSReceiver::HasProperty(&it); 378 Maybe<bool> maybe = JSReceiver::HasProperty(&it);
379 if (maybe.IsNothing()) return isolate->heap()->exception(); 379 if (maybe.IsNothing()) return isolate->heap()->exception();
380 DCHECK(!isolate->has_pending_exception()); 380 DCHECK(!isolate->has_pending_exception());
381 return isolate->heap()->ToBoolean(maybe.FromJust()); 381 return isolate->heap()->ToBoolean(maybe.FromJust());
382 382
383 } else if (object->IsJSProxy()) { 383 } else if (object->IsJSProxy()) {
384 if (key.is_null()) { 384 if (key.is_null()) {
385 DCHECK(key_is_array_index); 385 DCHECK(key_is_array_index);
386 key = isolate->factory()->Uint32ToString(index); 386 key = isolate->factory()->Uint32ToString(index);
(...skipping 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1535 } 1535 }
1536 } else { 1536 } else {
1537 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, prop_value, 1537 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, prop_value,
1538 Object::GetProperty(from, next_key), 1538 Object::GetProperty(from, next_key),
1539 Nothing<bool>()); 1539 Nothing<bool>());
1540 stable = from->map() == *map; 1540 stable = from->map() == *map;
1541 } 1541 }
1542 } else { 1542 } else {
1543 // If the map did change, do a slower lookup. We are still guaranteed that 1543 // If the map did change, do a slower lookup. We are still guaranteed that
1544 // the object has a simple shape, and that the key is a name. 1544 // the object has a simple shape, and that the key is a name.
1545 LookupIterator it(from, next_key, LookupIterator::OWN_SKIP_INTERCEPTOR); 1545 LookupIterator it(from, next_key, from,
1546 LookupIterator::OWN_SKIP_INTERCEPTOR);
1546 if (!it.IsFound()) continue; 1547 if (!it.IsFound()) continue;
1547 DCHECK(it.state() == LookupIterator::DATA || 1548 DCHECK(it.state() == LookupIterator::DATA ||
1548 it.state() == LookupIterator::ACCESSOR); 1549 it.state() == LookupIterator::ACCESSOR);
1549 if (!it.IsEnumerable()) continue; 1550 if (!it.IsEnumerable()) continue;
1550 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 1551 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
1551 isolate, prop_value, Object::GetProperty(&it), Nothing<bool>()); 1552 isolate, prop_value, Object::GetProperty(&it), Nothing<bool>());
1552 } 1553 }
1553 LookupIterator it(to, next_key); 1554 LookupIterator it(to, next_key, to);
1554 bool call_to_js = it.IsFound() && it.state() != LookupIterator::DATA; 1555 bool call_to_js = it.IsFound() && it.state() != LookupIterator::DATA;
1555 Maybe<bool> result = Object::SetProperty( 1556 Maybe<bool> result = Object::SetProperty(
1556 &it, prop_value, STRICT, Object::CERTAINLY_NOT_STORE_FROM_KEYED); 1557 &it, prop_value, STRICT, Object::CERTAINLY_NOT_STORE_FROM_KEYED);
1557 if (result.IsNothing()) return result; 1558 if (result.IsNothing()) return result;
1558 if (stable && call_to_js) stable = from->map() == *map; 1559 if (stable && call_to_js) stable = from->map() == *map;
1559 } 1560 }
1560 1561
1561 return Just(true); 1562 return Just(true);
1562 } 1563 }
1563 1564
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 1840
1840 Handle<JSReceiver> receiver; 1841 Handle<JSReceiver> receiver;
1841 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver, 1842 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, receiver,
1842 Object::ToObject(isolate, object)); 1843 Object::ToObject(isolate, object));
1843 1844
1844 Handle<FixedArray> keys; 1845 Handle<FixedArray> keys;
1845 ASSIGN_RETURN_FAILURE_ON_EXCEPTION( 1846 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(
1846 isolate, keys, JSReceiver::GetKeys(receiver, OWN_ONLY, ALL_PROPERTIES, 1847 isolate, keys, JSReceiver::GetKeys(receiver, OWN_ONLY, ALL_PROPERTIES,
1847 CONVERT_TO_STRING)); 1848 CONVERT_TO_STRING));
1848 1849
1849 Handle<Object> descriptors = 1850 Handle<JSObject> descriptors =
1850 isolate->factory()->NewJSObject(isolate->object_function()); 1851 isolate->factory()->NewJSObject(isolate->object_function());
1851 1852
1852 for (int i = 0; i < keys->length(); ++i) { 1853 for (int i = 0; i < keys->length(); ++i) {
1853 Handle<Name> key = Handle<Name>::cast(FixedArray::get(*keys, i, isolate)); 1854 Handle<Name> key = Handle<Name>::cast(FixedArray::get(*keys, i, isolate));
1854 PropertyDescriptor descriptor; 1855 PropertyDescriptor descriptor;
1855 Maybe<bool> did_get_descriptor = JSReceiver::GetOwnPropertyDescriptor( 1856 Maybe<bool> did_get_descriptor = JSReceiver::GetOwnPropertyDescriptor(
1856 isolate, receiver, key, &descriptor); 1857 isolate, receiver, key, &descriptor);
1857 MAYBE_RETURN(did_get_descriptor, isolate->heap()->exception()); 1858 MAYBE_RETURN(did_get_descriptor, isolate->heap()->exception());
1858 1859
1859 Handle<Object> from_descriptor = did_get_descriptor.FromJust() 1860 Handle<Object> from_descriptor = did_get_descriptor.FromJust()
1860 ? descriptor.ToObject(isolate) 1861 ? descriptor.ToObject(isolate)
1861 : undefined; 1862 : undefined;
1862 1863
1863 LookupIterator it = LookupIterator::PropertyOrElement( 1864 LookupIterator it = LookupIterator::PropertyOrElement(
1864 isolate, descriptors, key, LookupIterator::OWN); 1865 isolate, descriptors, key, descriptors, LookupIterator::OWN);
1865 Maybe<bool> success = JSReceiver::CreateDataProperty(&it, from_descriptor, 1866 Maybe<bool> success = JSReceiver::CreateDataProperty(&it, from_descriptor,
1866 Object::DONT_THROW); 1867 Object::DONT_THROW);
1867 CHECK(success.FromJust()); 1868 CHECK(success.FromJust());
1868 } 1869 }
1869 1870
1870 return *descriptors; 1871 return *descriptors;
1871 } 1872 }
1872 1873
1873 // ES6 section 19.1.2.15 Object.preventExtensions ( O ) 1874 // ES6 section 19.1.2.15 Object.preventExtensions ( O )
1874 BUILTIN(ObjectPreventExtensions) { 1875 BUILTIN(ObjectPreventExtensions) {
(...skipping 2657 matching lines...) Expand 10 before | Expand all | Expand 10 after
4532 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) 4533 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C)
4533 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) 4534 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A)
4534 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 4535 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
4535 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 4536 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
4536 #undef DEFINE_BUILTIN_ACCESSOR_C 4537 #undef DEFINE_BUILTIN_ACCESSOR_C
4537 #undef DEFINE_BUILTIN_ACCESSOR_A 4538 #undef DEFINE_BUILTIN_ACCESSOR_A
4538 4539
4539 4540
4540 } // namespace internal 4541 } // namespace internal
4541 } // namespace v8 4542 } // namespace v8
OLDNEW
« no previous file with comments | « src/api.cc ('k') | src/contexts.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698