Index: runtime/vm/simulator_dbc.cc |
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc |
index 4102e8f1c71ec4182193bbafa51e30ba6e9e47df..757e54b1756934d703cee642f929052b8234b053 100644 |
--- a/runtime/vm/simulator_dbc.cc |
+++ b/runtime/vm/simulator_dbc.cc |
@@ -1374,7 +1374,7 @@ RawObject* Simulator::Call(const Code& code, |
} |
{ |
- BYTECODE(StaticCall, A_D); |
+ BYTECODE(IndirectStaticCall, A_D); |
// Check if single stepping. |
if (thread->isolate()->single_step()) { |
@@ -1386,6 +1386,12 @@ RawObject* Simulator::Call(const Code& code, |
// Invoke target function. |
{ |
const uint16_t argc = rA; |
+ // Lookup the funciton in the ICData. |
+ RawObject* ic_data_obj = SP[0]; |
+ RawICData* ic_data = RAW_CAST(ICData, ic_data_obj); |
+ RawArray* cache = ic_data->ptr()->ic_data_->ptr(); |
+ SP[0] = cache->data()[ICData::TargetIndexFor( |
+ ic_data->ptr()->state_bits_ & 0x3)]; |
RawObject** call_base = SP - argc; |
RawObject** call_top = SP; // *SP contains function |
argdesc = static_cast<RawArray*>(LOAD_CONSTANT(rD)); |
@@ -1396,6 +1402,16 @@ RawObject* Simulator::Call(const Code& code, |
} |
{ |
+ BYTECODE(StaticCall, A_D); |
+ const uint16_t argc = rA; |
+ RawObject** call_base = SP - argc; |
+ RawObject** call_top = SP; // *SP contains function |
+ argdesc = static_cast<RawArray*>(LOAD_CONSTANT(rD)); |
+ Invoke(thread, call_base, call_top, &pp, &pc, &FP, &SP); |
+ DISPATCH(); |
+ } |
+ |
+ { |
BYTECODE(InstanceCall1, A_D); |
// Check if single stepping. |