Index: runtime/vm/parser.cc |
=================================================================== |
--- runtime/vm/parser.cc (revision 478) |
+++ runtime/vm/parser.cc (working copy) |
@@ -832,18 +832,17 @@ |
if (!var_seen && !parameter.is_final) { |
// The parsed parameter type is actually the function result type. |
const Type& result_type = Type::Handle(parameter.type->raw()); |
+ |
// Finish parsing the function type parameter. |
ParamList func_params; |
const bool no_explicit_default_values = false; |
ParseFormalParameterList(no_explicit_default_values, &func_params); |
- // Change the name of the parameter type to be the signature of the |
- // function type. |
- const bool is_static = |
- current_function().IsNull() || current_function().is_static(); |
+ |
+ // The field 'is_static' has no meaning for signature functions. |
const Function& signature_function = Function::Handle( |
Function::New(*parameter.name, |
RawFunction::kSignatureFunction, |
- is_static, |
+ /* is_static = */ false, |
/* is_const = */ false, |
parameter.name_pos)); |
signature_function.set_owner(current_class()); |
@@ -864,10 +863,10 @@ |
ASSERT(!Function::Handle(signature_class.signature_function()).IsNull()); |
ASSERT(Class::Handle(signature_function.signature_class()).IsNull()); |
signature_function.set_signature_class(signature_class); |
- // The type of the parameter is now the signature class. |
- // TODO(regis): What are the type arguments? |
- parameter.type = &Type::ZoneHandle(Type::NewRawType(signature_class)); |
- if (!is_top_level_) { |
+ |
+ // The type of the parameter is now the signature type. |
+ parameter.type = &Type::ZoneHandle(signature_class.SignatureType()); |
+ if (!is_top_level_ && !parameter.type->IsFinalized()) { |
const String& errmsg = String::Handle( |
ClassFinalizer::FinalizeTypeWhileParsing(*parameter.type)); |
if (!errmsg.IsNull()) { |
@@ -2390,10 +2389,11 @@ |
const String* alias_name = CurrentLiteral(); |
ConsumeToken(); |
- // Allocate a class to hold the type parameters and their 'extends' |
+ // Allocate an interface to hold the type parameters and their 'extends' |
// constraints. Make it the owner of the function type descriptor. |
const Class& alias_owner = Class::Handle( |
Class::New(String::Handle(String::NewSymbol("")), Script::Handle())); |
+ alias_owner.set_is_interface(); |
set_current_class(alias_owner); |
ParseTypeParameters(alias_owner); |
if (CurrentToken() != Token::kLPAREN) { |
@@ -2408,8 +2408,7 @@ |
ParamList func_params; |
const bool no_explicit_default_values = false; |
ParseFormalParameterList(no_explicit_default_values, &func_params); |
- // TODO(regis): If no type parameters were specified, the function could be |
- // static. Revisit. |
+ // The field 'is_static' has no meaning for signature functions. |
Function& signature_function = Function::Handle( |
Function::New(*alias_name, |
RawFunction::kSignatureFunction, |
@@ -3450,35 +3449,26 @@ |
// Patch the function type now that the signature is known. |
// We need to create a new type for proper finalization, since the existing |
// type is already marked as finalized. |
- TypeArguments& signature_type_arguments = TypeArguments::Handle(); |
- if (signature_class.IsParameterized()) { |
- const intptr_t num_type_params = signature_class.NumTypeParameters(); |
- const Array& type_params = Array::Handle( |
- signature_class.type_parameters()); |
- signature_type_arguments = TypeArguments::NewTypeArray(num_type_params); |
- String& type_param_name = String::Handle(); |
- Type& type_param = Type::Handle(); |
- for (int i = 0; i < num_type_params; i++) { |
- type_param_name ^= type_params.At(i); |
- type_param = Type::NewTypeParameter(i, type_param_name); |
- signature_type_arguments.SetTypeAt(i, type_param); |
+ const Type& signature_type = Type::Handle(signature_class.SignatureType()); |
+ const TypeArguments& signature_type_arguments = TypeArguments::Handle( |
+ signature_type.arguments()); |
+ |
+ // Since the signature type is cached by the signature class, it may have |
+ // been finalized already. |
+ if (!signature_type.IsFinalized()) { |
+ const String& errmsg = String::Handle( |
+ ClassFinalizer::FinalizeTypeWhileParsing(signature_type)); |
+ if (!errmsg.IsNull()) { |
+ ErrorMsg(errmsg.ToCString()); |
} |
+ // The call to ClassFinalizer::FinalizeTypeWhileParsing may have extended |
+ // the vector of type arguments. |
+ ASSERT(signature_type_arguments.IsNull() || |
+ (signature_type_arguments.Length() == |
+ signature_class.NumTypeArguments())); |
+ // The signature_class should not have changed. |
+ ASSERT(signature_type.type_class() == signature_class.raw()); |
} |
- const ParameterizedType& actual_function_type = ParameterizedType::Handle( |
- ParameterizedType::New(signature_class, signature_type_arguments)); |
- const String& errmsg = String::Handle( |
- ClassFinalizer::FinalizeTypeWhileParsing(actual_function_type)); |
- if (!errmsg.IsNull()) { |
- ErrorMsg(errmsg.ToCString()); |
- } |
- // The call to ClassFinalizer::FinalizeTypeWhileParsing may have extended |
- // the vector of type arguments. |
- signature_type_arguments = actual_function_type.arguments(); |
- ASSERT(signature_type_arguments.IsNull() || |
- (signature_type_arguments.Length() == |
- signature_class.NumTypeArguments())); |
- // The signature_class should not have changed. |
- ASSERT(actual_function_type.type_class() == signature_class.raw()); |
// Now patch the function type of the variable. |
function_type.set_type_class(signature_class); |