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

Unified Diff: runtime/vm/dart_entry.cc

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/dart_entry.h ('k') | runtime/vm/flow_graph_builder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/dart_entry.cc
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index ae775142908c24fdd1a07fc385ef9a2874d23039..397db9e17f794686bd5f0566e619d4e7ebea941c 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -24,8 +24,9 @@ RawArray* ArgumentsDescriptor::cached_args_descriptors_[kCachedDescriptorCount];
RawObject* DartEntry::InvokeFunction(const Function& function,
const Array& arguments) {
ASSERT(Thread::Current()->IsMutatorThread());
+ const int kTypeArgsLen = 0; // No support to pass type args to generic func.
const Array& arguments_descriptor =
- Array::Handle(ArgumentsDescriptor::New(arguments.Length()));
+ Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length()));
return InvokeFunction(function, arguments, arguments_descriptor);
}
@@ -128,8 +129,9 @@ RawObject* DartEntry::InvokeFunction(const Function& function,
RawObject* DartEntry::InvokeClosure(const Array& arguments) {
+ const int kTypeArgsLen = 0; // No support to pass type args to generic func.
const Array& arguments_descriptor =
- Array::Handle(ArgumentsDescriptor::New(arguments.Length()));
+ Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, arguments.Length()));
return InvokeClosure(arguments, arguments_descriptor);
}
@@ -147,7 +149,8 @@ RawObject* DartEntry::InvokeClosure(const Array& arguments,
if (instance.IsCallable(&function)) {
// Only invoke the function if its arguments are compatible.
const ArgumentsDescriptor args_desc(arguments_descriptor);
- if (function.AreValidArgumentCounts(args_desc.Count(),
+ if (function.AreValidArgumentCounts(args_desc.TypeArgsLen(),
+ args_desc.Count(),
args_desc.NamedCount(), NULL)) {
// The closure or non-closure object (receiver) is passed as implicit
// first argument. It is already included in the arguments array.
@@ -237,9 +240,10 @@ RawObject* DartEntry::InvokeNoSuchMethod(const Instance& receiver,
}
// Now use the invocation mirror object and invoke NoSuchMethod.
+ const int kTypeArgsLen = 0;
const int kNumArguments = 2;
ArgumentsDescriptor args_desc(
- Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
+ Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
Function& function = Function::Handle(
Resolver::ResolveDynamic(receiver, Symbols::NoSuchMethod(), args_desc));
if (function.IsNull()) {
@@ -261,6 +265,10 @@ RawObject* DartEntry::InvokeNoSuchMethod(const Instance& receiver,
ArgumentsDescriptor::ArgumentsDescriptor(const Array& array) : array_(array) {}
+intptr_t ArgumentsDescriptor::TypeArgsLen() const {
+ return Smi::Cast(Object::Handle(array_.At(kTypeArgsLenIndex))).Value();
+}
+
intptr_t ArgumentsDescriptor::Count() const {
return Smi::Cast(Object::Handle(array_.At(kCountIndex))).Value();
@@ -294,6 +302,11 @@ bool ArgumentsDescriptor::MatchesNameAt(intptr_t index,
}
+intptr_t ArgumentsDescriptor::type_args_len_offset() {
+ return Array::element_offset(kTypeArgsLenIndex);
+}
+
+
intptr_t ArgumentsDescriptor::count_offset() {
return Array::element_offset(kCountIndex);
}
@@ -309,25 +322,31 @@ intptr_t ArgumentsDescriptor::first_named_entry_offset() {
}
-RawArray* ArgumentsDescriptor::New(intptr_t num_arguments,
+RawArray* ArgumentsDescriptor::New(intptr_t type_args_len,
+ intptr_t num_arguments,
const Array& optional_arguments_names) {
const intptr_t num_named_args =
optional_arguments_names.IsNull() ? 0 : optional_arguments_names.Length();
if (num_named_args == 0) {
- return ArgumentsDescriptor::New(num_arguments);
+ return ArgumentsDescriptor::New(type_args_len, num_arguments);
}
+ ASSERT(type_args_len >= 0);
+ ASSERT(num_arguments >= 0);
const intptr_t num_pos_args = num_arguments - num_named_args;
- // Build the arguments descriptor array, which consists of the total
- // argument count; the positional argument count; a sequence of (name,
- // position) pairs, sorted by name, for each named optional argument; and
- // a terminating null to simplify iterating in generated code.
+ // Build the arguments descriptor array, which consists of the the type
+ // argument vector length (0 if none); total argument count; the positional
+ // argument count; a sequence of (name, position) pairs, sorted by name, for
+ // each named optional argument; and a terminating null to simplify iterating
+ // in generated code.
Thread* thread = Thread::Current();
Zone* zone = thread->zone();
const intptr_t descriptor_len = LengthFor(num_named_args);
Array& descriptor =
Array::Handle(zone, Array::New(descriptor_len, Heap::kOld));
+ // Set length of type argument vector.
+ descriptor.SetAt(kTypeArgsLenIndex, Smi::Handle(Smi::New(type_args_len)));
// Set total number of passed arguments.
descriptor.SetAt(kCountIndex, Smi::Handle(Smi::New(num_arguments)));
// Set number of positional arguments.
@@ -368,7 +387,9 @@ RawArray* ArgumentsDescriptor::New(intptr_t num_arguments,
}
-RawArray* ArgumentsDescriptor::New(intptr_t num_arguments) {
+RawArray* ArgumentsDescriptor::New(intptr_t type_args_len,
+ intptr_t num_arguments) {
+ ASSERT(type_args_len >= 0);
ASSERT(num_arguments >= 0);
if (num_arguments < kCachedDescriptorCount) {
return cached_args_descriptors_[num_arguments];
@@ -379,9 +400,9 @@ RawArray* ArgumentsDescriptor::New(intptr_t num_arguments) {
RawArray* ArgumentsDescriptor::NewNonCached(intptr_t num_arguments,
bool canonicalize) {
- // Build the arguments descriptor array, which consists of the total
- // argument count; the positional argument count; and
- // a terminating null to simplify iterating in generated code.
+ // Build the arguments descriptor array, which consists of the zero length
+ // type argument vector, total argument count; the positional argument count;
+ // and a terminating null to simplify iterating in generated code.
Thread* thread = Thread::Current();
Zone* zone = thread->zone();
const intptr_t descriptor_len = LengthFor(0);
@@ -389,6 +410,9 @@ RawArray* ArgumentsDescriptor::NewNonCached(intptr_t num_arguments,
Array::Handle(zone, Array::New(descriptor_len, Heap::kOld));
const Smi& arg_count = Smi::Handle(zone, Smi::New(num_arguments));
+ // Set zero length type argument vector.
+ descriptor.SetAt(kTypeArgsLenIndex, Smi::Handle(zone, Smi::New(0)));
+
// Set total number of passed arguments.
descriptor.SetAt(kCountIndex, arg_count);
@@ -449,9 +473,10 @@ RawObject* DartLibraryCalls::InstanceCreate(const Library& lib,
RawObject* DartLibraryCalls::ToString(const Instance& receiver) {
+ const int kTypeArgsLen = 0;
const int kNumArguments = 1; // Receiver.
ArgumentsDescriptor args_desc(
- Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
+ Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
const Function& function = Function::Handle(
Resolver::ResolveDynamic(receiver, Symbols::toString(), args_desc));
ASSERT(!function.IsNull());
@@ -465,9 +490,10 @@ RawObject* DartLibraryCalls::ToString(const Instance& receiver) {
RawObject* DartLibraryCalls::HashCode(const Instance& receiver) {
+ const int kTypeArgsLen = 0;
const int kNumArguments = 1; // Receiver.
ArgumentsDescriptor args_desc(
- Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
+ Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
const Function& function = Function::Handle(
Resolver::ResolveDynamic(receiver, Symbols::hashCode(), args_desc));
ASSERT(!function.IsNull());
@@ -482,9 +508,10 @@ RawObject* DartLibraryCalls::HashCode(const Instance& receiver) {
RawObject* DartLibraryCalls::Equals(const Instance& left,
const Instance& right) {
+ const int kTypeArgsLen = 0;
const int kNumArguments = 2;
ArgumentsDescriptor args_desc(
- Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
+ Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
const Function& function = Function::Handle(
Resolver::ResolveDynamic(left, Symbols::EqualOperator(), args_desc));
ASSERT(!function.IsNull());
@@ -501,25 +528,28 @@ RawObject* DartLibraryCalls::Equals(const Instance& left,
RawObject* DartLibraryCalls::LookupHandler(Dart_Port port_id) {
Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
Function& function = Function::Handle(
- thread->zone(), thread->isolate()->object_store()->lookup_port_handler());
+ zone, thread->isolate()->object_store()->lookup_port_handler());
+ const int kTypeArgsLen = 0;
const int kNumArguments = 1;
if (function.IsNull()) {
- Library& isolate_lib = Library::Handle(Library::IsolateLibrary());
+ Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
ASSERT(!isolate_lib.IsNull());
- const String& class_name =
- String::Handle(isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
- const String& function_name =
- String::Handle(isolate_lib.PrivateName(Symbols::_lookupHandler()));
+ const String& class_name = String::Handle(
+ zone, isolate_lib.PrivateName(Symbols::_RawReceivePortImpl()));
+ const String& function_name = String::Handle(
+ zone, isolate_lib.PrivateName(Symbols::_lookupHandler()));
function = Resolver::ResolveStatic(isolate_lib, class_name, function_name,
- kNumArguments, Object::empty_array());
+ kTypeArgsLen, kNumArguments,
+ Object::empty_array());
ASSERT(!function.IsNull());
thread->isolate()->object_store()->set_lookup_port_handler(function);
}
- const Array& args = Array::Handle(Array::New(kNumArguments));
- args.SetAt(0, Integer::Handle(Integer::New(port_id)));
+ const Array& args = Array::Handle(zone, Array::New(kNumArguments));
+ args.SetAt(0, Integer::Handle(zone, Integer::New(port_id)));
const Object& result =
- Object::Handle(DartEntry::InvokeFunction(function, args));
+ Object::Handle(zone, DartEntry::InvokeFunction(function, args));
return result.raw();
}
@@ -531,6 +561,7 @@ RawObject* DartLibraryCalls::HandleMessage(const Object& handler,
Isolate* isolate = thread->isolate();
Function& function = Function::Handle(
zone, isolate->object_store()->handle_message_function());
+ const int kTypeArgsLen = 0;
const int kNumArguments = 2;
if (function.IsNull()) {
Library& isolate_lib = Library::Handle(zone, Library::IsolateLibrary());
@@ -540,7 +571,8 @@ RawObject* DartLibraryCalls::HandleMessage(const Object& handler,
const String& function_name = String::Handle(
zone, isolate_lib.PrivateName(Symbols::_handleMessage()));
function = Resolver::ResolveStatic(isolate_lib, class_name, function_name,
- kNumArguments, Object::empty_array());
+ kTypeArgsLen, kNumArguments,
+ Object::empty_array());
ASSERT(!function.IsNull());
isolate->object_store()->set_handle_message_function(function);
}
@@ -577,9 +609,10 @@ RawObject* DartLibraryCalls::DrainMicrotaskQueue() {
RawObject* DartLibraryCalls::MapSetAt(const Instance& map,
const Instance& key,
const Instance& value) {
+ const int kTypeArgsLen = 0;
const int kNumArguments = 3;
ArgumentsDescriptor args_desc(
- Array::Handle(ArgumentsDescriptor::New(kNumArguments)));
+ Array::Handle(ArgumentsDescriptor::New(kTypeArgsLen, kNumArguments)));
const Function& function = Function::Handle(
Resolver::ResolveDynamic(map, Symbols::AssignIndexToken(), args_desc));
ASSERT(!function.IsNull());
« no previous file with comments | « runtime/vm/dart_entry.h ('k') | runtime/vm/flow_graph_builder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698