Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Unified Diff: runtime/vm/flow_graph_compiler.cc

Issue 2859673002: Pass type argument vector to generic functions (if --reify-generic-functions is (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/flow_graph_compiler.cc
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 3fbeb86ece5f866050f9c32d51969abdfe0c183b..d68d951c402624bb8d9216c1039206fc6d4767ac 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -1197,15 +1197,18 @@ void FlowGraphCompiler::GenerateInstanceCall(intptr_t deopt_id,
void FlowGraphCompiler::GenerateStaticCall(intptr_t deopt_id,
TokenPosition token_pos,
const Function& function,
+ intptr_t type_args_len,
Vyacheslav Egorov (Google) 2017/05/04 12:12:22 I wonder if triple of <type-args-len, pushed_argc,
regis 2017/05/09 18:31:23 Done.
intptr_t argument_count,
const Array& argument_names,
LocationSummary* locs,
const ICData& ic_data_in) {
const ICData& ic_data = ICData::ZoneHandle(ic_data_in.Original());
- const Array& arguments_descriptor =
- Array::ZoneHandle(ic_data.IsNull() ? ArgumentsDescriptor::New(
- argument_count, argument_names)
- : ic_data.arguments_descriptor());
+ const Array& arguments_descriptor = Array::ZoneHandle(
+ ic_data.IsNull()
+ ? ArgumentsDescriptor::New(
+ type_args_len, argument_count - (type_args_len > 0 ? 1 : 0),
+ argument_names)
+ : ic_data.arguments_descriptor());
if (is_optimizing()) {
EmitOptimizedStaticCall(function, arguments_descriptor, argument_count,
deopt_id, token_pos, locs);
@@ -1843,6 +1846,7 @@ bool FlowGraphCompiler::LookupMethodFor(int class_id,
void FlowGraphCompiler::EmitPolymorphicInstanceCall(
const CallTargets& targets,
const InstanceCallInstr& original_call,
+ intptr_t type_args_len,
intptr_t argument_count,
const Array& argument_names,
intptr_t deopt_id,
@@ -1854,8 +1858,8 @@ void FlowGraphCompiler::EmitPolymorphicInstanceCall(
Label* deopt =
AddDeoptStub(deopt_id, ICData::kDeoptPolymorphicInstanceCallTestFail);
Label ok;
- EmitTestAndCall(targets, original_call.function_name(), argument_count,
- argument_names,
+ EmitTestAndCall(targets, original_call.function_name(), type_args_len,
+ argument_count, argument_names,
deopt, // No cid match.
&ok, // Found cid.
deopt_id, token_pos, locs, complete, total_ic_calls);
@@ -1863,8 +1867,8 @@ void FlowGraphCompiler::EmitPolymorphicInstanceCall(
} else {
if (complete) {
Label ok;
- EmitTestAndCall(targets, original_call.function_name(), argument_count,
- argument_names,
+ EmitTestAndCall(targets, original_call.function_name(), type_args_len,
+ argument_count, argument_names,
NULL, // No cid match.
&ok, // Found cid.
deopt_id, token_pos, locs, true, total_ic_calls);
@@ -1882,6 +1886,7 @@ void FlowGraphCompiler::EmitPolymorphicInstanceCall(
#define __ assembler()->
void FlowGraphCompiler::EmitTestAndCall(const CallTargets& targets,
const String& function_name,
+ intptr_t type_args_len,
intptr_t argument_count,
const Array& argument_names,
Label* failed,
@@ -1894,7 +1899,9 @@ void FlowGraphCompiler::EmitTestAndCall(const CallTargets& targets,
ASSERT(is_optimizing());
const Array& arguments_descriptor = Array::ZoneHandle(
- zone(), ArgumentsDescriptor::New(argument_count, argument_names));
+ zone(), ArgumentsDescriptor::New(
+ type_args_len, argument_count - (type_args_len > 0 ? 1 : 0),
+ argument_names));
EmitTestAndCallLoadReceiver(argument_count, arguments_descriptor);

Powered by Google App Engine
This is Rietveld 408576698