Allow NORMAL ICs to go polymorphic.

R=danno@chromium.org

Review URL: https://chromiumcodereview.appspot.com/19005002

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15600 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
verwaest@chromium.org 2013-07-10 15:24:15 +00:00
parent dfd955ff9f
commit 51aa0c13da

View File

@ -978,12 +978,6 @@ bool IC::UpdatePolymorphicIC(State state,
Handle<String> name,
Handle<Code> code,
StrictModeFlag strict_mode) {
if (code->type() == Code::NORMAL) return false;
if (target()->ic_state() == MONOMORPHIC &&
target()->type() == Code::NORMAL) {
return false;
}
MapHandleList receiver_maps;
CodeHandleList handlers;
@ -992,7 +986,12 @@ bool IC::UpdatePolymorphicIC(State state,
Handle<Map> new_receiver_map(receiver->map());
{
DisallowHeapAllocation no_gc;
target()->FindAllMaps(&receiver_maps);
if (target()->ic_state() == POLYMORPHIC ||
(target()->ic_state() == MONOMORPHIC &&
target()->type() != Code::NORMAL)) {
target()->FindAllMaps(&receiver_maps);
}
int number_of_maps = receiver_maps.length();
number_of_valid_maps = number_of_maps;
@ -1012,12 +1011,9 @@ bool IC::UpdatePolymorphicIC(State state,
if (number_of_valid_maps >= 4) return false;
// Only allow 0 maps in case target() was reset to UNINITIALIZED by the GC.
// In that case, allow the IC to go back monomorphic.
if (number_of_maps == 0 && target()->ic_state() != UNINITIALIZED) {
return false;
if (number_of_maps > 0) {
target()->FindAllCode(&handlers, receiver_maps.length());
}
target()->FindAllCode(&handlers, receiver_maps.length());
}
number_of_valid_maps++;