| Index: runtime/vm/simulator_dbc.cc
|
| diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
|
| index 9a8838fa60dac34fdb0d0ea8b5d2f66fd2e77820..215fb04d26f07f1978d449028d0de41dde8c8b2c 100644
|
| --- a/runtime/vm/simulator_dbc.cc
|
| +++ b/runtime/vm/simulator_dbc.cc
|
| @@ -174,6 +174,24 @@ class SimulatorHelpers {
|
| reinterpret_cast<intptr_t>(length));
|
| }
|
|
|
| + DART_FORCE_INLINE static intptr_t ArgDescTypeArgsLen(RawArray* argdesc) {
|
| + return Smi::Value(*reinterpret_cast<RawSmi**>(
|
| + reinterpret_cast<uword>(argdesc->ptr()) +
|
| + Array::element_offset(ArgumentsDescriptor::kTypeArgsLenIndex)));
|
| + }
|
| +
|
| + DART_FORCE_INLINE static intptr_t ArgDescArgCount(RawArray* argdesc) {
|
| + return Smi::Value(*reinterpret_cast<RawSmi**>(
|
| + reinterpret_cast<uword>(argdesc->ptr()) +
|
| + Array::element_offset(ArgumentsDescriptor::kCountIndex)));
|
| + }
|
| +
|
| + DART_FORCE_INLINE static intptr_t ArgDescPosCount(RawArray* argdesc) {
|
| + return Smi::Value(*reinterpret_cast<RawSmi**>(
|
| + reinterpret_cast<uword>(argdesc->ptr()) +
|
| + Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
|
| + }
|
| +
|
| static bool ObjectArraySetIndexed(Thread* thread,
|
| RawObject** FP,
|
| RawObject** result) {
|
| @@ -835,7 +853,10 @@ DART_FORCE_INLINE void Simulator::InstanceCall1(Thread* thread,
|
| RawObject** args = call_base;
|
| RawArray* cache = icdata->ptr()->ic_data_->ptr();
|
|
|
| - RawSmi* receiver_cid = SimulatorHelpers::GetClassIdAsSmi(args[0]);
|
| + const intptr_t type_args_len =
|
| + SimulatorHelpers::ArgDescTypeArgsLen(icdata->ptr()->args_descriptor_);
|
| + const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
|
| + RawSmi* receiver_cid = SimulatorHelpers::GetClassIdAsSmi(args[receiver_idx]);
|
|
|
| bool found = false;
|
| const intptr_t length = Smi::Value(cache->length_);
|
| @@ -853,8 +874,8 @@ DART_FORCE_INLINE void Simulator::InstanceCall1(Thread* thread,
|
| SimulatorHelpers::IncrementICUsageCount(cache->data(), i, kCheckedArgs);
|
| }
|
| } else {
|
| - InlineCacheMiss(kCheckedArgs, thread, icdata, call_base, top, *pc, *FP,
|
| - *SP);
|
| + InlineCacheMiss(kCheckedArgs, thread, icdata, call_base + receiver_idx, top,
|
| + *pc, *FP, *SP);
|
| }
|
|
|
| *argdesc = icdata->ptr()->args_descriptor_;
|
| @@ -877,8 +898,11 @@ DART_FORCE_INLINE void Simulator::InstanceCall2(Thread* thread,
|
| RawObject** args = call_base;
|
| RawArray* cache = icdata->ptr()->ic_data_->ptr();
|
|
|
| - RawSmi* receiver_cid = SimulatorHelpers::GetClassIdAsSmi(args[0]);
|
| - RawSmi* arg0_cid = SimulatorHelpers::GetClassIdAsSmi(args[1]);
|
| + const intptr_t type_args_len =
|
| + SimulatorHelpers::ArgDescTypeArgsLen(icdata->ptr()->args_descriptor_);
|
| + const intptr_t receiver_idx = type_args_len > 0 ? 1 : 0;
|
| + RawSmi* receiver_cid = SimulatorHelpers::GetClassIdAsSmi(args[receiver_idx]);
|
| + RawSmi* arg0_cid = SimulatorHelpers::GetClassIdAsSmi(args[receiver_idx + 1]);
|
|
|
| bool found = false;
|
| const intptr_t length = Smi::Value(cache->length_);
|
| @@ -897,8 +921,8 @@ DART_FORCE_INLINE void Simulator::InstanceCall2(Thread* thread,
|
| SimulatorHelpers::IncrementICUsageCount(cache->data(), i, kCheckedArgs);
|
| }
|
| } else {
|
| - InlineCacheMiss(kCheckedArgs, thread, icdata, call_base, top, *pc, *FP,
|
| - *SP);
|
| + InlineCacheMiss(kCheckedArgs, thread, icdata, call_base + receiver_idx, top,
|
| + *pc, *FP, *SP);
|
| }
|
|
|
| *argdesc = icdata->ptr()->args_descriptor_;
|
| @@ -1261,6 +1285,7 @@ RawObject* Simulator::Call(const Code& code,
|
|
|
| // Load argument descriptor.
|
| argdesc = arguments_descriptor.raw();
|
| + ASSERT(ArgumentsDescriptor(arguments_descriptor).TypeArgsLen() == 0);
|
|
|
| // Ready to start executing bytecode. Load entry point and corresponding
|
| // object pool.
|
| @@ -1289,9 +1314,7 @@ RawObject* Simulator::Call(const Code& code,
|
| const uint16_t context_reg = rC;
|
|
|
| // Decode arguments descriptor.
|
| - const intptr_t pos_count = Smi::Value(*reinterpret_cast<RawSmi**>(
|
| - reinterpret_cast<uword>(argdesc->ptr()) +
|
| - Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
|
| + const intptr_t pos_count = SimulatorHelpers::ArgDescPosCount(argdesc);
|
|
|
| // Check that we got the right number of positional parameters.
|
| if (pos_count != num_fixed_params) {
|
| @@ -1319,9 +1342,7 @@ RawObject* Simulator::Call(const Code& code,
|
| const uint16_t num_registers = rD;
|
|
|
| // Decode arguments descriptor.
|
| - const intptr_t pos_count = Smi::Value(*reinterpret_cast<RawSmi**>(
|
| - reinterpret_cast<uword>(argdesc->ptr()) +
|
| - Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
|
| + const intptr_t pos_count = SimulatorHelpers::ArgDescPosCount(argdesc);
|
|
|
| // Check that we got the right number of positional parameters.
|
| if (pos_count != num_fixed_params) {
|
| @@ -1344,12 +1365,8 @@ RawObject* Simulator::Call(const Code& code,
|
| const intptr_t max_num_pos_args = num_fixed_params + num_opt_pos_params;
|
|
|
| // Decode arguments descriptor.
|
| - const intptr_t arg_count = Smi::Value(*reinterpret_cast<RawSmi**>(
|
| - reinterpret_cast<uword>(argdesc->ptr()) +
|
| - Array::element_offset(ArgumentsDescriptor::kCountIndex)));
|
| - const intptr_t pos_count = Smi::Value(*reinterpret_cast<RawSmi**>(
|
| - reinterpret_cast<uword>(argdesc->ptr()) +
|
| - Array::element_offset(ArgumentsDescriptor::kPositionalCountIndex)));
|
| + const intptr_t arg_count = SimulatorHelpers::ArgDescArgCount(argdesc);
|
| + const intptr_t pos_count = SimulatorHelpers::ArgDescPosCount(argdesc);
|
| const intptr_t named_count = (arg_count - pos_count);
|
|
|
| // Check that got the right number of positional parameters.
|
| @@ -1432,7 +1449,7 @@ RawObject* Simulator::Call(const Code& code,
|
|
|
| // Process the list of default values encoded as a sequence of
|
| // LoadConstant instructions after EntryOpt bytecode.
|
| - // Execute only those that correspond to parameters the were not passed.
|
| + // Execute only those that correspond to parameters that were not passed.
|
| for (intptr_t i = pos_count - num_fixed_params; i < num_opt_pos_params;
|
| i++) {
|
| const uint32_t load_value = pc[i];
|
| @@ -1553,6 +1570,29 @@ RawObject* Simulator::Call(const Code& code,
|
| DISPATCH();
|
| }
|
|
|
| + {
|
| + BYTECODE(CheckFunctionTypeArgs, A_D);
|
| + const uint16_t declared_type_args_len = rA;
|
| + const uint16_t first_stack_local_index = rD;
|
| +
|
| + // Decode arguments descriptor's type args len.
|
| + const intptr_t type_args_len =
|
| + SimulatorHelpers::ArgDescTypeArgsLen(argdesc);
|
| + if (type_args_len > 0) {
|
| + // Decode arguments descriptor's argument count (excluding type args).
|
| + const intptr_t arg_count = SimulatorHelpers::ArgDescArgCount(argdesc);
|
| + // Copy passed-in type args to first local slot.
|
| + FP[first_stack_local_index] = *FrameArguments(FP, arg_count + 1);
|
| + } else {
|
| + FP[first_stack_local_index] = Object::null();
|
| + }
|
| +
|
| + // TODO(regis): Verify that type_args_len is correct.
|
| + USE(declared_type_args_len);
|
| +
|
| + DISPATCH();
|
| + }
|
| +
|
| {
|
| BYTECODE(DebugStep, A);
|
| if (thread->isolate()->single_step()) {
|
|
|