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 17 matching lines...) Expand all Loading... | |
28 #include "vm/symbols.h" | 28 #include "vm/symbols.h" |
29 #include "vm/token.h" | 29 #include "vm/token.h" |
30 #include "vm/zone.h" | 30 #include "vm/zone.h" |
31 | 31 |
32 namespace dart { | 32 namespace dart { |
33 | 33 |
34 DEFINE_FLAG(bool, eliminate_type_checks, true, | 34 DEFINE_FLAG(bool, eliminate_type_checks, true, |
35 "Eliminate type checks when allowed by static type analysis."); | 35 "Eliminate type checks when allowed by static type analysis."); |
36 DEFINE_FLAG(bool, print_ast, false, "Print abstract syntax tree."); | 36 DEFINE_FLAG(bool, print_ast, false, "Print abstract syntax tree."); |
37 DEFINE_FLAG(bool, print_scopes, false, "Print scopes of local variables."); | 37 DEFINE_FLAG(bool, print_scopes, false, "Print scopes of local variables."); |
38 DEFINE_FLAG(bool, support_debugger, true, "Emit code needed for debugging"); | |
hausner
2015/05/05 15:59:15
Would be nice to use the --debug command line opti
srdjan
2015/05/06 21:02:54
This flag should not be used by user, the flag wil
| |
38 DEFINE_FLAG(bool, trace_type_check_elimination, false, | 39 DEFINE_FLAG(bool, trace_type_check_elimination, false, |
39 "Trace type check elimination at compile time."); | 40 "Trace type check elimination at compile time."); |
40 | 41 |
41 DECLARE_FLAG(bool, enable_asserts); | 42 DECLARE_FLAG(bool, enable_asserts); |
42 DECLARE_FLAG(bool, enable_type_checks); | 43 DECLARE_FLAG(bool, enable_type_checks); |
43 DECLARE_FLAG(int, optimization_counter_threshold); | 44 DECLARE_FLAG(int, optimization_counter_threshold); |
44 DECLARE_FLAG(bool, warn_on_javascript_compatibility); | 45 DECLARE_FLAG(bool, warn_on_javascript_compatibility); |
45 DECLARE_FLAG(bool, use_field_guards); | 46 DECLARE_FLAG(bool, use_field_guards); |
46 | 47 |
47 // Quick access to the locally defined zone() method. | 48 // Quick access to the locally defined zone() method. |
(...skipping 987 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1035 } | 1036 } |
1036 return_value = Bind(BuildLoadLocal(*temp)); | 1037 return_value = Bind(BuildLoadLocal(*temp)); |
1037 } | 1038 } |
1038 | 1039 |
1039 // Call to stub that checks whether the debugger is in single | 1040 // Call to stub that checks whether the debugger is in single |
1040 // step mode. This call must happen before the contexts are | 1041 // step mode. This call must happen before the contexts are |
1041 // unchained so that captured variables can be inspected. | 1042 // unchained so that captured variables can be inspected. |
1042 // No debugger check is done in native functions or for return | 1043 // No debugger check is done in native functions or for return |
1043 // statements for which there is no associated source position. | 1044 // statements for which there is no associated source position. |
1044 const Function& function = owner()->function(); | 1045 const Function& function = owner()->function(); |
1045 if ((node->token_pos() != Scanner::kNoSourcePos) && !function.is_native()) { | 1046 if (FLAG_support_debugger && |
1047 (node->token_pos() != Scanner::kNoSourcePos) && !function.is_native()) { | |
1046 AddInstruction(new(Z) DebugStepCheckInstr(node->token_pos(), | 1048 AddInstruction(new(Z) DebugStepCheckInstr(node->token_pos(), |
1047 RawPcDescriptors::kRuntimeCall)); | 1049 RawPcDescriptors::kRuntimeCall)); |
1048 } | 1050 } |
1049 | 1051 |
1050 if (Isolate::Current()->TypeChecksEnabled()) { | 1052 if (Isolate::Current()->TypeChecksEnabled()) { |
1051 const bool is_implicit_dynamic_getter = | 1053 const bool is_implicit_dynamic_getter = |
1052 (!function.is_static() && | 1054 (!function.is_static() && |
1053 ((function.kind() == RawFunction::kImplicitGetter) || | 1055 ((function.kind() == RawFunction::kImplicitGetter) || |
1054 (function.kind() == RawFunction::kImplicitStaticFinalGetter))); | 1056 (function.kind() == RawFunction::kImplicitStaticFinalGetter))); |
1055 // Implicit getters do not need a type check at return, unless they compute | 1057 // Implicit getters do not need a type check at return, unless they compute |
(...skipping 2375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3431 } | 3433 } |
3432 | 3434 |
3433 | 3435 |
3434 // <Expression> ::= StoreLocal { local: LocalVariable | 3436 // <Expression> ::= StoreLocal { local: LocalVariable |
3435 // value: <Expression> } | 3437 // value: <Expression> } |
3436 void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) { | 3438 void EffectGraphVisitor::VisitStoreLocalNode(StoreLocalNode* node) { |
3437 // If the right hand side is an expression that does not contain | 3439 // If the right hand side is an expression that does not contain |
3438 // a safe point for the debugger to stop, add an explicit stub | 3440 // a safe point for the debugger to stop, add an explicit stub |
3439 // call. Exception: don't do this when assigning to or from internal | 3441 // call. Exception: don't do this when assigning to or from internal |
3440 // variables, or for generated code that has no source position. | 3442 // variables, or for generated code that has no source position. |
3441 if ((node->value()->IsLiteralNode() || | 3443 if (FLAG_support_debugger) { |
3442 (node->value()->IsLoadLocalNode() && | 3444 if ((node->value()->IsLiteralNode() || |
3443 !node->value()->AsLoadLocalNode()->local().IsInternal()) || | 3445 (node->value()->IsLoadLocalNode() && |
3444 node->value()->IsClosureNode()) && | 3446 !node->value()->AsLoadLocalNode()->local().IsInternal()) || |
3445 !node->local().IsInternal() && | 3447 node->value()->IsClosureNode()) && |
3446 (node->token_pos() != Scanner::kNoSourcePos)) { | 3448 !node->local().IsInternal() && |
3447 AddInstruction(new(Z) DebugStepCheckInstr( | 3449 (node->token_pos() != Scanner::kNoSourcePos)) { |
3448 node->token_pos(), RawPcDescriptors::kRuntimeCall)); | 3450 AddInstruction(new(Z) DebugStepCheckInstr( |
3451 node->token_pos(), RawPcDescriptors::kRuntimeCall)); | |
3452 } | |
3449 } | 3453 } |
3450 | 3454 |
3451 ValueGraphVisitor for_value(owner()); | 3455 ValueGraphVisitor for_value(owner()); |
3452 node->value()->Visit(&for_value); | 3456 node->value()->Visit(&for_value); |
3453 Append(for_value); | 3457 Append(for_value); |
3454 Value* store_value = for_value.value(); | 3458 Value* store_value = for_value.value(); |
3455 if (Isolate::Current()->TypeChecksEnabled()) { | 3459 if (Isolate::Current()->TypeChecksEnabled()) { |
3456 store_value = BuildAssignableValue(node->value()->token_pos(), | 3460 store_value = BuildAssignableValue(node->value()->token_pos(), |
3457 store_value, | 3461 store_value, |
3458 node->local().type(), | 3462 node->local().type(), |
(...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4242 ASSERT(!func.IsNull()); | 4246 ASSERT(!func.IsNull()); |
4243 return new(Z) StaticCallInstr(token_pos, | 4247 return new(Z) StaticCallInstr(token_pos, |
4244 func, | 4248 func, |
4245 Object::null_array(), // No names. | 4249 Object::null_array(), // No names. |
4246 arguments, | 4250 arguments, |
4247 owner()->ic_data_array()); | 4251 owner()->ic_data_array()); |
4248 } | 4252 } |
4249 | 4253 |
4250 | 4254 |
4251 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) { | 4255 void EffectGraphVisitor::BuildThrowNode(ThrowNode* node) { |
4252 if (node->exception()->IsLiteralNode() || | 4256 if (FLAG_support_debugger) { |
4253 node->exception()->IsLoadLocalNode() || | 4257 if (node->exception()->IsLiteralNode() || |
4254 node->exception()->IsClosureNode()) { | 4258 node->exception()->IsLoadLocalNode() || |
4255 AddInstruction(new(Z) DebugStepCheckInstr( | 4259 node->exception()->IsClosureNode()) { |
4256 node->token_pos(), RawPcDescriptors::kRuntimeCall)); | 4260 AddInstruction(new(Z) DebugStepCheckInstr( |
4261 node->token_pos(), RawPcDescriptors::kRuntimeCall)); | |
4262 } | |
4257 } | 4263 } |
4258 ValueGraphVisitor for_exception(owner()); | 4264 ValueGraphVisitor for_exception(owner()); |
4259 node->exception()->Visit(&for_exception); | 4265 node->exception()->Visit(&for_exception); |
4260 Append(for_exception); | 4266 Append(for_exception); |
4261 PushArgument(for_exception.value()); | 4267 PushArgument(for_exception.value()); |
4262 Instruction* instr = NULL; | 4268 Instruction* instr = NULL; |
4263 if (node->stacktrace() == NULL) { | 4269 if (node->stacktrace() == NULL) { |
4264 instr = new(Z) ThrowInstr(node->token_pos()); | 4270 instr = new(Z) ThrowInstr(node->token_pos()); |
4265 } else { | 4271 } else { |
4266 ValueGraphVisitor for_stack_trace(owner()); | 4272 ValueGraphVisitor for_stack_trace(owner()); |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4377 Report::MessageF(Report::kBailout, | 4383 Report::MessageF(Report::kBailout, |
4378 Script::Handle(function.script()), | 4384 Script::Handle(function.script()), |
4379 function.token_pos(), | 4385 function.token_pos(), |
4380 "FlowGraphBuilder Bailout: %s %s", | 4386 "FlowGraphBuilder Bailout: %s %s", |
4381 String::Handle(function.name()).ToCString(), | 4387 String::Handle(function.name()).ToCString(), |
4382 reason); | 4388 reason); |
4383 UNREACHABLE(); | 4389 UNREACHABLE(); |
4384 } | 4390 } |
4385 | 4391 |
4386 } // namespace dart | 4392 } // namespace dart |
OLD | NEW |