Chromium Code Reviews| 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 82 virtual intptr_t ContextLevel() const; | 82 virtual intptr_t ContextLevel() const; |
| 83 | 83 |
| 84 virtual JoinEntryInstr* BreakTargetFor(SourceLabel* label); | 84 virtual JoinEntryInstr* BreakTargetFor(SourceLabel* label); |
| 85 virtual JoinEntryInstr* ContinueTargetFor(SourceLabel* label); | 85 virtual JoinEntryInstr* ContinueTargetFor(SourceLabel* label); |
| 86 | 86 |
| 87 protected: | 87 protected: |
| 88 NestedStatement(FlowGraphBuilder* owner, const SourceLabel* label) | 88 NestedStatement(FlowGraphBuilder* owner, const SourceLabel* label) |
| 89 : owner_(owner), | 89 : owner_(owner), |
| 90 label_(label), | 90 label_(label), |
| 91 outer_(owner->nesting_stack_), | 91 outer_(owner->nesting_stack_), |
| 92 break_target_(NULL) { | 92 break_target_(NULL), |
| 93 try_index_(owner->try_index()) { | |
| 93 // Push on the owner's nesting stack. | 94 // Push on the owner's nesting stack. |
| 94 owner->nesting_stack_ = this; | 95 owner->nesting_stack_ = this; |
| 95 } | 96 } |
| 96 | 97 |
| 98 intptr_t try_index() const { return try_index_; } | |
| 99 | |
| 97 virtual ~NestedStatement() { | 100 virtual ~NestedStatement() { |
| 98 // Pop from the owner's nesting stack. | 101 // Pop from the owner's nesting stack. |
| 99 ASSERT(owner_->nesting_stack_ == this); | 102 ASSERT(owner_->nesting_stack_ == this); |
| 100 owner_->nesting_stack_ = outer_; | 103 owner_->nesting_stack_ = outer_; |
| 101 } | 104 } |
| 102 | 105 |
| 103 private: | 106 private: |
| 104 FlowGraphBuilder* owner_; | 107 FlowGraphBuilder* owner_; |
| 105 const SourceLabel* label_; | 108 const SourceLabel* label_; |
| 106 NestedStatement* outer_; | 109 NestedStatement* outer_; |
| 107 | 110 |
| 108 JoinEntryInstr* break_target_; | 111 JoinEntryInstr* break_target_; |
| 112 intptr_t try_index_; | |
|
srdjan
2014/06/02 18:29:31
const?
Florian Schneider
2014/06/03 10:50:18
Yes, I will add it in my next cl.
| |
| 109 }; | 113 }; |
| 110 | 114 |
| 111 | 115 |
| 112 intptr_t NestedStatement::ContextLevel() const { | 116 intptr_t NestedStatement::ContextLevel() const { |
| 113 // Context level is determined by the innermost nested statement having one. | 117 // Context level is determined by the innermost nested statement having one. |
| 114 return (outer() == NULL) ? 0 : outer()->ContextLevel(); | 118 return (outer() == NULL) ? 0 : outer()->ContextLevel(); |
| 115 } | 119 } |
| 116 | 120 |
| 117 | 121 |
| 118 intptr_t FlowGraphBuilder::context_level() const { | 122 intptr_t FlowGraphBuilder::context_level() const { |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 174 | 178 |
| 175 private: | 179 private: |
| 176 JoinEntryInstr* continue_target_; | 180 JoinEntryInstr* continue_target_; |
| 177 }; | 181 }; |
| 178 | 182 |
| 179 | 183 |
| 180 JoinEntryInstr* NestedLoop::ContinueTargetFor(SourceLabel* label) { | 184 JoinEntryInstr* NestedLoop::ContinueTargetFor(SourceLabel* label) { |
| 181 if (label != this->label()) return NULL; | 185 if (label != this->label()) return NULL; |
| 182 if (continue_target_ == NULL) { | 186 if (continue_target_ == NULL) { |
| 183 continue_target_ = | 187 continue_target_ = |
| 184 new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index()); | 188 new JoinEntryInstr(owner()->AllocateBlockId(), try_index()); |
| 185 } | 189 } |
| 186 return continue_target_; | 190 return continue_target_; |
| 187 } | 191 } |
| 188 | 192 |
| 189 | 193 |
| 190 // A nested switch which can be the target of a break if labeled, and whose | 194 // A nested switch which can be the target of a break if labeled, and whose |
| 191 // cases can be the targets of continues. | 195 // cases can be the targets of continues. |
| 192 class NestedSwitch : public NestedStatement { | 196 class NestedSwitch : public NestedStatement { |
| 193 public: | 197 public: |
| 194 NestedSwitch(FlowGraphBuilder* owner, SwitchNode* node); | 198 NestedSwitch(FlowGraphBuilder* owner, SwitchNode* node); |
| (...skipping 22 matching lines...) Expand all Loading... | |
| 217 | 221 |
| 218 | 222 |
| 219 JoinEntryInstr* NestedSwitch::ContinueTargetFor(SourceLabel* label) { | 223 JoinEntryInstr* NestedSwitch::ContinueTargetFor(SourceLabel* label) { |
| 220 // Allocate a join for a case clause that matches the label. This block | 224 // Allocate a join for a case clause that matches the label. This block |
| 221 // is not necessarily targeted by a continue, but we always use a join in | 225 // is not necessarily targeted by a continue, but we always use a join in |
| 222 // the graph anyway. | 226 // the graph anyway. |
| 223 for (intptr_t i = 0; i < case_labels_.length(); ++i) { | 227 for (intptr_t i = 0; i < case_labels_.length(); ++i) { |
| 224 if (label != case_labels_[i]) continue; | 228 if (label != case_labels_[i]) continue; |
| 225 if (case_targets_[i] == NULL) { | 229 if (case_targets_[i] == NULL) { |
| 226 case_targets_[i] = | 230 case_targets_[i] = |
| 227 new JoinEntryInstr(owner()->AllocateBlockId(), owner()->try_index()); | 231 new JoinEntryInstr(owner()->AllocateBlockId(), try_index()); |
| 228 } | 232 } |
| 229 return case_targets_[i]; | 233 return case_targets_[i]; |
| 230 } | 234 } |
| 231 return NULL; | 235 return NULL; |
| 232 } | 236 } |
| 233 | 237 |
| 234 | 238 |
| 235 FlowGraphBuilder::FlowGraphBuilder(ParsedFunction* parsed_function, | 239 FlowGraphBuilder::FlowGraphBuilder(ParsedFunction* parsed_function, |
| 236 const Array& ic_data_array, | 240 const Array& ic_data_array, |
| 237 InlineExitCollector* exit_collector, | 241 InlineExitCollector* exit_collector, |
| (...skipping 3747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3985 LanguageError::kBailout, | 3989 LanguageError::kBailout, |
| 3986 Heap::kNew, | 3990 Heap::kNew, |
| 3987 "FlowGraphBuilder Bailout: %s %s", | 3991 "FlowGraphBuilder Bailout: %s %s", |
| 3988 String::Handle(I, function.name()).ToCString(), | 3992 String::Handle(I, function.name()).ToCString(), |
| 3989 reason)); | 3993 reason)); |
| 3990 I->long_jump_base()->Jump(1, error); | 3994 I->long_jump_base()->Jump(1, error); |
| 3991 UNREACHABLE(); | 3995 UNREACHABLE(); |
| 3992 } | 3996 } |
| 3993 | 3997 |
| 3994 } // namespace dart | 3998 } // namespace dart |
| OLD | NEW |