OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
140 virtual bool IsContinueTarget(Statement* target) { return false; } | 140 virtual bool IsContinueTarget(Statement* target) { return false; } |
141 virtual bool IsBreakTarget(Statement* target) { return false; } | 141 virtual bool IsBreakTarget(Statement* target) { return false; } |
142 | 142 |
143 // Generate code to leave the nested statement. This includes | 143 // Generate code to leave the nested statement. This includes |
144 // cleaning up any stack elements in use and restoring the | 144 // cleaning up any stack elements in use and restoring the |
145 // stack to the expectations of the surrounding statements. | 145 // stack to the expectations of the surrounding statements. |
146 // Takes a number of stack elements currently on top of the | 146 // Takes a number of stack elements currently on top of the |
147 // nested statement's stack, and returns a number of stack | 147 // nested statement's stack, and returns a number of stack |
148 // elements left on top of the surrounding statement's stack. | 148 // elements left on top of the surrounding statement's stack. |
149 // The generated code must preserve the result register (which | 149 // The generated code must preserve the result register (which |
150 // contains the value in case of a return). | 150 // contains the value in case of a return). |
Vyacheslav Egorov (Chromium)
2011/08/11 11:21:55
Comment is out of date. Please update.
Kevin Millikin (Chromium)
2011/08/11 15:22:20
Done.
| |
151 virtual int Exit(int stack_depth) { | 151 virtual NestedStatement* Exit(int* stack_depth, int* context_length) { |
152 // Default implementation for the case where there is | 152 // Default implementation for the case where there is |
153 // nothing to clean up. | 153 // nothing to clean up. |
154 return stack_depth; | 154 return previous_; |
155 } | 155 } |
156 NestedStatement* outer() { return previous_; } | |
157 | 156 |
158 protected: | 157 protected: |
159 MacroAssembler* masm() { return codegen_->masm(); } | 158 MacroAssembler* masm() { return codegen_->masm(); } |
160 | 159 |
161 private: | |
162 FullCodeGenerator* codegen_; | 160 FullCodeGenerator* codegen_; |
163 NestedStatement* previous_; | 161 NestedStatement* previous_; |
164 DISALLOW_COPY_AND_ASSIGN(NestedStatement); | 162 DISALLOW_COPY_AND_ASSIGN(NestedStatement); |
165 }; | 163 }; |
166 | 164 |
167 class Breakable : public NestedStatement { | 165 class Breakable : public NestedStatement { |
168 public: | 166 public: |
169 Breakable(FullCodeGenerator* codegen, | 167 Breakable(FullCodeGenerator* codegen, |
170 BreakableStatement* break_target) | 168 BreakableStatement* break_target) |
171 : NestedStatement(codegen), | 169 : NestedStatement(codegen), |
(...skipping 28 matching lines...) Expand all Loading... | |
200 }; | 198 }; |
201 | 199 |
202 // The environment inside the try block of a try/catch statement. | 200 // The environment inside the try block of a try/catch statement. |
203 class TryCatch : public NestedStatement { | 201 class TryCatch : public NestedStatement { |
204 public: | 202 public: |
205 explicit TryCatch(FullCodeGenerator* codegen, Label* catch_entry) | 203 explicit TryCatch(FullCodeGenerator* codegen, Label* catch_entry) |
206 : NestedStatement(codegen), catch_entry_(catch_entry) { } | 204 : NestedStatement(codegen), catch_entry_(catch_entry) { } |
207 virtual ~TryCatch() {} | 205 virtual ~TryCatch() {} |
208 virtual TryCatch* AsTryCatch() { return this; } | 206 virtual TryCatch* AsTryCatch() { return this; } |
209 Label* catch_entry() { return catch_entry_; } | 207 Label* catch_entry() { return catch_entry_; } |
210 virtual int Exit(int stack_depth); | 208 virtual NestedStatement* Exit(int* stack_depth, int* context_length); |
211 private: | 209 private: |
212 Label* catch_entry_; | 210 Label* catch_entry_; |
213 DISALLOW_COPY_AND_ASSIGN(TryCatch); | 211 DISALLOW_COPY_AND_ASSIGN(TryCatch); |
214 }; | 212 }; |
215 | 213 |
216 // The environment inside the try block of a try/finally statement. | 214 // The environment inside the try block of a try/finally statement. |
217 class TryFinally : public NestedStatement { | 215 class TryFinally : public NestedStatement { |
218 public: | 216 public: |
219 explicit TryFinally(FullCodeGenerator* codegen, Label* finally_entry) | 217 explicit TryFinally(FullCodeGenerator* codegen, Label* finally_entry) |
220 : NestedStatement(codegen), finally_entry_(finally_entry) { } | 218 : NestedStatement(codegen), finally_entry_(finally_entry) { } |
221 virtual ~TryFinally() {} | 219 virtual ~TryFinally() {} |
222 virtual TryFinally* AsTryFinally() { return this; } | 220 virtual TryFinally* AsTryFinally() { return this; } |
223 Label* finally_entry() { return finally_entry_; } | 221 Label* finally_entry() { return finally_entry_; } |
224 virtual int Exit(int stack_depth); | 222 virtual NestedStatement* Exit(int* stack_depth, int* context_length); |
225 private: | 223 private: |
226 Label* finally_entry_; | 224 Label* finally_entry_; |
227 DISALLOW_COPY_AND_ASSIGN(TryFinally); | 225 DISALLOW_COPY_AND_ASSIGN(TryFinally); |
228 }; | 226 }; |
229 | 227 |
230 // A FinallyEnvironment represents being inside a finally block. | 228 // A FinallyEnvironment represents being inside a finally block. |
231 // Abnormal termination of the finally block needs to clean up | 229 // Abnormal termination of the finally block needs to clean up |
232 // the block's parameters from the stack. | 230 // the block's parameters from the stack. |
233 class Finally : public NestedStatement { | 231 class Finally : public NestedStatement { |
234 public: | 232 public: |
235 explicit Finally(FullCodeGenerator* codegen) : NestedStatement(codegen) { } | 233 explicit Finally(FullCodeGenerator* codegen) : NestedStatement(codegen) { } |
236 virtual ~Finally() {} | 234 virtual ~Finally() {} |
237 virtual Finally* AsFinally() { return this; } | 235 virtual Finally* AsFinally() { return this; } |
238 virtual int Exit(int stack_depth) { | 236 virtual NestedStatement* Exit(int* stack_depth, int* context_length) { |
239 return stack_depth + kFinallyStackElementCount; | 237 *stack_depth += kFinallyStackElementCount; |
238 return previous_; | |
240 } | 239 } |
241 private: | 240 private: |
242 // Number of extra stack slots occupied during a finally block. | 241 // Number of extra stack slots occupied during a finally block. |
243 static const int kFinallyStackElementCount = 2; | 242 static const int kFinallyStackElementCount = 2; |
244 DISALLOW_COPY_AND_ASSIGN(Finally); | 243 DISALLOW_COPY_AND_ASSIGN(Finally); |
245 }; | 244 }; |
246 | 245 |
247 // A ForInEnvironment represents being inside a for-in loop. | 246 // A ForInEnvironment represents being inside a for-in loop. |
248 // Abnormal termination of the for-in block needs to clean up | 247 // Abnormal termination of the for-in block needs to clean up |
249 // the block's temporary storage from the stack. | 248 // the block's temporary storage from the stack. |
250 class ForIn : public Iteration { | 249 class ForIn : public Iteration { |
251 public: | 250 public: |
252 ForIn(FullCodeGenerator* codegen, | 251 ForIn(FullCodeGenerator* codegen, |
253 ForInStatement* statement) | 252 ForInStatement* statement) |
254 : Iteration(codegen, statement) { } | 253 : Iteration(codegen, statement) { } |
255 virtual ~ForIn() {} | 254 virtual ~ForIn() {} |
256 virtual ForIn* AsForIn() { return this; } | 255 virtual ForIn* AsForIn() { return this; } |
257 virtual int Exit(int stack_depth) { | 256 virtual NestedStatement* Exit(int* stack_depth, int* context_length) { |
258 return stack_depth + kForInStackElementCount; | 257 *stack_depth += kForInStackElementCount; |
258 return previous_; | |
259 } | 259 } |
260 private: | 260 private: |
261 static const int kForInStackElementCount = 5; | 261 static const int kForInStackElementCount = 5; |
262 DISALLOW_COPY_AND_ASSIGN(ForIn); | 262 DISALLOW_COPY_AND_ASSIGN(ForIn); |
263 }; | 263 }; |
264 | 264 |
265 | |
266 // A WithOrCatch represents being inside the body of a with or catch | |
267 // statement. Exiting the body needs to remove a link from the context | |
268 // chain. | |
269 class WithOrCatch : public NestedStatement { | |
270 public: | |
271 explicit WithOrCatch(FullCodeGenerator* codegen) | |
272 : NestedStatement(codegen) { | |
273 } | |
274 virtual ~WithOrCatch() {} | |
275 | |
276 virtual NestedStatement* Exit(int* stack_depth, int* context_length) { | |
277 ++(*context_length); | |
278 return previous_; | |
279 } | |
280 }; | |
281 | |
265 // The forward bailout stack keeps track of the expressions that can | 282 // The forward bailout stack keeps track of the expressions that can |
266 // bail out to just before the control flow is split in a child | 283 // bail out to just before the control flow is split in a child |
267 // node. The stack elements are linked together through the parent | 284 // node. The stack elements are linked together through the parent |
268 // link when visiting expressions in test contexts after requesting | 285 // link when visiting expressions in test contexts after requesting |
269 // bailout in child forwarding. | 286 // bailout in child forwarding. |
270 class ForwardBailoutStack BASE_EMBEDDED { | 287 class ForwardBailoutStack BASE_EMBEDDED { |
271 public: | 288 public: |
272 ForwardBailoutStack(Expression* expr, ForwardBailoutStack* parent) | 289 ForwardBailoutStack(Expression* expr, ForwardBailoutStack* parent) |
273 : expr_(expr), parent_(parent) { } | 290 : expr_(expr), parent_(parent) { } |
274 | 291 |
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
804 | 821 |
805 friend class NestedStatement; | 822 friend class NestedStatement; |
806 | 823 |
807 DISALLOW_COPY_AND_ASSIGN(FullCodeGenerator); | 824 DISALLOW_COPY_AND_ASSIGN(FullCodeGenerator); |
808 }; | 825 }; |
809 | 826 |
810 | 827 |
811 } } // namespace v8::internal | 828 } } // namespace v8::internal |
812 | 829 |
813 #endif // V8_FULL_CODEGEN_H_ | 830 #endif // V8_FULL_CODEGEN_H_ |
OLD | NEW |