Commit dbd3d58f authored by Toon Verwaest's avatar Toon Verwaest Committed by Commit Bot

[ic] Move tuple3 elements transition handler creation to ic-configuration

Bug: 
Change-Id: I7ac2f30c70c76ea7c3156750b53ad34baeb046cb
Reviewed-on: https://chromium-review.googlesource.com/667113Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
Commit-Queue: Toon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/master@{#48035}
parent 8d1ad4b8
......@@ -4,6 +4,7 @@
#include "src/ic/handler-configuration.h"
#include "src/code-stubs.h"
#include "src/ic/handler-configuration-inl.h"
#include "src/transitions.h"
......@@ -236,6 +237,25 @@ Object* StoreHandler::ValidTuple3HandlerOrNull(Object* handler, Name* name,
return handler;
}
// static
Handle<Object> StoreHandler::StoreElementTransition(
Isolate* isolate, Handle<Map> receiver_map, Handle<Map> transition,
KeyedAccessStoreMode store_mode) {
bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
ElementsKind elements_kind = receiver_map->elements_kind();
Handle<Code> stub = ElementsTransitionAndStoreStub(
isolate, elements_kind, transition->elements_kind(),
is_js_array, store_mode)
.GetCode();
Handle<Object> validity_cell =
Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate);
if (validity_cell.is_null()) {
validity_cell = handle(Smi::kZero, isolate);
}
Handle<WeakCell> cell = Map::WeakCellForMap(transition);
return isolate->factory()->NewTuple3(cell, stub, validity_cell, TENURED);
}
// static
Handle<Object> StoreHandler::StoreTransition(Isolate* isolate,
Handle<Map> receiver_map,
......
......@@ -250,6 +250,11 @@ class StoreHandler {
Handle<Map> transition,
Handle<Name> name);
static Handle<Object> StoreElementTransition(Isolate* isolate,
Handle<Map> receiver_map,
Handle<Map> transition,
KeyedAccessStoreMode store_mode);
static Handle<Object> StoreProxy(Isolate* isolate, Handle<Map> receiver_map,
Handle<JSProxy> proxy,
Handle<JSReceiver> receiver,
......
......@@ -1815,7 +1815,7 @@ void KeyedStoreIC::StoreElementPolymorphicHandlers(
for (Handle<Map> receiver_map : *receiver_maps) {
Handle<Object> handler;
Handle<Map> transitioned_map;
Handle<Map> transition;
if (receiver_map->instance_type() < FIRST_JS_RECEIVER_TYPE ||
receiver_map->DictionaryElementsInPrototypeChainOnly()) {
......@@ -1832,7 +1832,7 @@ void KeyedStoreIC::StoreElementPolymorphicHandlers(
if (receiver_map->is_stable()) {
receiver_map->NotifyLeafMapLayoutChange();
}
transitioned_map = handle(tmap);
transition = handle(tmap);
}
}
......@@ -1841,24 +1841,11 @@ void KeyedStoreIC::StoreElementPolymorphicHandlers(
// Site Tracking to do a better job of ensuring the data types are what
// they need to be. Not all the elements are in place yet, pessimistic
// elements transitions are still important for performance.
if (!transitioned_map.is_null()) {
bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE;
ElementsKind elements_kind = receiver_map->elements_kind();
if (!transition.is_null()) {
TRACE_HANDLER_STATS(isolate(),
KeyedStoreIC_ElementsTransitionAndStoreStub);
Handle<Code> stub =
ElementsTransitionAndStoreStub(isolate(), elements_kind,
transitioned_map->elements_kind(),
is_js_array, store_mode)
.GetCode();
Handle<Object> validity_cell =
Map::GetOrCreatePrototypeChainValidityCell(receiver_map, isolate());
if (validity_cell.is_null()) {
validity_cell = handle(Smi::kZero, isolate());
}
Handle<WeakCell> transition = Map::WeakCellForMap(transitioned_map);
handler = isolate()->factory()->NewTuple3(transition, stub,
validity_cell, TENURED);
handler = StoreHandler::StoreElementTransition(isolate(), receiver_map,
transition, store_mode);
} else {
handler = StoreElementHandler(receiver_map, store_mode);
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment