| Index: runtime/vm/flow_graph_compiler_arm64.cc
|
| diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
|
| index 53429c8bda2bc2b539b327a3997b8030ee407e35..09800a9ec68719f99f45a8cdb2f097ac18763f69 100644
|
| --- a/runtime/vm/flow_graph_compiler_arm64.cc
|
| +++ b/runtime/vm/flow_graph_compiler_arm64.cc
|
| @@ -28,6 +28,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_);
|
| + __ b(exit_label());
|
| +#undef __
|
| +}
|
| +
|
| +
|
| FlowGraphCompiler::~FlowGraphCompiler() {
|
| // BlockInfos are zone-allocated, so their destructors are not called.
|
| // Verify the labels explicitly here.
|
| @@ -1248,7 +1260,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());
|
| @@ -1270,7 +1283,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
|
|
|