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 #ifndef VM_FLOW_GRAPH_BUILDER_H_ | 5 #ifndef VM_FLOW_GRAPH_BUILDER_H_ |
6 #define VM_FLOW_GRAPH_BUILDER_H_ | 6 #define VM_FLOW_GRAPH_BUILDER_H_ |
7 | 7 |
8 #include "vm/allocation.h" | 8 #include "vm/allocation.h" |
9 #include "vm/ast.h" | 9 #include "vm/ast.h" |
10 #include "vm/growable_array.h" | 10 #include "vm/growable_array.h" |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
108 | 108 |
109 // Append a 'while loop' test and back edge to this graph, depending on | 109 // Append a 'while loop' test and back edge to this graph, depending on |
110 // which parts are reachable. Afterward, the graph exit is the false | 110 // which parts are reachable. Afterward, the graph exit is the false |
111 // successor of the loop condition. | 111 // successor of the loop condition. |
112 void TieLoop(const TestGraphVisitor& test_fragment, | 112 void TieLoop(const TestGraphVisitor& test_fragment, |
113 const EffectGraphVisitor& body_fragment); | 113 const EffectGraphVisitor& body_fragment); |
114 | 114 |
115 protected: | 115 protected: |
116 // Helpers for translating parts of the AST. | 116 // Helpers for translating parts of the AST. |
117 void TranslateArgumentList(const ArgumentListNode& node, | 117 void TranslateArgumentList(const ArgumentListNode& node, |
118 intptr_t next_temp_index, | |
119 ZoneGrowableArray<Value*>* values); | 118 ZoneGrowableArray<Value*>* values); |
120 | 119 |
121 // Build the load part of a instance field increment. Translates the | 120 // Build the load part of a instance field increment. Translates the |
122 // receiver and loads the value. The receiver will be returned in the | 121 // receiver and loads the value. The receiver will be returned in the |
123 // output parameter 'receiver'. | 122 // output parameter 'receiver'. |
124 Definition* BuildIncrOpFieldLoad(IncrOpInstanceFieldNode* node, | 123 Definition* BuildIncrOpFieldLoad(IncrOpInstanceFieldNode* node, |
125 Value** receiver); | 124 Value** receiver); |
126 | 125 |
127 // Build the load part of an indexed increment. Translates the receiver | 126 // Build the load part of an indexed increment. Translates the receiver |
128 // and index and loads the value. The receiver will be returned in the | 127 // and index and loads the value. The receiver will be returned in the |
(...skipping 15 matching lines...) Expand all Loading... |
144 Definition* BuildFactoryTypeArguments(ConstructorCallNode* node); | 143 Definition* BuildFactoryTypeArguments(ConstructorCallNode* node); |
145 | 144 |
146 // Creates a possibly uninstantiated type argument vector and the type | 145 // Creates a possibly uninstantiated type argument vector and the type |
147 // argument vector of the instantiator (two values in 'args') used in | 146 // argument vector of the instantiator (two values in 'args') used in |
148 // preparation of a constructor call. | 147 // preparation of a constructor call. |
149 // May be called only if allocating an object of a parameterized class. | 148 // May be called only if allocating an object of a parameterized class. |
150 void BuildConstructorTypeArguments(ConstructorCallNode* node, | 149 void BuildConstructorTypeArguments(ConstructorCallNode* node, |
151 ZoneGrowableArray<Value*>* args); | 150 ZoneGrowableArray<Value*>* args); |
152 | 151 |
153 // Returns the value of the type arguments of the instantiator. | 152 // Returns the value of the type arguments of the instantiator. |
154 Value* BuildInstantiatorTypeArguments(intptr_t token_index, | 153 Value* BuildInstantiatorTypeArguments(intptr_t token_index); |
155 intptr_t start_index); | |
156 | 154 |
157 // Perform a type check on the given value. | 155 // Perform a type check on the given value. |
158 void BuildAssertAssignable(intptr_t token_index, | 156 void BuildAssertAssignable(intptr_t token_index, |
159 Value* value, | 157 Value* value, |
160 const AbstractType& dst_type, | 158 const AbstractType& dst_type, |
161 const String& dst_name, | 159 const String& dst_name); |
162 intptr_t start_index); | |
163 | 160 |
164 // Perform a type check on the given value and return it. | 161 // Perform a type check on the given value and return it. |
165 Value* BuildAssignableValue(AstNode* value_node, | 162 Value* BuildAssignableValue(AstNode* value_node, |
166 Value* value, | 163 Value* value, |
167 const AbstractType& dst_type, | 164 const AbstractType& dst_type, |
168 const String& dst_name, | 165 const String& dst_name); |
169 intptr_t start_index); | |
170 | 166 |
171 virtual void BuildInstanceOf(ComparisonNode* node); | 167 virtual void BuildInstanceOf(ComparisonNode* node); |
172 | 168 |
173 bool MustSaveRestoreContext(SequenceNode* node) const; | 169 bool MustSaveRestoreContext(SequenceNode* node) const; |
174 | 170 |
175 // Moves parent context into the context register. | 171 // Moves parent context into the context register. |
176 void UnchainContext(); | 172 void UnchainContext(); |
177 | 173 |
178 void CloseFragment() { exit_ = NULL; } | 174 void CloseFragment() { exit_ = NULL; } |
179 intptr_t AllocateTempIndex() { return temp_index_++; } | 175 intptr_t AllocateTempIndex() { return temp_index_++; } |
180 void DeallocateTempIndex() { --temp_index_; } | 176 void DeallocateTempIndex(intptr_t n) { |
| 177 ASSERT(temp_index_ >= n); |
| 178 temp_index_ -= n; |
| 179 } |
181 | 180 |
182 virtual void CompiletimeStringInterpolation(const Function& interpol_func, | 181 virtual void CompiletimeStringInterpolation(const Function& interpol_func, |
183 const Array& literals); | 182 const Array& literals); |
184 | 183 |
185 Definition* BuildObjectAllocation(ConstructorCallNode* node); | 184 Definition* BuildObjectAllocation(ConstructorCallNode* node); |
186 void BuildConstructorCall(ConstructorCallNode* node, Value* alloc_value); | 185 void BuildConstructorCall(ConstructorCallNode* node, Value* alloc_value); |
187 | 186 |
188 void BuildStoreContext(const LocalVariable& variable); | 187 void BuildStoreContext(const LocalVariable& variable); |
189 void BuildLoadContext(const LocalVariable& variable); | 188 void BuildLoadContext(const LocalVariable& variable); |
190 | 189 |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
241 // Helper to set the output state to return a Value. | 240 // Helper to set the output state to return a Value. |
242 virtual void ReturnValue(Value* value) { | 241 virtual void ReturnValue(Value* value) { |
243 ASSERT(value->IsUse() || value->IsTemp()); | 242 ASSERT(value->IsUse() || value->IsTemp()); |
244 value_ = value; | 243 value_ = value; |
245 } | 244 } |
246 | 245 |
247 // Specify a computation as the final result. Adds a Bind instruction to | 246 // Specify a computation as the final result. Adds a Bind instruction to |
248 // the graph and returns its temporary value (i.e., set the output | 247 // the graph and returns its temporary value (i.e., set the output |
249 // parameters). | 248 // parameters). |
250 virtual void ReturnComputation(Computation* computation) { | 249 virtual void ReturnComputation(Computation* computation) { |
251 BindInstr* defn = new BindInstr(temp_index(), computation); | 250 BindInstr* defn = new BindInstr(computation); |
252 AddInstruction(defn); | 251 AddInstruction(defn); |
253 AllocateTempIndex(); | 252 ReturnValue(new UseVal(defn)); |
254 value_ = new UseVal(defn); | |
255 } | 253 } |
256 | 254 |
257 virtual void CompiletimeStringInterpolation(const Function& interpol_func, | 255 virtual void CompiletimeStringInterpolation(const Function& interpol_func, |
258 const Array& literals); | 256 const Array& literals); |
259 | 257 |
260 virtual void BuildInstanceOf(ComparisonNode* node); | 258 virtual void BuildInstanceOf(ComparisonNode* node); |
261 }; | 259 }; |
262 | 260 |
263 | 261 |
264 // Translate an AstNode to a control-flow graph fragment for both its | 262 // Translate an AstNode to a control-flow graph fragment for both its |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
298 return false_successor_address_; | 296 return false_successor_address_; |
299 } | 297 } |
300 | 298 |
301 intptr_t condition_token_index() const { return condition_token_index_; } | 299 intptr_t condition_token_index() const { return condition_token_index_; } |
302 | 300 |
303 private: | 301 private: |
304 // Construct and concatenate a Branch instruction to this graph fragment. | 302 // Construct and concatenate a Branch instruction to this graph fragment. |
305 // Closes the fragment and sets the output parameters. | 303 // Closes the fragment and sets the output parameters. |
306 virtual void ReturnValue(Value* value); | 304 virtual void ReturnValue(Value* value); |
307 | 305 |
308 // Specify a computation as the final result. Adds a Bind instruction to | |
309 // the graph and branches on its value. | |
310 virtual void ReturnComputation(Computation* computation) { | |
311 BindInstr* defn = new BindInstr(temp_index(), computation); | |
312 AddInstruction(defn); | |
313 ReturnValue(new UseVal(defn)); | |
314 } | |
315 | |
316 // Output parameters. | 306 // Output parameters. |
317 TargetEntryInstr** true_successor_address_; | 307 TargetEntryInstr** true_successor_address_; |
318 TargetEntryInstr** false_successor_address_; | 308 TargetEntryInstr** false_successor_address_; |
319 | 309 |
320 intptr_t condition_token_index_; | 310 intptr_t condition_token_index_; |
321 }; | 311 }; |
322 | 312 |
323 } // namespace dart | 313 } // namespace dart |
324 | 314 |
325 #endif // VM_FLOW_GRAPH_BUILDER_H_ | 315 #endif // VM_FLOW_GRAPH_BUILDER_H_ |
OLD | NEW |