OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_PARSING_PARSER_BASE_H | 5 #ifndef V8_PARSING_PARSER_BASE_H |
6 #define V8_PARSING_PARSER_BASE_H | 6 #define V8_PARSING_PARSER_BASE_H |
7 | 7 |
8 #include "src/ast/scopes.h" | 8 #include "src/ast/scopes.h" |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/base/hashmap.h" | 10 #include "src/base/hashmap.h" |
(...skipping 265 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
276 | 276 |
277 // --------------------------------------------------------------------------- | 277 // --------------------------------------------------------------------------- |
278 // ScopeState and its subclasses implement the parser's scope stack. | 278 // ScopeState and its subclasses implement the parser's scope stack. |
279 // ScopeState keeps track of the current scope, and the outer ScopeState. The | 279 // ScopeState keeps track of the current scope, and the outer ScopeState. The |
280 // parser's scope_state_ points to the top ScopeState. ScopeState's | 280 // parser's scope_state_ points to the top ScopeState. ScopeState's |
281 // constructor push on the scope stack and the destructors pop. BlockState and | 281 // constructor push on the scope stack and the destructors pop. BlockState and |
282 // FunctionState are used to hold additional per-block and per-function state. | 282 // FunctionState are used to hold additional per-block and per-function state. |
283 class ScopeState BASE_EMBEDDED { | 283 class ScopeState BASE_EMBEDDED { |
284 public: | 284 public: |
285 V8_INLINE Scope* scope() const { return scope_; } | 285 V8_INLINE Scope* scope() const { return scope_; } |
| 286 Zone* zone() const { return scope_->zone(); } |
286 | 287 |
287 protected: | 288 protected: |
288 ScopeState(ScopeState** scope_stack, Scope* scope) | 289 ScopeState(ScopeState** scope_stack, Scope* scope) |
289 : scope_stack_(scope_stack), outer_scope_(*scope_stack), scope_(scope) { | 290 : scope_stack_(scope_stack), outer_scope_(*scope_stack), scope_(scope) { |
290 *scope_stack = this; | 291 *scope_stack = this; |
291 } | 292 } |
292 ~ScopeState() { *scope_stack_ = outer_scope_; } | 293 ~ScopeState() { *scope_stack_ = outer_scope_; } |
293 | 294 |
294 Zone* zone() const { return scope_->zone(); } | |
295 | |
296 private: | 295 private: |
297 ScopeState** scope_stack_; | 296 ScopeState** const scope_stack_; |
298 ScopeState* outer_scope_; | 297 ScopeState* const outer_scope_; |
299 Scope* scope_; | 298 Scope* scope_; |
300 }; | 299 }; |
301 | 300 |
302 class BlockState final : public ScopeState { | 301 class BlockState final : public ScopeState { |
303 public: | 302 public: |
304 BlockState(ScopeState** scope_stack, Scope* scope) | 303 BlockState(ScopeState** scope_stack, Scope* scope) |
305 : ScopeState(scope_stack, scope) {} | 304 : ScopeState(scope_stack, scope) {} |
| 305 |
| 306 // BlockState(ScopeState**) automatically manages Scope(BLOCK_SCOPE) |
| 307 // allocation. |
| 308 // TODO(verwaest): Move to LazyBlockState class that only allocates the |
| 309 // scope when needed. |
| 310 explicit BlockState(ScopeState** scope_stack) |
| 311 : ScopeState(scope_stack, NewScope(*scope_stack)) {} |
| 312 |
| 313 void SetNonlinear() { this->scope()->SetNonlinear(); } |
| 314 void set_start_position(int pos) { this->scope()->set_start_position(pos); } |
| 315 void set_end_position(int pos) { this->scope()->set_end_position(pos); } |
| 316 void set_is_hidden() { this->scope()->set_is_hidden(); } |
| 317 Scope* FinalizedBlockScope() const { |
| 318 return this->scope()->FinalizeBlockScope(); |
| 319 } |
| 320 LanguageMode language_mode() const { |
| 321 return this->scope()->language_mode(); |
| 322 } |
| 323 |
| 324 private: |
| 325 Scope* NewScope(ScopeState* outer_state) { |
| 326 Scope* parent = outer_state->scope(); |
| 327 Zone* zone = outer_state->zone(); |
| 328 return new (zone) Scope(zone, parent, BLOCK_SCOPE, kNormalFunction); |
| 329 } |
306 }; | 330 }; |
307 | 331 |
308 struct DestructuringAssignment { | 332 struct DestructuringAssignment { |
309 public: | 333 public: |
310 DestructuringAssignment(ExpressionT expression, Scope* scope) | 334 DestructuringAssignment(ExpressionT expression, Scope* scope) |
311 : assignment(expression), scope(scope) {} | 335 : assignment(expression), scope(scope) {} |
312 | 336 |
313 ExpressionT assignment; | 337 ExpressionT assignment; |
314 Scope* scope; | 338 Scope* scope; |
315 }; | 339 }; |
(...skipping 3337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3653 has_seen_constructor_ = true; | 3677 has_seen_constructor_ = true; |
3654 return; | 3678 return; |
3655 } | 3679 } |
3656 } | 3680 } |
3657 | 3681 |
3658 | 3682 |
3659 } // namespace internal | 3683 } // namespace internal |
3660 } // namespace v8 | 3684 } // namespace v8 |
3661 | 3685 |
3662 #endif // V8_PARSING_PARSER_BASE_H | 3686 #endif // V8_PARSING_PARSER_BASE_H |
OLD | NEW |