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

Side by Side Diff: src/ic/ic.cc

Issue 2597013004: [ic] Always use generic ICs for growing element stores on arguments (Closed)
Patch Set: Created 4 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 | « no previous file | src/objects.h » ('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/ic/ic.h" 5 #include "src/ic/ic.h"
6 6
7 #include <iostream> 7 #include <iostream>
8 8
9 #include "src/accessors.h" 9 #include "src/accessors.h"
10 #include "src/api-arguments-inl.h" 10 #include "src/api-arguments-inl.h"
(...skipping 2404 matching lines...) Expand 10 before | Expand all | Expand 10 after
2415 // expect to be able to trap element sets to objects with those maps in 2415 // expect to be able to trap element sets to objects with those maps in
2416 // the runtime to enable optimization of element hole access. 2416 // the runtime to enable optimization of element hole access.
2417 Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object); 2417 Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object);
2418 if (heap_object->map()->IsMapInArrayPrototypeChain()) { 2418 if (heap_object->map()->IsMapInArrayPrototypeChain()) {
2419 TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "map in array prototype"); 2419 TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "map in array prototype");
2420 use_ic = false; 2420 use_ic = false;
2421 } 2421 }
2422 } 2422 }
2423 2423
2424 Handle<Map> old_receiver_map; 2424 Handle<Map> old_receiver_map;
2425 bool sloppy_arguments_elements = false; 2425 bool is_arguments = false;
2426 bool key_is_valid_index = false; 2426 bool key_is_valid_index = false;
2427 KeyedAccessStoreMode store_mode = STANDARD_STORE; 2427 KeyedAccessStoreMode store_mode = STANDARD_STORE;
2428 if (use_ic && object->IsJSObject()) { 2428 if (use_ic && object->IsJSObject()) {
2429 Handle<JSObject> receiver = Handle<JSObject>::cast(object); 2429 Handle<JSObject> receiver = Handle<JSObject>::cast(object);
2430 old_receiver_map = handle(receiver->map(), isolate()); 2430 old_receiver_map = handle(receiver->map(), isolate());
2431 sloppy_arguments_elements = 2431 is_arguments = receiver->IsJSArgumentsObject();
2432 !is_sloppy(language_mode()) && 2432 if (!is_arguments) {
2433 receiver->elements()->map() ==
2434 isolate()->heap()->sloppy_arguments_elements_map();
2435 if (!sloppy_arguments_elements) {
2436 key_is_valid_index = key->IsSmi() && Smi::cast(*key)->value() >= 0; 2433 key_is_valid_index = key->IsSmi() && Smi::cast(*key)->value() >= 0;
2437 if (key_is_valid_index) { 2434 if (key_is_valid_index) {
2438 uint32_t index = static_cast<uint32_t>(Smi::cast(*key)->value()); 2435 uint32_t index = static_cast<uint32_t>(Smi::cast(*key)->value());
2439 store_mode = GetStoreMode(receiver, index, value); 2436 store_mode = GetStoreMode(receiver, index, value);
2440 } 2437 }
2441 } 2438 }
2442 } 2439 }
2443 2440
2444 DCHECK(store_handle.is_null()); 2441 DCHECK(store_handle.is_null());
2445 ASSIGN_RETURN_ON_EXCEPTION(isolate(), store_handle, 2442 ASSIGN_RETURN_ON_EXCEPTION(isolate(), store_handle,
2446 Runtime::SetObjectProperty(isolate(), object, key, 2443 Runtime::SetObjectProperty(isolate(), object, key,
2447 value, language_mode()), 2444 value, language_mode()),
2448 Object); 2445 Object);
2449 2446
2450 if (use_ic) { 2447 if (use_ic) {
2451 if (!old_receiver_map.is_null()) { 2448 if (!old_receiver_map.is_null()) {
2452 if (sloppy_arguments_elements) { 2449 if (is_arguments) {
2453 TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "arguments receiver"); 2450 TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", "arguments receiver");
2454 } else if (key_is_valid_index) { 2451 } else if (key_is_valid_index) {
2455 // We should go generic if receiver isn't a dictionary, but our 2452 // We should go generic if receiver isn't a dictionary, but our
2456 // prototype chain does have dictionary elements. This ensures that 2453 // prototype chain does have dictionary elements. This ensures that
2457 // other non-dictionary receivers in the polymorphic case benefit 2454 // other non-dictionary receivers in the polymorphic case benefit
2458 // from fast path keyed stores. 2455 // from fast path keyed stores.
2459 if (!old_receiver_map->DictionaryElementsInPrototypeChainOnly()) { 2456 if (!old_receiver_map->DictionaryElementsInPrototypeChainOnly()) {
2460 UpdateStoreElement(old_receiver_map, store_mode); 2457 UpdateStoreElement(old_receiver_map, store_mode);
2461 } else { 2458 } else {
2462 TRACE_GENERIC_IC(isolate(), "KeyedStoreIC", 2459 TRACE_GENERIC_IC(isolate(), "KeyedStoreIC",
(...skipping 752 matching lines...) Expand 10 before | Expand all | Expand 10 after
3215 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state()); 3212 DCHECK_EQ(LookupIterator::INTERCEPTOR, it.state());
3216 it.Next(); 3213 it.Next();
3217 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result, 3214 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, result,
3218 Object::GetProperty(&it)); 3215 Object::GetProperty(&it));
3219 } 3216 }
3220 3217
3221 return *result; 3218 return *result;
3222 } 3219 }
3223 } // namespace internal 3220 } // namespace internal
3224 } // namespace v8 3221 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/objects.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698