| Index: runtime/vm/flow_graph_compiler_x64.cc
|
| diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
|
| index 42b3677bc82c3adf48a372fd084373708321f716..d21067f0eeed8575448c5070da62d5f4ea5769ec 100644
|
| --- a/runtime/vm/flow_graph_compiler_x64.cc
|
| +++ b/runtime/vm/flow_graph_compiler_x64.cc
|
| @@ -29,6 +29,18 @@ DECLARE_FLAG(bool, enable_simd_inline);
|
| DECLARE_FLAG(bool, use_megamorphic_stub);
|
|
|
|
|
| +void MegamorphicSlowPath::EmitNativeCode(FlowGraphCompiler* compiler) {
|
| + Assembler* assem = compiler->assembler();
|
| +#define __ assem->
|
| + __ Bind(entry_label());
|
| + __ Comment("MegamorphicSlowPath");
|
| + compiler->EmitMegamorphicInstanceCall(ic_data_, argument_count_, deopt_id_,
|
| + token_pos_, locs_, try_index_);
|
| + __ jmp(exit_label());
|
| +#undef __
|
| +}
|
| +
|
| +
|
| FlowGraphCompiler::~FlowGraphCompiler() {
|
| // BlockInfos are zone-allocated, so their destructors are not called.
|
| // Verify the labels explicitly here.
|
| @@ -1279,7 +1291,8 @@ void FlowGraphCompiler::EmitMegamorphicInstanceCall(
|
| intptr_t argument_count,
|
| intptr_t deopt_id,
|
| intptr_t token_pos,
|
| - LocationSummary* locs) {
|
| + LocationSummary* locs,
|
| + intptr_t try_index) {
|
| const String& name = String::Handle(zone(), ic_data.target_name());
|
| const Array& arguments_descriptor =
|
| Array::ZoneHandle(zone(), ic_data.arguments_descriptor());
|
| @@ -1301,7 +1314,18 @@ void FlowGraphCompiler::EmitMegamorphicInstanceCall(
|
| Thread::kNoDeoptId, token_pos);
|
| RecordSafepoint(locs);
|
| const intptr_t deopt_id_after = Thread::ToDeoptAfter(deopt_id);
|
| - if (is_optimizing()) {
|
| + if (Compiler::always_optimize()) {
|
| + // Megamorphic calls may occur in slow path stubs.
|
| + // If valid use try_index argument.
|
| + if (try_index == CatchClauseNode::kInvalidTryIndex) {
|
| + try_index = CurrentTryIndex();
|
| + }
|
| + pc_descriptors_list()->AddDescriptor(RawPcDescriptors::kOther,
|
| + assembler()->CodeSize(),
|
| + Thread::kNoDeoptId,
|
| + token_pos,
|
| + try_index);
|
| + } else if (is_optimizing()) {
|
| AddDeoptIndexAtCall(deopt_id_after, token_pos);
|
| } else {
|
| // Add deoptimization continuation point after the call and before the
|
|
|