Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/kernel_binary_flowgraph.h" | 5 #include "vm/kernel_binary_flowgraph.h" |
| 6 | 6 |
| 7 #include "vm/compiler.h" | 7 #include "vm/compiler.h" |
| 8 #include "vm/longjump.h" | 8 #include "vm/longjump.h" |
| 9 #include "vm/object_store.h" | 9 #include "vm/object_store.h" |
| 10 | 10 |
| (...skipping 1666 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1677 } | 1677 } |
| 1678 | 1678 |
| 1679 UNREACHABLE(); | 1679 UNREACHABLE(); |
| 1680 } | 1680 } |
| 1681 | 1681 |
| 1682 const TypeArguments& StreamingDartTypeTranslator::BuildTypeArguments( | 1682 const TypeArguments& StreamingDartTypeTranslator::BuildTypeArguments( |
| 1683 intptr_t length) { | 1683 intptr_t length) { |
| 1684 bool only_dynamic = true; | 1684 bool only_dynamic = true; |
| 1685 intptr_t offset = builder_->ReaderOffset(); | 1685 intptr_t offset = builder_->ReaderOffset(); |
| 1686 for (intptr_t i = 0; i < length; ++i) { | 1686 for (intptr_t i = 0; i < length; ++i) { |
| 1687 if (builder_->ReadTag() != kDynamicType) { // read ith type's tag. | 1687 if (builder_->ReadTag() != kDynamicType) { // read ith type's tag. |
|
Kevin Millikin (Google)
2017/06/21 06:43:42
Format comments as if they were sentences. Capita
| |
| 1688 only_dynamic = false; | 1688 only_dynamic = false; |
| 1689 builder_->SetOffset(offset); | 1689 builder_->SetOffset(offset); |
| 1690 break; | 1690 break; |
| 1691 } | 1691 } |
| 1692 } | 1692 } |
| 1693 TypeArguments& type_arguments = TypeArguments::ZoneHandle(Z); | 1693 TypeArguments& type_arguments = TypeArguments::ZoneHandle(Z); |
| 1694 if (!only_dynamic) { | 1694 if (!only_dynamic) { |
| 1695 type_arguments = TypeArguments::New(length); | 1695 type_arguments = TypeArguments::New(length); |
| 1696 for (intptr_t i = 0; i < length; ++i) { | 1696 for (intptr_t i = 0; i < length; ++i) { |
| 1697 BuildTypeInternal(); // read ith type. | 1697 BuildTypeInternal(); // read ith type. |
| 1698 if (!result_.IsDynamicType()) { | |
| 1699 only_dynamic = false; | |
| 1700 } | |
| 1701 if (result_.IsMalformed()) { | 1698 if (result_.IsMalformed()) { |
| 1702 type_arguments = TypeArguments::null(); | 1699 type_arguments = TypeArguments::null(); |
| 1703 // skip rest of arguments. | 1700 // skip rest of arguments. |
|
Kevin Millikin (Google)
2017/06/21 06:43:42
'skip rest of' ==> 'Skip the rest of the'.
| |
| 1704 for (++i; i < length; ++i) { | 1701 for (++i; i < length; ++i) { |
| 1705 builder_->SkipDartType(); | 1702 builder_->SkipDartType(); |
| 1706 } | 1703 } |
| 1707 return type_arguments; | 1704 return type_arguments; |
| 1708 } | 1705 } |
| 1709 type_arguments.SetTypeAt(i, result_); | 1706 type_arguments.SetTypeAt(i, result_); |
| 1710 } | 1707 } |
| 1711 | 1708 |
| 1712 if (finalize_) { | 1709 if (finalize_) { |
| 1713 type_arguments = type_arguments.Canonicalize(); | 1710 type_arguments = type_arguments.Canonicalize(); |
| 1714 } | 1711 } |
| 1715 } | 1712 } |
| 1716 return type_arguments; | 1713 return type_arguments; |
| 1717 } | 1714 } |
| 1718 | 1715 |
| 1719 const TypeArguments& | 1716 const TypeArguments& |
| 1720 StreamingDartTypeTranslator::BuildInstantiatedTypeArguments( | 1717 StreamingDartTypeTranslator::BuildInstantiatedTypeArguments( |
| 1721 const dart::Class& receiver_class, | 1718 const dart::Class& receiver_class, |
| 1722 intptr_t length) { | 1719 intptr_t length) { |
| 1723 const TypeArguments& type_arguments = BuildTypeArguments(length); | 1720 const TypeArguments& type_arguments = BuildTypeArguments(length); |
| 1724 if (type_arguments.IsNull()) return type_arguments; | 1721 |
| 1722 // If type_arguments is null all arguments are dynamic. | |
| 1723 // If, however, this class doesn't specify all the type arguments directly we | |
| 1724 // still need to finalize the type below in order to get any non-dynamic types | |
| 1725 // from any super. See http://www.dartbug.com/29537. | |
| 1726 if (type_arguments.IsNull() && receiver_class.NumTypeArguments() == length) { | |
| 1727 return type_arguments; | |
| 1728 } | |
| 1725 | 1729 |
| 1726 // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to | 1730 // We make a temporary [Type] object and use `ClassFinalizer::FinalizeType` to |
| 1727 // finalize the argument types. | 1731 // finalize the argument types. |
| 1728 // (This can for example make the [type_arguments] vector larger) | 1732 // (This can for example make the [type_arguments] vector larger) |
| 1729 Type& type = Type::Handle( | 1733 Type& type = Type::Handle( |
| 1730 Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource)); | 1734 Z, Type::New(receiver_class, type_arguments, TokenPosition::kNoSource)); |
| 1731 if (finalize_) { | 1735 if (finalize_) { |
| 1732 type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type); | 1736 type ^= ClassFinalizer::FinalizeType(*active_class_->klass, type); |
| 1733 } | 1737 } |
| 1734 | 1738 |
| (...skipping 3578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5313 instructions += ThrowTypeError(); | 5317 instructions += ThrowTypeError(); |
| 5314 | 5318 |
| 5315 // Bail out early. | 5319 // Bail out early. |
| 5316 return instructions; | 5320 return instructions; |
| 5317 } | 5321 } |
| 5318 | 5322 |
| 5319 SetOffset(offset); | 5323 SetOffset(offset); |
| 5320 } | 5324 } |
| 5321 | 5325 |
| 5322 if (klass.NumTypeArguments() > 0) { | 5326 if (klass.NumTypeArguments() > 0) { |
| 5323 const TypeArguments& type_arguments = PeekArgumentsInstantiatedType(klass); | |
| 5324 if (!klass.IsGeneric()) { | 5327 if (!klass.IsGeneric()) { |
| 5325 Type& type = Type::ZoneHandle(Z, T.ReceiverType(klass).raw()); | 5328 Type& type = Type::ZoneHandle(Z, T.ReceiverType(klass).raw()); |
| 5326 | 5329 |
| 5327 // TODO(27590): Can we move this code into [ReceiverType]? | 5330 // TODO(27590): Can we move this code into [ReceiverType]? |
| 5328 type ^= ClassFinalizer::FinalizeType(*active_class()->klass, type, | 5331 type ^= ClassFinalizer::FinalizeType(*active_class()->klass, type, |
| 5329 ClassFinalizer::kFinalize); | 5332 ClassFinalizer::kFinalize); |
| 5330 ASSERT(!type.IsMalformedOrMalbounded()); | 5333 ASSERT(!type.IsMalformedOrMalbounded()); |
| 5331 | 5334 |
| 5332 TypeArguments& canonicalized_type_arguments = | 5335 TypeArguments& canonicalized_type_arguments = |
| 5333 TypeArguments::ZoneHandle(Z, type.arguments()); | 5336 TypeArguments::ZoneHandle(Z, type.arguments()); |
| 5334 canonicalized_type_arguments = | 5337 canonicalized_type_arguments = |
| 5335 canonicalized_type_arguments.Canonicalize(); | 5338 canonicalized_type_arguments.Canonicalize(); |
| 5336 instructions += Constant(canonicalized_type_arguments); | 5339 instructions += Constant(canonicalized_type_arguments); |
| 5337 } else { | 5340 } else { |
| 5341 const TypeArguments& type_arguments = | |
| 5342 PeekArgumentsInstantiatedType(klass); | |
| 5338 instructions += TranslateInstantiatedTypeArguments(type_arguments); | 5343 instructions += TranslateInstantiatedTypeArguments(type_arguments); |
| 5339 } | 5344 } |
| 5340 | 5345 |
| 5341 instructions += PushArgument(); | 5346 instructions += PushArgument(); |
| 5342 instructions += AllocateObject(klass, 1); | 5347 instructions += AllocateObject(klass, 1); |
| 5343 } else { | 5348 } else { |
| 5344 instructions += AllocateObject(klass, 0); | 5349 instructions += AllocateObject(klass, 0); |
| 5345 } | 5350 } |
| 5346 LocalVariable* variable = MakeTemporary(); | 5351 LocalVariable* variable = MakeTemporary(); |
| 5347 | 5352 |
| (...skipping 1802 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7150 metadata_values.SetAt(i, value); | 7155 metadata_values.SetAt(i, value); |
| 7151 } | 7156 } |
| 7152 | 7157 |
| 7153 return metadata_values.raw(); | 7158 return metadata_values.raw(); |
| 7154 } | 7159 } |
| 7155 | 7160 |
| 7156 } // namespace kernel | 7161 } // namespace kernel |
| 7157 } // namespace dart | 7162 } // namespace dart |
| 7158 | 7163 |
| 7159 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 7164 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
| OLD | NEW |