| 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/class_finalizer.h" | 10 #include "vm/class_finalizer.h" |
| (...skipping 949 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 960 Append(for_effect); | 960 Append(for_effect); |
| 961 if (!is_open()) { | 961 if (!is_open()) { |
| 962 owner()->DeallocateTemps(owner()->temp_count()); | 962 owner()->DeallocateTemps(owner()->temp_count()); |
| 963 return; | 963 return; |
| 964 } | 964 } |
| 965 } | 965 } |
| 966 | 966 |
| 967 // Call to stub that checks whether the debugger is in single | 967 // Call to stub that checks whether the debugger is in single |
| 968 // step mode. This call must happen before the contexts are | 968 // step mode. This call must happen before the contexts are |
| 969 // unchained so that captured variables can be inspected. | 969 // unchained so that captured variables can be inspected. |
| 970 AddInstruction(new DebugStepCheckInstr(node->token_pos())); | 970 // No debugger check is done in native functions. |
| 971 const Function& function = owner()->parsed_function()->function(); |
| 972 if (!function.is_native()) { |
| 973 AddInstruction(new DebugStepCheckInstr(node->token_pos(), |
| 974 PcDescriptors::kReturn)); |
| 975 } |
| 971 | 976 |
| 972 Value* return_value = for_value.value(); | 977 Value* return_value = for_value.value(); |
| 973 if (FLAG_enable_type_checks) { | 978 if (FLAG_enable_type_checks) { |
| 974 const Function& function = owner()->parsed_function()->function(); | |
| 975 const bool is_implicit_dynamic_getter = | 979 const bool is_implicit_dynamic_getter = |
| 976 (!function.is_static() && | 980 (!function.is_static() && |
| 977 ((function.kind() == RawFunction::kImplicitGetter) || | 981 ((function.kind() == RawFunction::kImplicitGetter) || |
| 978 (function.kind() == RawFunction::kImplicitStaticFinalGetter))); | 982 (function.kind() == RawFunction::kImplicitStaticFinalGetter))); |
| 979 // Implicit getters do not need a type check at return, unless they compute | 983 // Implicit getters do not need a type check at return, unless they compute |
| 980 // the initial value of a static field. | 984 // the initial value of a static field. |
| 981 // The body of a constructor cannot modify the type of the | 985 // The body of a constructor cannot modify the type of the |
| 982 // constructed instance, which is passed in as an implicit parameter. | 986 // constructed instance, which is passed in as an implicit parameter. |
| 983 // However, factories may create an instance of the wrong type. | 987 // However, factories may create an instance of the wrong type. |
| 984 if (!is_implicit_dynamic_getter && !function.IsConstructor()) { | 988 if (!is_implicit_dynamic_getter && !function.IsConstructor()) { |
| 985 const AbstractType& dst_type = | 989 const AbstractType& dst_type = |
| 986 AbstractType::ZoneHandle( | 990 AbstractType::ZoneHandle(function.result_type()); |
| 987 owner()->parsed_function()->function().result_type()); | |
| 988 return_value = BuildAssignableValue(node->value()->token_pos(), | 991 return_value = BuildAssignableValue(node->value()->token_pos(), |
| 989 return_value, | 992 return_value, |
| 990 dst_type, | 993 dst_type, |
| 991 Symbols::FunctionResult()); | 994 Symbols::FunctionResult()); |
| 992 } | 995 } |
| 993 } | 996 } |
| 994 | 997 |
| 995 intptr_t current_context_level = owner()->context_level(); | 998 intptr_t current_context_level = owner()->context_level(); |
| 996 ASSERT(current_context_level >= 0); | 999 ASSERT(current_context_level >= 0); |
| 997 if (owner()->parsed_function()->saved_entry_context_var() != NULL) { | 1000 if (owner()->parsed_function()->saved_entry_context_var() != NULL) { |
| (...skipping 2202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3200 void ValueGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) { | 3203 void ValueGraphVisitor::VisitLoadLocalNode(LoadLocalNode* node) { |
| 3201 Definition* load = BuildLoadLocal(node->local()); | 3204 Definition* load = BuildLoadLocal(node->local()); |
| 3202 ReturnDefinition(load); | 3205 ReturnDefinition(load); |
| 3203 } | 3206 } |
| 3204 | 3207 |
| 3205 | 3208 |
| 3206 // <Expression> ::= StoreLocal { local: LocalVariable | 3209 // <Expression> ::= StoreLocal { local: LocalVariable |
| 3207 // value: <Expression> } | 3210 // value: <Expression> } |
| 3208 void EffectGraphVisitor::HandleStoreLocal(StoreLocalNode* node, | 3211 void EffectGraphVisitor::HandleStoreLocal(StoreLocalNode* node, |
| 3209 bool result_is_needed) { | 3212 bool result_is_needed) { |
| 3213 // If the right hand side is an expression that does not contain |
| 3214 // a safe point for the debugger to stop, add an explicit stub |
| 3215 // call. |
| 3216 if (node->value()->IsLiteralNode() || |
| 3217 node->value()->IsLoadLocalNode()) { |
| 3218 AddInstruction(new DebugStepCheckInstr(node->token_pos(), |
| 3219 PcDescriptors::kRuntimeCall)); |
| 3220 } |
| 3221 |
| 3210 ValueGraphVisitor for_value(owner()); | 3222 ValueGraphVisitor for_value(owner()); |
| 3211 node->value()->Visit(&for_value); | 3223 node->value()->Visit(&for_value); |
| 3212 Append(for_value); | 3224 Append(for_value); |
| 3213 Value* store_value = for_value.value(); | 3225 Value* store_value = for_value.value(); |
| 3214 if (FLAG_enable_type_checks) { | 3226 if (FLAG_enable_type_checks) { |
| 3215 store_value = BuildAssignableValue(node->value()->token_pos(), | 3227 store_value = BuildAssignableValue(node->value()->token_pos(), |
| 3216 store_value, | 3228 store_value, |
| 3217 node->local().type(), | 3229 node->local().type(), |
| 3218 node->local().name()); | 3230 node->local().name()); |
| 3219 } | 3231 } |
| (...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4040 LanguageError::kError, | 4052 LanguageError::kError, |
| 4041 Heap::kNew, | 4053 Heap::kNew, |
| 4042 "FlowGraphBuilder Bailout: %s %s", | 4054 "FlowGraphBuilder Bailout: %s %s", |
| 4043 String::Handle(function.name()).ToCString(), | 4055 String::Handle(function.name()).ToCString(), |
| 4044 reason)); | 4056 reason)); |
| 4045 Isolate::Current()->long_jump_base()->Jump(1, error); | 4057 Isolate::Current()->long_jump_base()->Jump(1, error); |
| 4046 } | 4058 } |
| 4047 | 4059 |
| 4048 | 4060 |
| 4049 } // namespace dart | 4061 } // namespace dart |
| OLD | NEW |