| 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 1216 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1227   } |  1227   } | 
|  1228   const TokenPosition token_pos = node->token_pos(); |  1228   const TokenPosition token_pos = node->token_pos(); | 
|  1229   Value* instantiator_type_arguments = NULL; |  1229   Value* instantiator_type_arguments = NULL; | 
|  1230   if (type.IsInstantiated(kCurrentClass)) { |  1230   if (type.IsInstantiated(kCurrentClass)) { | 
|  1231     instantiator_type_arguments = BuildNullValue(token_pos); |  1231     instantiator_type_arguments = BuildNullValue(token_pos); | 
|  1232   } else { |  1232   } else { | 
|  1233     instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos); |  1233     instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos); | 
|  1234   } |  1234   } | 
|  1235   Value* function_type_arguments = NULL; |  1235   Value* function_type_arguments = NULL; | 
|  1236   if (type.IsInstantiated(kCurrentFunction)) { |  1236   if (type.IsInstantiated(kCurrentFunction)) { | 
|  1237     // TODO(regis): function_type_arguments = BuildNullValue((token_pos); |  1237     function_type_arguments = BuildNullValue(token_pos); | 
|  1238   } else { |  1238   } else { | 
|  1239     function_type_arguments = BuildFunctionTypeArguments(token_pos); |  1239     function_type_arguments = BuildFunctionTypeArguments(token_pos); | 
|  1240   } |  1240   } | 
|  1241   ReturnDefinition(new (Z) InstantiateTypeInstr( |  1241   ReturnDefinition(new (Z) InstantiateTypeInstr( | 
|  1242       token_pos, type, instantiator_type_arguments, function_type_arguments)); |  1242       token_pos, type, instantiator_type_arguments, function_type_arguments)); | 
|  1243 } |  1243 } | 
|  1244  |  1244  | 
|  1245  |  1245  | 
|  1246 // Returns true if the type check can be skipped, for example, if the |  1246 // Returns true if the type check can be skipped, for example, if the | 
|  1247 // destination type is dynamic or if the compile type of the value is a subtype |  1247 // destination type is dynamic or if the compile type of the value is a subtype | 
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1456     const String& dst_name) { |  1456     const String& dst_name) { | 
|  1457   // Build the type check computation. |  1457   // Build the type check computation. | 
|  1458   Value* instantiator_type_arguments = NULL; |  1458   Value* instantiator_type_arguments = NULL; | 
|  1459   Value* function_type_arguments = NULL; |  1459   Value* function_type_arguments = NULL; | 
|  1460   if (dst_type.IsInstantiated(kCurrentClass)) { |  1460   if (dst_type.IsInstantiated(kCurrentClass)) { | 
|  1461     instantiator_type_arguments = BuildNullValue(token_pos); |  1461     instantiator_type_arguments = BuildNullValue(token_pos); | 
|  1462   } else { |  1462   } else { | 
|  1463     instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos); |  1463     instantiator_type_arguments = BuildInstantiatorTypeArguments(token_pos); | 
|  1464   } |  1464   } | 
|  1465   if (dst_type.IsInstantiated(kCurrentFunction)) { |  1465   if (dst_type.IsInstantiated(kCurrentFunction)) { | 
|  1466     // TODO(regis): function_type_arguments = BuildNullValue(token_pos); |  1466     function_type_arguments = BuildNullValue(token_pos); | 
|  1467   } else { |  1467   } else { | 
|  1468     function_type_arguments = BuildFunctionTypeArguments(token_pos); |  1468     function_type_arguments = BuildFunctionTypeArguments(token_pos); | 
|  1469   } |  1469   } | 
|  1470  |  1470  | 
|  1471   const intptr_t deopt_id = Thread::Current()->GetNextDeoptId(); |  1471   const intptr_t deopt_id = Thread::Current()->GetNextDeoptId(); | 
|  1472   return new (Z) AssertAssignableInstr( |  1472   return new (Z) AssertAssignableInstr( | 
|  1473       token_pos, value, instantiator_type_arguments, function_type_arguments, |  1473       token_pos, value, instantiator_type_arguments, function_type_arguments, | 
|  1474       dst_type, dst_name, deopt_id); |  1474       dst_type, dst_name, deopt_id); | 
|  1475 } |  1475 } | 
|  1476  |  1476  | 
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1525         kNumArgsChecked, owner()->ic_data_array()); |  1525         kNumArgsChecked, owner()->ic_data_array()); | 
|  1526     if (negate_result) { |  1526     if (negate_result) { | 
|  1527       result = new (Z) BooleanNegateInstr(Bind(result)); |  1527       result = new (Z) BooleanNegateInstr(Bind(result)); | 
|  1528     } |  1528     } | 
|  1529     ReturnDefinition(result); |  1529     ReturnDefinition(result); | 
|  1530     return; |  1530     return; | 
|  1531   } |  1531   } | 
|  1532  |  1532  | 
|  1533   PushArgumentInstr* push_instantiator_type_args = |  1533   PushArgumentInstr* push_instantiator_type_args = | 
|  1534       PushInstantiatorTypeArguments(type, node->token_pos()); |  1534       PushInstantiatorTypeArguments(type, node->token_pos()); | 
|  1535   // TODO(regis): PushArgumentInstr* push_function_type_args = |  1535   PushArgumentInstr* push_function_type_args = | 
|  1536   //    PushFunctionTypeArguments(type, node->token_pos()); |  1536       PushFunctionTypeArguments(type, node->token_pos()); | 
|  1537   ZoneGrowableArray<PushArgumentInstr*>* arguments = |  1537   ZoneGrowableArray<PushArgumentInstr*>* arguments = | 
|  1538       new (Z) ZoneGrowableArray<PushArgumentInstr*>(3); |  1538       new (Z) ZoneGrowableArray<PushArgumentInstr*>(4); | 
|  1539   arguments->Add(push_left); |  1539   arguments->Add(push_left); | 
|  1540   arguments->Add(push_instantiator_type_args); |  1540   arguments->Add(push_instantiator_type_args); | 
|  1541   // TODO(regis): arguments->Add(push_function_type_args); |  1541   arguments->Add(push_function_type_args); | 
|  1542   Value* type_const = Bind(new (Z) ConstantInstr(type)); |  1542   Value* type_const = Bind(new (Z) ConstantInstr(type)); | 
|  1543   arguments->Add(PushArgument(type_const)); |  1543   arguments->Add(PushArgument(type_const)); | 
|  1544   const intptr_t kNumArgsChecked = 1; |  1544   const intptr_t kNumArgsChecked = 1; | 
|  1545   Definition* result = new (Z) InstanceCallInstr( |  1545   Definition* result = new (Z) InstanceCallInstr( | 
|  1546       node->token_pos(), Library::PrivateCoreLibName(Symbols::_instanceOf()), |  1546       node->token_pos(), Library::PrivateCoreLibName(Symbols::_instanceOf()), | 
|  1547       node->kind(), arguments, |  1547       node->kind(), arguments, | 
|  1548       Object::null_array(),  // No argument names. |  1548       Object::null_array(),  // No argument names. | 
|  1549       kNumArgsChecked, owner()->ic_data_array()); |  1549       kNumArgsChecked, owner()->ic_data_array()); | 
|  1550   if (negate_result) { |  1550   if (negate_result) { | 
|  1551     result = new (Z) BooleanNegateInstr(Bind(result)); |  1551     result = new (Z) BooleanNegateInstr(Bind(result)); | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  1563   node->left()->Visit(&for_value); |  1563   node->left()->Visit(&for_value); | 
|  1564   Append(for_value); |  1564   Append(for_value); | 
|  1565   if (CanSkipTypeCheck(node->token_pos(), for_value.value(), type, |  1565   if (CanSkipTypeCheck(node->token_pos(), for_value.value(), type, | 
|  1566                        Symbols::InTypeCast())) { |  1566                        Symbols::InTypeCast())) { | 
|  1567     ReturnValue(for_value.value()); |  1567     ReturnValue(for_value.value()); | 
|  1568     return; |  1568     return; | 
|  1569   } |  1569   } | 
|  1570   PushArgumentInstr* push_left = PushArgument(for_value.value()); |  1570   PushArgumentInstr* push_left = PushArgument(for_value.value()); | 
|  1571   PushArgumentInstr* push_instantiator_type_args = |  1571   PushArgumentInstr* push_instantiator_type_args = | 
|  1572       PushInstantiatorTypeArguments(type, node->token_pos()); |  1572       PushInstantiatorTypeArguments(type, node->token_pos()); | 
|  1573   // TODO(regis): PushArgumentInstr* push_function_type_args = |  1573   PushArgumentInstr* push_function_type_args = | 
|  1574   //    PushFunctionTypeArguments(type, node->token_pos()); |  1574       PushFunctionTypeArguments(type, node->token_pos()); | 
|  1575   ZoneGrowableArray<PushArgumentInstr*>* arguments = |  1575   ZoneGrowableArray<PushArgumentInstr*>* arguments = | 
|  1576       new (Z) ZoneGrowableArray<PushArgumentInstr*>(3); |  1576       new (Z) ZoneGrowableArray<PushArgumentInstr*>(4); | 
|  1577   arguments->Add(push_left); |  1577   arguments->Add(push_left); | 
|  1578   arguments->Add(push_instantiator_type_args); |  1578   arguments->Add(push_instantiator_type_args); | 
|  1579   // TODO(regis): arguments->Add(push_function_type_args); |  1579   arguments->Add(push_function_type_args); | 
|  1580   Value* type_arg = Bind(new (Z) ConstantInstr(type)); |  1580   Value* type_arg = Bind(new (Z) ConstantInstr(type)); | 
|  1581   arguments->Add(PushArgument(type_arg)); |  1581   arguments->Add(PushArgument(type_arg)); | 
|  1582   const intptr_t kNumArgsChecked = 1; |  1582   const intptr_t kNumArgsChecked = 1; | 
|  1583   InstanceCallInstr* call = new (Z) InstanceCallInstr( |  1583   InstanceCallInstr* call = new (Z) InstanceCallInstr( | 
|  1584       node->token_pos(), Library::PrivateCoreLibName(Symbols::_as()), |  1584       node->token_pos(), Library::PrivateCoreLibName(Symbols::_as()), | 
|  1585       node->kind(), arguments, |  1585       node->kind(), arguments, | 
|  1586       Object::null_array(),  // No argument names. |  1586       Object::null_array(),  // No argument names. | 
|  1587       kNumArgsChecked, owner()->ic_data_array()); |  1587       kNumArgsChecked, owner()->ic_data_array()); | 
|  1588   ReturnDefinition(call); |  1588   ReturnDefinition(call); | 
|  1589 } |  1589 } | 
| (...skipping 1141 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2731       Class::ZoneHandle(Z, owner()->function().Owner()); |  2731       Class::ZoneHandle(Z, owner()->function().Owner()); | 
|  2732   Value* instantiator_type_args = BuildInstantiatorTypeArguments(token_pos); |  2732   Value* instantiator_type_args = BuildInstantiatorTypeArguments(token_pos); | 
|  2733   const bool use_instantiator_type_args = |  2733   const bool use_instantiator_type_args = | 
|  2734       type_arguments.IsUninstantiatedIdentity() || |  2734       type_arguments.IsUninstantiatedIdentity() || | 
|  2735       type_arguments.CanShareInstantiatorTypeArguments(instantiator_class); |  2735       type_arguments.CanShareInstantiatorTypeArguments(instantiator_class); | 
|  2736   if (use_instantiator_type_args) { |  2736   if (use_instantiator_type_args) { | 
|  2737     return instantiator_type_args; |  2737     return instantiator_type_args; | 
|  2738   } |  2738   } | 
|  2739   Value* function_type_args = NULL; |  2739   Value* function_type_args = NULL; | 
|  2740   if (type_arguments.IsInstantiated(kCurrentFunction)) { |  2740   if (type_arguments.IsInstantiated(kCurrentFunction)) { | 
|  2741     // TODO(regis): function_type_args = BuildNullValue(token_pos); |  2741     function_type_args = BuildNullValue(token_pos); | 
|  2742   } else { |  2742   } else { | 
|  2743     function_type_args = BuildFunctionTypeArguments(token_pos); |  2743     function_type_args = BuildFunctionTypeArguments(token_pos); | 
|  2744   } |  2744   } | 
|  2745   return Bind(new (Z) InstantiateTypeArgumentsInstr( |  2745   return Bind(new (Z) InstantiateTypeArgumentsInstr( | 
|  2746       token_pos, type_arguments, instantiator_class, instantiator_type_args, |  2746       token_pos, type_arguments, instantiator_class, instantiator_type_args, | 
|  2747       function_type_args)); |  2747       function_type_args)); | 
|  2748 } |  2748 } | 
|  2749  |  2749  | 
|  2750  |  2750  | 
|  2751 void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { |  2751 void ValueGraphVisitor::VisitConstructorCallNode(ConstructorCallNode* node) { | 
| (...skipping 1381 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4133 StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError( |  4133 StaticCallInstr* EffectGraphVisitor::BuildThrowNoSuchMethodError( | 
|  4134     TokenPosition token_pos, |  4134     TokenPosition token_pos, | 
|  4135     const Class& function_class, |  4135     const Class& function_class, | 
|  4136     const String& function_name, |  4136     const String& function_name, | 
|  4137     ArgumentListNode* function_arguments, |  4137     ArgumentListNode* function_arguments, | 
|  4138     int invocation_type) { |  4138     int invocation_type) { | 
|  4139   ZoneGrowableArray<PushArgumentInstr*>* arguments = |  4139   ZoneGrowableArray<PushArgumentInstr*>* arguments = | 
|  4140       new (Z) ZoneGrowableArray<PushArgumentInstr*>(); |  4140       new (Z) ZoneGrowableArray<PushArgumentInstr*>(); | 
|  4141   // Object receiver, actually a class literal of the unresolved method's owner. |  4141   // Object receiver, actually a class literal of the unresolved method's owner. | 
|  4142   AbstractType& type = Type::ZoneHandle( |  4142   AbstractType& type = Type::ZoneHandle( | 
|  4143       Z, |  4143       Z, Type::New(function_class, Object::null_type_arguments(), token_pos, | 
|  4144       Type::New(function_class, TypeArguments::Handle(Z, TypeArguments::null()), |  4144                    Heap::kOld)); | 
|  4145                 token_pos, Heap::kOld)); |  | 
|  4146   type ^= ClassFinalizer::FinalizeType(function_class, type); |  4145   type ^= ClassFinalizer::FinalizeType(function_class, type); | 
|  4147   Value* receiver_value = Bind(new (Z) ConstantInstr(type)); |  4146   Value* receiver_value = Bind(new (Z) ConstantInstr(type)); | 
|  4148   arguments->Add(PushArgument(receiver_value)); |  4147   arguments->Add(PushArgument(receiver_value)); | 
|  4149   // String memberName. |  4148   // String memberName. | 
|  4150   const String& member_name = |  4149   const String& member_name = | 
|  4151       String::ZoneHandle(Z, Symbols::New(T, function_name)); |  4150       String::ZoneHandle(Z, Symbols::New(T, function_name)); | 
|  4152   Value* member_name_value = Bind(new (Z) ConstantInstr(member_name)); |  4151   Value* member_name_value = Bind(new (Z) ConstantInstr(member_name)); | 
|  4153   arguments->Add(PushArgument(member_name_value)); |  4152   arguments->Add(PushArgument(member_name_value)); | 
|  4154   // Smi invocation_type. |  4153   // Smi invocation_type. | 
|  4155   Value* invocation_type_value = Bind( |  4154   Value* invocation_type_value = Bind( | 
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  4352   ASSERT(type.HasResolvedTypeClass()); |  4351   ASSERT(type.HasResolvedTypeClass()); | 
|  4353   const Class& type_class = Class::Handle(type.type_class()); |  4352   const Class& type_class = Class::Handle(type.type_class()); | 
|  4354   // Bail if the type has any type parameters. |  4353   // Bail if the type has any type parameters. | 
|  4355   if (type_class.IsGeneric()) return false; |  4354   if (type_class.IsGeneric()) return false; | 
|  4356  |  4355  | 
|  4357   // Finally a simple class for instance of checking. |  4356   // Finally a simple class for instance of checking. | 
|  4358   return true; |  4357   return true; | 
|  4359 } |  4358 } | 
|  4360  |  4359  | 
|  4361 }  // namespace dart |  4360 }  // namespace dart | 
| OLD | NEW |