Index: runtime/vm/simulator_dbc.cc |
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc |
index d16a5a375869ea3c06faeb2d7826d0b627feec63..d211405b6089ce91120b943590f2e7df719d30df 100644 |
--- a/runtime/vm/simulator_dbc.cc |
+++ b/runtime/vm/simulator_dbc.cc |
@@ -1858,6 +1858,28 @@ RawObject* Simulator::Call(const Code& code, |
} |
{ |
+ BYTECODE(PushPolymorphicInstanceCallByRange, A_D); |
+ const uint8_t argc = rA; |
+ const intptr_t cids_length = rD; |
+ RawObject** args = SP - argc + 1; |
+ const intptr_t receiver_cid = SimulatorHelpers::GetClassId(args[0]); |
+ for (intptr_t i = 0; i < 3 * cids_length; i += 3) { |
+ // Note unsigned types to get an unsigned range compare. |
+ const uintptr_t cid_start = Bytecode::DecodeD(*(pc + i)); |
+ const uintptr_t cids = Bytecode::DecodeD(*(pc + i + 1)); |
+ if (receiver_cid - cid_start < cids) { |
+ RawFunction* target = |
+ RAW_CAST(Function, LOAD_CONSTANT(Bytecode::DecodeD(*(pc + i + 2)))); |
+ *++SP = target; |
+ pc++; |
+ break; |
+ } |
+ } |
+ pc += 3 * cids_length; |
+ DISPATCH(); |
+ } |
+ |
+ { |
BYTECODE(NativeBootstrapCall, 0); |
RawFunction* function = FrameFunction(FP); |
RawObject** incoming_args = |
@@ -3208,6 +3230,31 @@ RawObject* Simulator::Call(const Code& code, |
} |
{ |
+ BYTECODE(CheckCidsByRange, A_B_C); |
+ const intptr_t raw_value = reinterpret_cast<intptr_t>(FP[rA]); |
+ const bool is_smi = ((raw_value & kSmiTagMask) == kSmiTag); |
+ const bool may_be_smi = (rB == 1); |
+ const intptr_t cids_length = rC; |
+ if (LIKELY(!is_smi)) { |
+ const intptr_t cid = SimulatorHelpers::GetClassId(FP[rA]); |
+ for (intptr_t i = 0; i < cids_length; i += 2) { |
+ // Note unsigned type to get unsigned range check below. |
+ const uintptr_t cid_start = Bytecode::DecodeD(*(pc + i)); |
+ const uintptr_t cids = Bytecode::DecodeD(*(pc + i + 1)); |
+ if (cid - cid_start < cids) { |
+ pc++; |
+ break; |
+ } |
+ } |
+ pc += cids_length; |
+ } else { |
+ pc += cids_length; |
+ pc += (may_be_smi ? 1 : 0); |
+ } |
+ DISPATCH(); |
+ } |
+ |
+ { |
BYTECODE(IfEqStrictTOS, 0); |
SP -= 2; |
if (SP[1] != SP[2]) { |