| Index: runtime/vm/flow_graph_optimizer.cc
|
| ===================================================================
|
| --- runtime/vm/flow_graph_optimizer.cc (revision 14483)
|
| +++ runtime/vm/flow_graph_optimizer.cc (working copy)
|
| @@ -273,7 +273,8 @@
|
|
|
| static bool ICDataHasReceiverClassId(const ICData& ic_data, intptr_t class_id) {
|
| ASSERT(ic_data.num_args_tested() > 0);
|
| - for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
|
| + const intptr_t len = ic_data.NumberOfChecks();
|
| + for (intptr_t i = 0; i < len; i++) {
|
| const intptr_t test_class_id = ic_data.GetReceiverClassIdAt(i);
|
| if (test_class_id == class_id) {
|
| return true;
|
| @@ -291,7 +292,8 @@
|
| if (ic_data.num_args_tested() != 2) return false;
|
|
|
| Function& target = Function::Handle();
|
| - for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
|
| + const intptr_t len = ic_data.NumberOfChecks();
|
| + for (intptr_t i = 0; i < len; i++) {
|
| GrowableArray<intptr_t> class_ids;
|
| ic_data.GetCheckAt(i, &class_ids, &target);
|
| ASSERT(class_ids.length() == 2);
|
| @@ -323,7 +325,8 @@
|
| const GrowableArray<intptr_t>& argument_class_ids) {
|
| if (ic_data.num_args_tested() != 2) return false;
|
| Function& target = Function::Handle();
|
| - for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
|
| + const intptr_t len = ic_data.NumberOfChecks();
|
| + for (intptr_t i = 0; i < len; i++) {
|
| GrowableArray<intptr_t> class_ids;
|
| ic_data.GetCheckAt(i, &class_ids, &target);
|
| ASSERT(class_ids.length() == 2);
|
| @@ -447,7 +450,8 @@
|
| if (ic_data.NumberOfChecks() == 0) return false;
|
| GrowableArray<intptr_t> class_ids;
|
| Function& target = Function::Handle();
|
| - for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) {
|
| + const intptr_t len = ic_data.NumberOfChecks();
|
| + for (intptr_t i = 0; i < len; i++) {
|
| ic_data.GetCheckAt(i, &class_ids, &target);
|
| if (class_ids[arg_n] != kSmiCid) return false;
|
| }
|
| @@ -1171,7 +1175,8 @@
|
| ICData::ZoneHandle(instr->ic_data()->AsUnaryClassChecks());
|
| if ((unary_checks.NumberOfChecks() > FLAG_max_polymorphic_checks) &&
|
| InstanceCallNeedsClassCheck(instr)) {
|
| - // Too many checks, leave it megamorphic.
|
| + // Too many checks, it will be megamorphic which needs unary checks.
|
| + instr->set_ic_data(&unary_checks);
|
| return;
|
| }
|
|
|
|
|