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

Unified Diff: runtime/vm/intermediate_language.h

Issue 2859673002: Pass type argument vector to generic functions (if --reify-generic-functions is (Closed)
Patch Set: address review comments and sync Created 3 years, 7 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
« no previous file with comments | « runtime/vm/flow_graph_inliner.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intermediate_language.h
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index ff3822cf9754846491807a5a7f95e99c5ca8b044..806acfc938972dd5e3044a300d466e5d3db1665d 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -2753,39 +2753,99 @@ class CurrentContextInstr : public TemplateDefinition<0, NoThrow> {
};
-class ClosureCallInstr : public TemplateDefinition<1, Throws> {
+struct ArgumentsInfo {
+ ArgumentsInfo(intptr_t type_args_len,
+ intptr_t pushed_argc,
+ const Array& argument_names)
+ : type_args_len(type_args_len),
+ pushed_argc(pushed_argc),
+ argument_names(argument_names) {}
+
+ RawArray* ToArgumentsDescriptor() const {
+ return ArgumentsDescriptor::New(type_args_len,
+ pushed_argc - (type_args_len > 0 ? 1 : 0),
+ argument_names);
+ }
+
+ intptr_t type_args_len;
+ intptr_t pushed_argc;
+ const Array& argument_names;
+};
+
+
+template <intptr_t kInputCount>
+class TemplateDartCall : public TemplateDefinition<kInputCount, Throws> {
+ public:
+ TemplateDartCall(intptr_t deopt_id,
+ intptr_t type_args_len,
+ const Array& argument_names,
+ ZoneGrowableArray<PushArgumentInstr*>* arguments,
+ TokenPosition token_pos)
+ : TemplateDefinition<kInputCount, Throws>(deopt_id),
+ type_args_len_(type_args_len),
+ argument_names_(argument_names),
+ arguments_(arguments),
+ token_pos_(token_pos) {
+ ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
+ }
+
+ intptr_t FirstParamIndex() const { return type_args_len() > 0 ? 1 : 0; }
+ intptr_t ArgumentCountWithoutTypeArgs() const {
+ return arguments_->length() - FirstParamIndex();
+ }
+ // ArgumentCount() includes the type argument vector if any.
+ virtual intptr_t ArgumentCount() const { return arguments_->length(); }
+ virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
+ return (*arguments_)[index];
+ }
+ intptr_t type_args_len() const { return type_args_len_; }
+ const Array& argument_names() const { return argument_names_; }
+ virtual TokenPosition token_pos() const { return token_pos_; }
+ RawArray* GetArgumentsDescriptor() const {
+ return ArgumentsDescriptor::New(
+ type_args_len(), ArgumentCountWithoutTypeArgs(), argument_names());
+ }
+
+ private:
+ intptr_t type_args_len_;
+ const Array& argument_names_;
+ ZoneGrowableArray<PushArgumentInstr*>* arguments_;
+ TokenPosition token_pos_;
+
+ DISALLOW_COPY_AND_ASSIGN(TemplateDartCall);
+};
+
+
+class ClosureCallInstr : public TemplateDartCall<1> {
public:
ClosureCallInstr(Value* function,
ClosureCallNode* node,
ZoneGrowableArray<PushArgumentInstr*>* arguments)
- : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
- argument_names_(node->arguments()->names()),
- token_pos_(node->token_pos()),
- arguments_(arguments) {
+ : TemplateDartCall(Thread::Current()->GetNextDeoptId(),
+ node->arguments()->type_args_len(),
+ node->arguments()->names(),
+ arguments,
+ node->token_pos()) {
+ ASSERT(!arguments->is_empty());
SetInputAt(0, function);
}
ClosureCallInstr(Value* function,
ZoneGrowableArray<PushArgumentInstr*>* arguments,
+ intptr_t type_args_len,
const Array& argument_names,
TokenPosition token_pos)
- : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
- argument_names_(argument_names),
- token_pos_(token_pos),
- arguments_(arguments) {
+ : TemplateDartCall(Thread::Current()->GetNextDeoptId(),
+ type_args_len,
+ argument_names,
+ arguments,
+ token_pos) {
+ ASSERT(!arguments->is_empty());
SetInputAt(0, function);
}
DECLARE_INSTRUCTION(ClosureCall)
- const Array& argument_names() const { return argument_names_; }
- virtual TokenPosition token_pos() const { return token_pos_; }
-
- virtual intptr_t ArgumentCount() const { return arguments_->length(); }
- virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
- return (*arguments_)[index];
- }
-
// TODO(kmillikin): implement exact call counts for closure calls.
virtual intptr_t CallCount() const { return 1; }
@@ -2796,36 +2856,33 @@ class ClosureCallInstr : public TemplateDefinition<1, Throws> {
PRINT_OPERANDS_TO_SUPPORT
private:
- const Array& argument_names_;
- TokenPosition token_pos_;
- ZoneGrowableArray<PushArgumentInstr*>* arguments_;
-
DISALLOW_COPY_AND_ASSIGN(ClosureCallInstr);
};
-class InstanceCallInstr : public TemplateDefinition<0, Throws> {
+class InstanceCallInstr : public TemplateDartCall<0> {
public:
InstanceCallInstr(TokenPosition token_pos,
const String& function_name,
Token::Kind token_kind,
ZoneGrowableArray<PushArgumentInstr*>* arguments,
+ intptr_t type_args_len,
const Array& argument_names,
intptr_t checked_argument_count,
const ZoneGrowableArray<const ICData*>& ic_data_array)
- : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
+ : TemplateDartCall(Thread::Current()->GetNextDeoptId(),
+ type_args_len,
+ argument_names,
+ arguments,
+ token_pos),
ic_data_(NULL),
- token_pos_(token_pos),
function_name_(function_name),
token_kind_(token_kind),
- arguments_(arguments),
- argument_names_(argument_names),
checked_argument_count_(checked_argument_count),
has_unique_selector_(false) {
ic_data_ = GetICData(ic_data_array);
ASSERT(function_name.IsNotTemporaryScopedHandle());
ASSERT(!arguments->is_empty());
- ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
ASSERT(Token::IsBinaryOperator(token_kind) ||
Token::IsEqualityOperator(token_kind) ||
Token::IsRelationalOperator(token_kind) ||
@@ -2844,14 +2901,8 @@ class InstanceCallInstr : public TemplateDefinition<0, Throws> {
// ICData can be replaced by optimizer.
void set_ic_data(const ICData* value) { ic_data_ = value; }
- virtual TokenPosition token_pos() const { return token_pos_; }
const String& function_name() const { return function_name_; }
Token::Kind token_kind() const { return token_kind_; }
- virtual intptr_t ArgumentCount() const { return arguments_->length(); }
- virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
- return (*arguments_)[index];
- }
- const Array& argument_names() const { return argument_names_; }
intptr_t checked_argument_count() const { return checked_argument_count_; }
bool has_unique_selector() const { return has_unique_selector_; }
@@ -2873,17 +2924,16 @@ class InstanceCallInstr : public TemplateDefinition<0, Throws> {
bool MatchesCoreName(const String& name);
+ RawFunction* ResolveForReceiverClass(const Class& cls);
+
protected:
friend class JitOptimizer;
void set_ic_data(ICData* value) { ic_data_ = value; }
private:
const ICData* ic_data_;
- const TokenPosition token_pos_;
const String& function_name_;
const Token::Kind token_kind_; // Binary op, unary op, kGET or kILLEGAL.
- ZoneGrowableArray<PushArgumentInstr*>* const arguments_;
- const Array& argument_names_;
const intptr_t checked_argument_count_;
bool has_unique_selector_;
@@ -2934,9 +2984,9 @@ class PolymorphicInstanceCallInstr : public TemplateDefinition<0, Throws> {
virtual intptr_t CallCount() const;
// If this polymophic call site was created to cover the remaining cids after
- // inlinng then we need to keep track of the total number of calls including
- // the ones that wer inlined. This is different from the CallCount above: Eg
- // if there were 100 calls originally, distributed across three class-ids in
+ // inlining then we need to keep track of the total number of calls including
+ // the ones that we inlined. This is different from the CallCount above: Eg
+ // if there were 100 calls originally, distributed across three class-ids in
// the ratio 50, 40, 7, 3. The first two were inlined, so now we have only
// 10 calls in the CallCount above, but the heuristics need to know that the
// last two cids cover 7% and 3% of the calls, not 70% and 30%.
@@ -3263,45 +3313,47 @@ class IfThenElseInstr : public Definition {
};
-class StaticCallInstr : public TemplateDefinition<0, Throws> {
+class StaticCallInstr : public TemplateDartCall<0> {
public:
StaticCallInstr(TokenPosition token_pos,
const Function& function,
+ intptr_t type_args_len,
const Array& argument_names,
ZoneGrowableArray<PushArgumentInstr*>* arguments,
const ZoneGrowableArray<const ICData*>& ic_data_array)
- : TemplateDefinition(Thread::Current()->GetNextDeoptId()),
+ : TemplateDartCall(Thread::Current()->GetNextDeoptId(),
+ type_args_len,
+ argument_names,
+ arguments,
+ token_pos),
ic_data_(NULL),
- token_pos_(token_pos),
function_(function),
- argument_names_(argument_names),
- arguments_(arguments),
result_cid_(kDynamicCid),
is_known_list_constructor_(false),
identity_(AliasIdentity::Unknown()) {
ic_data_ = GetICData(ic_data_array);
ASSERT(function.IsZoneHandle());
ASSERT(!function.IsNull());
- ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
}
StaticCallInstr(TokenPosition token_pos,
const Function& function,
+ intptr_t type_args_len,
const Array& argument_names,
ZoneGrowableArray<PushArgumentInstr*>* arguments,
intptr_t deopt_id)
- : TemplateDefinition(deopt_id),
+ : TemplateDartCall(deopt_id,
+ type_args_len,
+ argument_names,
+ arguments,
+ token_pos),
ic_data_(NULL),
- token_pos_(token_pos),
function_(function),
- argument_names_(argument_names),
- arguments_(arguments),
result_cid_(kDynamicCid),
is_known_list_constructor_(false),
identity_(AliasIdentity::Unknown()) {
ASSERT(function.IsZoneHandle());
ASSERT(!function.IsNull());
- ASSERT(argument_names.IsZoneHandle() || argument_names.InVMHeap());
}
// ICData for static calls carries call count.
@@ -3316,13 +3368,6 @@ class StaticCallInstr : public TemplateDefinition<0, Throws> {
// Accessors forwarded to the AST node.
const Function& function() const { return function_; }
- const Array& argument_names() const { return argument_names_; }
- virtual TokenPosition token_pos() const { return token_pos_; }
-
- virtual intptr_t ArgumentCount() const { return arguments_->length(); }
- virtual PushArgumentInstr* PushArgumentAt(intptr_t index) const {
- return (*arguments_)[index];
- }
virtual intptr_t CallCount() const {
return ic_data() == NULL ? 0 : ic_data()->AggregateCount();
@@ -3354,10 +3399,7 @@ class StaticCallInstr : public TemplateDefinition<0, Throws> {
private:
const ICData* ic_data_;
- const TokenPosition token_pos_;
const Function& function_;
- const Array& argument_names_;
- ZoneGrowableArray<PushArgumentInstr*>* arguments_;
intptr_t result_cid_; // For some library functions we know the result.
// 'True' for recognized list constructors.
@@ -6780,6 +6822,7 @@ class CheckedSmiOpInstr : public TemplateDefinition<2, Throws> {
Value* right,
InstanceCallInstr* call)
: TemplateDefinition(call->deopt_id()), call_(call), op_kind_(op_kind) {
+ ASSERT(call->type_args_len() == 0);
SetInputAt(0, left);
SetInputAt(1, right);
}
@@ -6815,6 +6858,7 @@ class CheckedSmiComparisonInstr : public TemplateComparison<2, Throws> {
: TemplateComparison(call->token_pos(), op_kind, call->deopt_id()),
call_(call),
is_negated_(false) {
+ ASSERT(call->type_args_len() == 0);
SetInputAt(0, left);
SetInputAt(1, right);
}
« no previous file with comments | « runtime/vm/flow_graph_inliner.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698