Chromium Code Reviews| Index: runtime/vm/kernel_binary_flowgraph.cc |
| diff --git a/runtime/vm/kernel_binary_flowgraph.cc b/runtime/vm/kernel_binary_flowgraph.cc |
| index 33c85883c08dca768e4f896411db799a63c561f3..c75d72225583f654ef29975de610735434848cd0 100644 |
| --- a/runtime/vm/kernel_binary_flowgraph.cc |
| +++ b/runtime/vm/kernel_binary_flowgraph.cc |
| @@ -1695,9 +1695,6 @@ const TypeArguments& StreamingDartTypeTranslator::BuildTypeArguments( |
| type_arguments = TypeArguments::New(length); |
| for (intptr_t i = 0; i < length; ++i) { |
| BuildTypeInternal(); // read ith type. |
| - if (!result_.IsDynamicType()) { |
| - only_dynamic = false; |
| - } |
| if (result_.IsMalformed()) { |
| type_arguments = TypeArguments::null(); |
| // skip rest of arguments. |
|
Kevin Millikin (Google)
2017/06/21 06:43:42
'skip rest of' ==> 'Skip the rest of the'.
|
| @@ -1721,7 +1718,14 @@ StreamingDartTypeTranslator::BuildInstantiatedTypeArguments( |
| const dart::Class& receiver_class, |
| intptr_t length) { |
| const TypeArguments& type_arguments = BuildTypeArguments(length); |
| - if (type_arguments.IsNull()) return type_arguments; |
| + |
| + // If type_arguments is null all arguments are dynamic. |
| + // If, however, this class doesn't specify all the type arguments directly we |
| + // still need to finalize the type below in order to get any non-dynamic types |
| + // from any super. See http://www.dartbug.com/29537. |
| + if (type_arguments.IsNull() && receiver_class.NumTypeArguments() == length) { |
| + return type_arguments; |
| + } |
| // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to |
| // finalize the argument types. |
| @@ -5320,7 +5324,6 @@ Fragment StreamingFlowGraphBuilder::BuildConstructorInvocation( |
| } |
| if (klass.NumTypeArguments() > 0) { |
| - const TypeArguments& type_arguments = PeekArgumentsInstantiatedType(klass); |
| if (!klass.IsGeneric()) { |
| Type& type = Type::ZoneHandle(Z, T.ReceiverType(klass).raw()); |
| @@ -5335,6 +5338,8 @@ Fragment StreamingFlowGraphBuilder::BuildConstructorInvocation( |
| canonicalized_type_arguments.Canonicalize(); |
| instructions += Constant(canonicalized_type_arguments); |
| } else { |
| + const TypeArguments& type_arguments = |
| + PeekArgumentsInstantiatedType(klass); |
| instructions += TranslateInstantiatedTypeArguments(type_arguments); |
| } |