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

Unified Diff: runtime/vm/parser.cc

Issue 154393003: Implement eager instantiation and canonicalization of type arguments at run (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 10 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/parser.cc
===================================================================
--- runtime/vm/parser.cc (revision 32446)
+++ runtime/vm/parser.cc (working copy)
@@ -2838,7 +2838,7 @@
ASSERT(current_class().raw() == func.Owner());
params.AddReceiver(ReceiverType(current_class()), func.token_pos());
} else if (func.IsFactory()) {
- // The first parameter of a factory is the AbstractTypeArguments vector of
+ // The first parameter of a factory is the TypeArguments vector of
// the type of the instance to be allocated.
params.AddFinalParameter(
TokenPos(),
@@ -3106,7 +3106,7 @@
const intptr_t formal_param_pos = TokenPos();
method->params.Clear();
// Static functions do not have a receiver.
- // The first parameter of a factory is the AbstractTypeArguments vector of
+ // The first parameter of a factory is the TypeArguments vector of
// the type of the instance to be allocated.
if (!method->has_static || method->IsConstructor()) {
method->params.AddReceiver(ReceiverType(current_class()), formal_param_pos);
@@ -4447,7 +4447,7 @@
}
-RawAbstractTypeArguments* Parser::ParseTypeArguments(
+RawTypeArguments* Parser::ParseTypeArguments(
ClassFinalizer::FinalizationKind finalization) {
TRACE_PARSER("ParseTypeArguments");
if (CurrentToken() == Token::kLT) {
@@ -5726,8 +5726,8 @@
// Since the signature type is cached by the signature class, it may have
// been finalized already.
Type& signature_type = Type::Handle(signature_class.SignatureType());
- AbstractTypeArguments& signature_type_arguments =
- AbstractTypeArguments::Handle(signature_type.arguments());
+ TypeArguments& signature_type_arguments =
+ TypeArguments::Handle(signature_type.arguments());
if (!signature_type.IsFinalized()) {
signature_type ^= ClassFinalizer::FinalizeType(
@@ -5841,7 +5841,7 @@
// of int, double, String, or bool, then preset the field with the value and
// perform the type check (in checked mode only) at finalization time.
if (type.IsTypeParameter() ||
- (type.arguments() != AbstractTypeArguments::null())) {
+ (type.arguments() != TypeArguments::null())) {
// Type parameters are always resolved eagerly by the parser and never
// resolved later by the class finalizer. Therefore, we know here that if
// 'type' is not a type parameter (an unresolved type will not get resolved
@@ -8702,7 +8702,7 @@
}
// A type parameter cannot be parameterized, so make the type
// malformed if type arguments have previously been parsed.
- if (!AbstractTypeArguments::Handle(type->arguments()).IsNull()) {
+ if (!TypeArguments::Handle(type->arguments()).IsNull()) {
*type = ClassFinalizer::NewFinalizedMalformedType(
Error::Handle(), // No previous error.
script_,
@@ -8745,8 +8745,8 @@
}
}
// Resolve type arguments, if any.
- const AbstractTypeArguments& arguments =
- AbstractTypeArguments::Handle(type->arguments());
+ const TypeArguments& arguments = TypeArguments::Handle(type->arguments());
+ TypeArguments::Handle(type->arguments());
if (!arguments.IsNull()) {
const intptr_t num_arguments = arguments.Length();
for (intptr_t i = 0; i < num_arguments; i++) {
@@ -8924,7 +8924,7 @@
RawObject* Parser::EvaluateConstConstructorCall(
const Class& type_class,
- const AbstractTypeArguments& type_arguments,
+ const TypeArguments& type_arguments,
const Function& constructor,
ArgumentListNode* arguments) {
// Factories have one extra argument: the type arguments.
@@ -8940,7 +8940,7 @@
ErrorMsg("type must be constant in const constructor");
}
instance.SetTypeArguments(
- AbstractTypeArguments::Handle(type_arguments.Canonicalize()));
+ TypeArguments::Handle(type_arguments.Canonicalize()));
}
arg_values.SetAt(0, instance);
arg_values.SetAt(1, Smi::Handle(Smi::New(Function::kCtorPhaseAll)));
@@ -9334,7 +9334,7 @@
*type_name.ident,
type_name.ident_pos);
}
- AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(
+ TypeArguments& type_arguments = TypeArguments::Handle(
isolate(), ParseTypeArguments(finalization));
if (finalization == ClassFinalizer::kIgnore) {
return Type::DynamicType();
@@ -9353,11 +9353,12 @@
void Parser::CheckConstructorCallTypeArguments(
intptr_t pos, Function& constructor,
- const AbstractTypeArguments& type_arguments) {
+ const TypeArguments& type_arguments) {
if (!type_arguments.IsNull()) {
const Class& constructor_class = Class::Handle(constructor.Owner());
ASSERT(!constructor_class.IsNull());
ASSERT(constructor_class.is_finalized());
+ ASSERT(type_arguments.IsCanonical());
// Do not report the expected vs. actual number of type arguments, because
// the type argument vector is flattened and raw types are allowed.
if (type_arguments.Length() != constructor_class.NumTypeArguments()) {
@@ -9373,7 +9374,7 @@
// as one token of type Token::kINDEX.
AstNode* Parser::ParseListLiteral(intptr_t type_pos,
bool is_const,
- const AbstractTypeArguments& type_arguments) {
+ const TypeArguments& type_arguments) {
TRACE_PARSER("ParseListLiteral");
ASSERT(type_pos >= 0);
ASSERT(CurrentToken() == Token::kLBRACK || CurrentToken() == Token::kINDEX);
@@ -9382,8 +9383,8 @@
ConsumeToken();
AbstractType& element_type = Type::ZoneHandle(Type::DynamicType());
- AbstractTypeArguments& list_type_arguments =
- AbstractTypeArguments::ZoneHandle(type_arguments.raw());
+ TypeArguments& list_type_arguments =
+ TypeArguments::ZoneHandle(type_arguments.raw());
// If no type argument vector is provided, leave it as null, which is
// equivalent to using dynamic as the type argument for the element type.
if (!list_type_arguments.IsNull()) {
@@ -9394,7 +9395,7 @@
ASSERT(!element_type.IsMalformed()); // Would be mapped to dynamic.
ASSERT(!element_type.IsMalbounded()); // No declared bound in List.
if (element_type.IsDynamicType()) {
- list_type_arguments = AbstractTypeArguments::null();
+ list_type_arguments = TypeArguments::null();
} else if (is_const && !element_type.IsInstantiated()) {
ErrorMsg(type_pos,
"the type argument of a constant list literal cannot include "
@@ -9407,7 +9408,7 @@
"the element type");
}
// Ignore type arguments.
- list_type_arguments = AbstractTypeArguments::null();
+ list_type_arguments = TypeArguments::null();
}
}
ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1));
@@ -9449,7 +9450,7 @@
Array& const_list =
Array::ZoneHandle(Array::New(element_list.length(), Heap::kOld));
const_list.SetTypeArguments(
- AbstractTypeArguments::Handle(list_type_arguments.Canonicalize()));
+ TypeArguments::Handle(list_type_arguments.Canonicalize()));
Error& malformed_error = Error::Handle();
for (int i = 0; i < element_list.length(); i++) {
AstNode* elem = element_list[i];
@@ -9492,8 +9493,8 @@
// Make sure that the instantiator is captured.
CaptureInstantiator();
}
- AbstractTypeArguments& factory_type_args =
- AbstractTypeArguments::ZoneHandle(list_type_arguments.raw());
+ TypeArguments& factory_type_args =
+ TypeArguments::ZoneHandle(list_type_arguments.raw());
// If the factory class extends other parameterized classes, adjust the
// type argument vector.
if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) {
@@ -9527,7 +9528,7 @@
ConstructorCallNode* Parser::CreateConstructorCallNode(
intptr_t token_pos,
- const AbstractTypeArguments& type_arguments,
+ const TypeArguments& type_arguments,
const Function& constructor,
ArgumentListNode* arguments) {
if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
@@ -9567,7 +9568,7 @@
AstNode* Parser::ParseMapLiteral(intptr_t type_pos,
bool is_const,
- const AbstractTypeArguments& type_arguments) {
+ const TypeArguments& type_arguments) {
TRACE_PARSER("ParseMapLiteral");
ASSERT(type_pos >= 0);
ASSERT(CurrentToken() == Token::kLBRACE);
@@ -9576,8 +9577,8 @@
AbstractType& key_type = Type::ZoneHandle(Type::DynamicType());
AbstractType& value_type = Type::ZoneHandle(Type::DynamicType());
- AbstractTypeArguments& map_type_arguments =
- AbstractTypeArguments::ZoneHandle(type_arguments.raw());
+ TypeArguments& map_type_arguments =
+ TypeArguments::ZoneHandle(type_arguments.raw());
// If no type argument vector is provided, leave it as null, which is
// equivalent to using dynamic as the type argument for the both key and value
// types.
@@ -9592,7 +9593,7 @@
// No declared bounds in Map.
ASSERT(!key_type.IsMalbounded() && !value_type.IsMalbounded());
if (key_type.IsDynamicType() && value_type.IsDynamicType()) {
- map_type_arguments = AbstractTypeArguments::null();
+ map_type_arguments = TypeArguments::null();
} else if (is_const && !type_arguments.IsInstantiated()) {
ErrorMsg(type_pos,
"the type arguments of a constant map literal cannot include "
@@ -9605,7 +9606,7 @@
"the key type and the value type");
}
// Ignore type arguments.
- map_type_arguments = AbstractTypeArguments::null();
+ map_type_arguments = TypeArguments::null();
}
}
ASSERT(map_type_arguments.IsNull() || (map_type_arguments.Length() == 2));
@@ -9688,7 +9689,7 @@
(!arg->AsLiteralNode()->literal().IsNull() &&
!arg->AsLiteralNode()->literal().IsInstanceOf(
arg_type,
- Object::null_abstract_type_arguments(),
+ Object::null_type_arguments(),
&malformed_error))) {
// If the failure is due to a malformed type error, display it.
if (!malformed_error.IsNull()) {
@@ -9750,8 +9751,8 @@
// Make sure that the instantiator is captured.
CaptureInstantiator();
}
- AbstractTypeArguments& factory_type_args =
- AbstractTypeArguments::ZoneHandle(map_type_arguments.raw());
+ TypeArguments& factory_type_args =
+ TypeArguments::ZoneHandle(map_type_arguments.raw());
// If the factory class extends other parameterized classes, adjust the
// type argument vector.
if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) {
@@ -9790,7 +9791,7 @@
ConsumeToken();
}
const intptr_t type_pos = TokenPos();
- AbstractTypeArguments& type_arguments = AbstractTypeArguments::Handle(
+ TypeArguments& type_arguments = TypeArguments::Handle(
ParseTypeArguments(ClassFinalizer::kCanonicalize));
// Malformed type arguments are mapped to dynamic, so we will not encounter
// them here.
@@ -9923,8 +9924,8 @@
// Resolve the type and optional identifier to a constructor or factory.
Class& type_class = Class::Handle(type.type_class());
String& type_class_name = String::Handle(type_class.Name());
- AbstractTypeArguments& type_arguments =
- AbstractTypeArguments::ZoneHandle(type.arguments());
+ TypeArguments& type_arguments =
+ TypeArguments::ZoneHandle(type.arguments());
// A constructor has an implicit 'this' parameter (instance to construct)
// and a factory has an implicit 'this' parameter (type_arguments).
« runtime/vm/dart_api_impl.cc ('K') | « runtime/vm/parser.h ('k') | runtime/vm/raw_object.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698