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 20 matching lines...) Expand all Loading... |
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"); | 38 DEFINE_FLAG(bool, support_debugger, true, "Emit code needed for debugging"); |
39 DEFINE_FLAG(bool, trace_type_check_elimination, false, | 39 DEFINE_FLAG(bool, trace_type_check_elimination, false, |
40 "Trace type check elimination at compile time."); | 40 "Trace type check elimination at compile time."); |
41 DEFINE_FLAG(bool, precompile_collect_closures, false, | |
42 "Collect all closure functions referenced from compiled code."); | |
43 | 41 |
44 DECLARE_FLAG(int, optimization_counter_threshold); | 42 DECLARE_FLAG(int, optimization_counter_threshold); |
45 DECLARE_FLAG(bool, profile_vm); | 43 DECLARE_FLAG(bool, profile_vm); |
46 DECLARE_FLAG(bool, warn_on_javascript_compatibility); | 44 DECLARE_FLAG(bool, warn_on_javascript_compatibility); |
47 DECLARE_FLAG(bool, use_field_guards); | 45 DECLARE_FLAG(bool, use_field_guards); |
48 | 46 |
49 // Quick access to the locally defined zone() method. | 47 // Quick access to the locally defined zone() method. |
50 #define Z (zone()) | 48 #define Z (zone()) |
51 | 49 |
52 // TODO(srdjan): Allow compiler to add constants as they are encountered in | 50 // TODO(srdjan): Allow compiler to add constants as they are encountered in |
(...skipping 2465 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2518 return; | 2516 return; |
2519 } | 2517 } |
2520 arguments->Visit(&for_argument); | 2518 arguments->Visit(&for_argument); |
2521 Append(for_argument); | 2519 Append(for_argument); |
2522 StringInterpolateInstr* instr = | 2520 StringInterpolateInstr* instr = |
2523 new(Z) StringInterpolateInstr(for_argument.value(), node->token_pos()); | 2521 new(Z) StringInterpolateInstr(for_argument.value(), node->token_pos()); |
2524 ReturnDefinition(instr); | 2522 ReturnDefinition(instr); |
2525 } | 2523 } |
2526 | 2524 |
2527 | 2525 |
2528 // TODO(rmacnak): De-dup closures in inlined-finally and track down other | |
2529 // stragglers to use Class::closures instead. | |
2530 static void CollectClosureFunction(const Function& function) { | |
2531 if (function.HasCode()) return; | |
2532 | |
2533 // Although this is only called when precompiling, this can happen before | |
2534 // Dart_Precompile as part of loading code, so check for a non-null work | |
2535 // list. | |
2536 Thread* thread = Thread::Current(); | |
2537 Isolate* isolate = thread->isolate(); | |
2538 if (isolate->collected_closures() != GrowableObjectArray::null()) { | |
2539 const GrowableObjectArray& functions = | |
2540 GrowableObjectArray::Handle(thread->zone(), | |
2541 isolate->collected_closures()); | |
2542 functions.Add(function); | |
2543 } | |
2544 } | |
2545 | |
2546 | |
2547 void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) { | 2526 void EffectGraphVisitor::VisitClosureNode(ClosureNode* node) { |
2548 const Function& function = node->function(); | 2527 const Function& function = node->function(); |
2549 if (FLAG_precompile_collect_closures) { | |
2550 CollectClosureFunction(function); | |
2551 } | |
2552 | |
2553 if (function.IsImplicitStaticClosureFunction()) { | 2528 if (function.IsImplicitStaticClosureFunction()) { |
2554 const Instance& closure = | 2529 const Instance& closure = |
2555 Instance::ZoneHandle(Z, function.ImplicitStaticClosure()); | 2530 Instance::ZoneHandle(Z, function.ImplicitStaticClosure()); |
2556 ReturnDefinition(new(Z) ConstantInstr(closure)); | 2531 ReturnDefinition(new(Z) ConstantInstr(closure)); |
2557 return; | 2532 return; |
2558 } | 2533 } |
| 2534 |
2559 const bool is_implicit = function.IsImplicitInstanceClosureFunction(); | 2535 const bool is_implicit = function.IsImplicitInstanceClosureFunction(); |
2560 ASSERT(is_implicit || function.IsNonImplicitClosureFunction()); | 2536 ASSERT(is_implicit || function.IsNonImplicitClosureFunction()); |
2561 // The context scope may have already been set by the non-optimizing | 2537 // The context scope may have already been set by the non-optimizing |
2562 // compiler. If it was not, set it here. | 2538 // compiler. If it was not, set it here. |
2563 if (function.context_scope() == ContextScope::null()) { | 2539 if (function.context_scope() == ContextScope::null()) { |
2564 ASSERT(!is_implicit); | 2540 ASSERT(!is_implicit); |
2565 const ContextScope& context_scope = ContextScope::ZoneHandle( | 2541 const ContextScope& context_scope = ContextScope::ZoneHandle( |
2566 Z, node->scope()->PreserveOuterScope(owner()->context_level())); | 2542 Z, node->scope()->PreserveOuterScope(owner()->context_level())); |
2567 ASSERT(!function.HasCode()); | 2543 ASSERT(!function.HasCode()); |
2568 ASSERT(function.context_scope() == ContextScope::null()); | 2544 ASSERT(function.context_scope() == ContextScope::null()); |
(...skipping 2128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4697 Report::MessageF(Report::kBailout, | 4673 Report::MessageF(Report::kBailout, |
4698 Script::Handle(function.script()), | 4674 Script::Handle(function.script()), |
4699 function.token_pos(), | 4675 function.token_pos(), |
4700 "FlowGraphBuilder Bailout: %s %s", | 4676 "FlowGraphBuilder Bailout: %s %s", |
4701 String::Handle(function.name()).ToCString(), | 4677 String::Handle(function.name()).ToCString(), |
4702 reason); | 4678 reason); |
4703 UNREACHABLE(); | 4679 UNREACHABLE(); |
4704 } | 4680 } |
4705 | 4681 |
4706 } // namespace dart | 4682 } // namespace dart |
OLD | NEW |