Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(148)

Side by Side Diff: runtime/vm/intermediate_language.cc

Issue 11125005: Support for type dynamic in VM (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/flow_graph_compiler_x64.cc ('k') | runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/intermediate_language.h" 5 #include "vm/intermediate_language.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/dart_entry.h" 8 #include "vm/dart_entry.h"
9 #include "vm/flow_graph_allocator.h" 9 #include "vm/flow_graph_allocator.h"
10 #include "vm/flow_graph_builder.h" 10 #include "vm/flow_graph_builder.h"
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after
370 370
371 // If the compile type of the value is void, we are type checking the result 371 // If the compile type of the value is void, we are type checking the result
372 // of a void function, which was checked to be null at the return statement 372 // of a void function, which was checked to be null at the return statement
373 // inside the function. 373 // inside the function.
374 if (compile_type.IsVoidType()) { 374 if (compile_type.IsVoidType()) {
375 ASSERT(FLAG_enable_type_checks); 375 ASSERT(FLAG_enable_type_checks);
376 *is_instance = true; 376 *is_instance = true;
377 return true; 377 return true;
378 } 378 }
379 379
380 // The Null type is only a subtype of Object and of Dynamic. 380 // The Null type is only a subtype of Object and of dynamic.
381 // Functions that do not explicitly return a value, implicitly return null, 381 // Functions that do not explicitly return a value, implicitly return null,
382 // except generative constructors, which return the object being constructed. 382 // except generative constructors, which return the object being constructed.
383 // It is therefore acceptable for void functions to return null. 383 // It is therefore acceptable for void functions to return null.
384 if (compile_type.IsNullType()) { 384 if (compile_type.IsNullType()) {
385 *is_instance = 385 *is_instance =
386 type.IsObjectType() || type.IsDynamicType() || type.IsVoidType(); 386 type.IsObjectType() || type.IsDynamicType() || type.IsVoidType();
387 return true; 387 return true;
388 } 388 }
389 389
390 // Until we support a set of compile types, we can only give answers for 390 // Until we support a set of compile types, we can only give answers for
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
958 958
959 959
960 RawAbstractType* StoreContextInstr::CompileType() const { 960 RawAbstractType* StoreContextInstr::CompileType() const {
961 return AbstractType::null(); 961 return AbstractType::null();
962 } 962 }
963 963
964 964
965 RawAbstractType* ClosureCallInstr::CompileType() const { 965 RawAbstractType* ClosureCallInstr::CompileType() const {
966 // Because of function subtyping rules, the declared return type of a closure 966 // Because of function subtyping rules, the declared return type of a closure
967 // call cannot be relied upon for compile type analysis. For example, a 967 // call cannot be relied upon for compile type analysis. For example, a
968 // function returning Dynamic can be assigned to a closure variable declared 968 // function returning dynamic can be assigned to a closure variable declared
969 // to return int and may actually return a double at run-time. 969 // to return int and may actually return a double at run-time.
970 return Type::DynamicType(); 970 return Type::DynamicType();
971 } 971 }
972 972
973 973
974 RawAbstractType* InstanceCallInstr::CompileType() const { 974 RawAbstractType* InstanceCallInstr::CompileType() const {
975 // TODO(regis): Return a more specific type than Dynamic for recognized 975 // TODO(regis): Return a more specific type than dynamic for recognized
976 // combinations of receiver type and method name. 976 // combinations of receiver type and method name.
977 return Type::DynamicType(); 977 return Type::DynamicType();
978 } 978 }
979 979
980 980
981 RawAbstractType* PolymorphicInstanceCallInstr::CompileType() const { 981 RawAbstractType* PolymorphicInstanceCallInstr::CompileType() const {
982 return Type::DynamicType(); 982 return Type::DynamicType();
983 } 983 }
984 984
985 985
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 1118
1119 1119
1120 RawAbstractType* AllocateObjectWithBoundsCheckInstr::CompileType() const { 1120 RawAbstractType* AllocateObjectWithBoundsCheckInstr::CompileType() const {
1121 // TODO(regis): Be more specific. 1121 // TODO(regis): Be more specific.
1122 return Type::DynamicType(); 1122 return Type::DynamicType();
1123 } 1123 }
1124 1124
1125 1125
1126 RawAbstractType* LoadFieldInstr::CompileType() const { 1126 RawAbstractType* LoadFieldInstr::CompileType() const {
1127 // Type may be null if the field is a VM field, e.g. context parent. 1127 // Type may be null if the field is a VM field, e.g. context parent.
1128 // Keep it as null for debug purposes and do not return Dynamic in production 1128 // Keep it as null for debug purposes and do not return dynamic in production
1129 // mode, since misuse of the type would remain undetected. 1129 // mode, since misuse of the type would remain undetected.
1130 if (type().IsNull()) { 1130 if (type().IsNull()) {
1131 return AbstractType::null(); 1131 return AbstractType::null();
1132 } 1132 }
1133 if (FLAG_enable_type_checks) { 1133 if (FLAG_enable_type_checks) {
1134 return type().raw(); 1134 return type().raw();
1135 } 1135 }
1136 return Type::DynamicType(); 1136 return Type::DynamicType();
1137 } 1137 }
1138 1138
(...skipping 947 matching lines...) Expand 10 before | Expand all | Expand 10 after
2086 new_max = new_max.Clamp(); 2086 new_max = new_max.Clamp();
2087 } 2087 }
2088 2088
2089 return Range::Update(&range_, new_min, new_max); 2089 return Range::Update(&range_, new_min, new_max);
2090 } 2090 }
2091 2091
2092 2092
2093 #undef __ 2093 #undef __
2094 2094
2095 } // namespace dart 2095 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/flow_graph_compiler_x64.cc ('k') | runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698