OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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/flow_graph_builder.h" | 5 #include "vm/flow_graph_builder.h" |
6 | 6 |
7 #include "lib/invocation_mirror.h" | 7 #include "lib/invocation_mirror.h" |
8 #include "vm/ast_printer.h" | 8 #include "vm/ast_printer.h" |
9 #include "vm/bit_vector.h" | 9 #include "vm/bit_vector.h" |
10 #include "vm/compiler.h" | 10 #include "vm/compiler.h" |
(...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1480 Value* value, | 1480 Value* value, |
1481 const AbstractType& dst_type, | 1481 const AbstractType& dst_type, |
1482 const String& dst_name) { | 1482 const String& dst_name) { |
1483 if (CanSkipTypeCheck(token_pos, value, dst_type, dst_name)) { | 1483 if (CanSkipTypeCheck(token_pos, value, dst_type, dst_name)) { |
1484 return value; | 1484 return value; |
1485 } | 1485 } |
1486 return Bind(BuildAssertAssignable(token_pos, value, dst_type, dst_name)); | 1486 return Bind(BuildAssertAssignable(token_pos, value, dst_type, dst_name)); |
1487 } | 1487 } |
1488 | 1488 |
1489 | 1489 |
1490 static bool simpleInstanceOfType(const AbstractType& type) { | |
1491 // Bail if the type is still uninstantiated at compile time. | |
1492 if (!type.IsInstantiated()) return false; | |
1493 | |
1494 // Bail if the type is a function or a Dart Function type. | |
1495 if (type.IsFunctionType() || type.IsDartFunctionType()) return false; | |
1496 | |
1497 ASSERT(type.HasResolvedTypeClass()); | |
1498 const Class& type_class = Class::Handle(type.type_class()); | |
1499 // Bail if the type has any type parameters. | |
1500 if (type_class.IsGeneric()) return false; | |
1501 | |
1502 // Finally a simple class for instance of checking. | |
1503 return true; | |
1504 } | |
1505 | |
1506 | |
1507 void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) { | 1490 void EffectGraphVisitor::BuildTypeTest(ComparisonNode* node) { |
1508 ASSERT(Token::IsTypeTestOperator(node->kind())); | 1491 ASSERT(Token::IsTypeTestOperator(node->kind())); |
1509 const AbstractType& type = node->right()->AsTypeNode()->type(); | 1492 const AbstractType& type = node->right()->AsTypeNode()->type(); |
1510 ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded()); | 1493 ASSERT(type.IsFinalized() && !type.IsMalformedOrMalbounded()); |
1511 const bool negate_result = (node->kind() == Token::kISNOT); | 1494 const bool negate_result = (node->kind() == Token::kISNOT); |
1512 // All objects are instances of type T if Object type is a subtype of type T. | 1495 // All objects are instances of type T if Object type is a subtype of type T. |
1513 const Type& object_type = Type::Handle(Z, Type::ObjectType()); | 1496 const Type& object_type = Type::Handle(Z, Type::ObjectType()); |
1514 if (type.IsInstantiated() && | 1497 if (type.IsInstantiated() && |
1515 object_type.IsSubtypeOf(type, NULL, NULL, Heap::kOld)) { | 1498 object_type.IsSubtypeOf(type, NULL, NULL, Heap::kOld)) { |
1516 // Must evaluate left side. | 1499 // Must evaluate left side. |
(...skipping 2838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4355 graph_entry_->PruneUnreachable(graph_entry_, NULL, osr_id_, block_marks); | 4338 graph_entry_->PruneUnreachable(graph_entry_, NULL, osr_id_, block_marks); |
4356 ASSERT(found); | 4339 ASSERT(found); |
4357 } | 4340 } |
4358 | 4341 |
4359 | 4342 |
4360 void FlowGraphBuilder::Bailout(const char* reason) const { | 4343 void FlowGraphBuilder::Bailout(const char* reason) const { |
4361 parsed_function_.Bailout("FlowGraphBuilder", reason); | 4344 parsed_function_.Bailout("FlowGraphBuilder", reason); |
4362 } | 4345 } |
4363 | 4346 |
4364 } // namespace dart | 4347 } // namespace dart |
OLD | NEW |