| Index: runtime/vm/intermediate_language_ia32.cc
|
| ===================================================================
|
| --- runtime/vm/intermediate_language_ia32.cc (revision 14215)
|
| +++ runtime/vm/intermediate_language_ia32.cc (working copy)
|
| @@ -335,7 +335,8 @@
|
| intptr_t deopt_id,
|
| intptr_t token_pos,
|
| Token::Kind kind,
|
| - LocationSummary* locs) {
|
| + LocationSummary* locs,
|
| + const ICData& original_ic_data) {
|
| if (!compiler->is_optimizing()) {
|
| compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore,
|
| deopt_id,
|
| @@ -354,13 +355,19 @@
|
| __ cmpl(Address(ESP, 1 * kWordSize), raw_null);
|
| __ j(EQUAL, &check_identity, Assembler::kNearJump);
|
|
|
| - const ICData& ic_data = compiler->GenerateInstanceCall(deopt_id,
|
| - token_pos,
|
| - operator_name,
|
| - kNumberOfArguments,
|
| - kNoArgumentNames,
|
| - kNumArgumentsChecked,
|
| - locs);
|
| + ICData& equality_ic_data = ICData::ZoneHandle(original_ic_data.raw());
|
| + if (equality_ic_data.IsNull()) {
|
| + equality_ic_data = ICData::New(compiler->parsed_function().function(),
|
| + operator_name,
|
| + deopt_id,
|
| + kNumArgumentsChecked);
|
| + }
|
| + compiler->GenerateInstanceCall(deopt_id,
|
| + token_pos,
|
| + kNumberOfArguments,
|
| + kNoArgumentNames,
|
| + locs,
|
| + equality_ic_data);
|
| Label check_ne;
|
| __ jmp(&check_ne);
|
|
|
| @@ -369,7 +376,7 @@
|
| // necessary.
|
| Register ic_data_reg = locs->temp(0).reg();
|
| ASSERT(ic_data_reg == ECX); // Stub depends on it.
|
| - __ LoadObject(ic_data_reg, ic_data);
|
| + __ LoadObject(ic_data_reg, equality_ic_data);
|
| compiler->GenerateCall(token_pos,
|
| &StubCode::EqualityWithNullArgLabel(),
|
| PcDescriptors::kOther,
|
| @@ -747,7 +754,12 @@
|
| Register right = locs()->in(1).reg();
|
| __ pushl(left);
|
| __ pushl(right);
|
| - EmitEqualityAsInstanceCall(compiler, deopt_id(), token_pos(), kind(), locs());
|
| + EmitEqualityAsInstanceCall(compiler,
|
| + deopt_id(),
|
| + token_pos(),
|
| + kind(),
|
| + locs(),
|
| + *ic_data());
|
| ASSERT(locs()->out().reg() == EAX);
|
| }
|
|
|
| @@ -788,7 +800,8 @@
|
| deopt_id(),
|
| token_pos(),
|
| Token::kEQ, // kNE reverse occurs at branch.
|
| - locs());
|
| + locs(),
|
| + *ic_data());
|
| if (branch->is_checked()) {
|
| EmitAssertBoolean(EAX, token_pos(), locs(), compiler);
|
| }
|
| @@ -874,13 +887,19 @@
|
| }
|
| const intptr_t kNumArguments = 2;
|
| const intptr_t kNumArgsChecked = 2; // Type-feedback.
|
| + ICData& relational_ic_data = ICData::ZoneHandle(ic_data()->raw());
|
| + if (relational_ic_data.IsNull()) {
|
| + relational_ic_data = ICData::New(compiler->parsed_function().function(),
|
| + function_name,
|
| + deopt_id(),
|
| + kNumArgsChecked);
|
| + }
|
| compiler->GenerateInstanceCall(deopt_id(),
|
| token_pos(),
|
| - function_name,
|
| kNumArguments,
|
| Array::ZoneHandle(), // No optional arguments.
|
| - kNumArgsChecked,
|
| - locs());
|
| + locs(),
|
| + relational_ic_data);
|
| }
|
|
|
|
|
|
|