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_SCOPES_H_ | 5 #ifndef V8_SCOPES_H_ |
6 #define V8_SCOPES_H_ | 6 #define V8_SCOPES_H_ |
7 | 7 |
8 #include "src/ast.h" | 8 #include "src/ast.h" |
9 #include "src/pending-compilation-error-handler.h" | 9 #include "src/pending-compilation-error-handler.h" |
10 #include "src/zone.h" | 10 #include "src/zone.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 int index = mode - DYNAMIC; | 50 int index = mode - DYNAMIC; |
51 DCHECK(index >= 0 && index < 3); | 51 DCHECK(index >= 0 && index < 3); |
52 return maps_[index]; | 52 return maps_[index]; |
53 } | 53 } |
54 | 54 |
55 private: | 55 private: |
56 VariableMap *maps_[3]; | 56 VariableMap *maps_[3]; |
57 }; | 57 }; |
58 | 58 |
59 | 59 |
| 60 // Sloppy block-scoped function declarations to var-bind |
| 61 class SloppyBlockFunctionMap : public ZoneHashMap { |
| 62 public: |
| 63 explicit SloppyBlockFunctionMap(Zone* zone); |
| 64 |
| 65 virtual ~SloppyBlockFunctionMap(); |
| 66 |
| 67 void Declare(const AstRawString* name, |
| 68 SloppyBlockFunctionStatement* statement); |
| 69 |
| 70 typedef ZoneVector<SloppyBlockFunctionStatement*> Vector; |
| 71 |
| 72 private: |
| 73 Zone* zone_; |
| 74 }; |
| 75 |
| 76 |
60 // Global invariants after AST construction: Each reference (i.e. identifier) | 77 // Global invariants after AST construction: Each reference (i.e. identifier) |
61 // to a JavaScript variable (including global properties) is represented by a | 78 // to a JavaScript variable (including global properties) is represented by a |
62 // VariableProxy node. Immediately after AST construction and before variable | 79 // VariableProxy node. Immediately after AST construction and before variable |
63 // allocation, most VariableProxy nodes are "unresolved", i.e. not bound to a | 80 // allocation, most VariableProxy nodes are "unresolved", i.e. not bound to a |
64 // corresponding variable (though some are bound during parse time). Variable | 81 // corresponding variable (though some are bound during parse time). Variable |
65 // allocation binds each unresolved VariableProxy to one Variable and assigns | 82 // allocation binds each unresolved VariableProxy to one Variable and assigns |
66 // a location. Note that many VariableProxy nodes may refer to the same Java- | 83 // a location. Note that many VariableProxy nodes may refer to the same Java- |
67 // Script variable. | 84 // Script variable. |
68 | 85 |
69 class Scope: public ZoneObject { | 86 class Scope: public ZoneObject { |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 return variables_.Lookup(name) != NULL; | 554 return variables_.Lookup(name) != NULL; |
538 } | 555 } |
539 | 556 |
540 bool IsDeclaredParameter(const AstRawString* name) { | 557 bool IsDeclaredParameter(const AstRawString* name) { |
541 // If IsSimpleParameterList is false, duplicate parameters are not allowed, | 558 // If IsSimpleParameterList is false, duplicate parameters are not allowed, |
542 // however `arguments` may be allowed if function is not strict code. Thus, | 559 // however `arguments` may be allowed if function is not strict code. Thus, |
543 // the assumptions explained above do not hold. | 560 // the assumptions explained above do not hold. |
544 return params_.Contains(variables_.Lookup(name)); | 561 return params_.Contains(variables_.Lookup(name)); |
545 } | 562 } |
546 | 563 |
| 564 SloppyBlockFunctionMap* sloppy_block_function_map() { |
| 565 return &sloppy_block_function_map_; |
| 566 } |
| 567 |
547 // Error handling. | 568 // Error handling. |
548 void ReportMessage(int start_position, int end_position, | 569 void ReportMessage(int start_position, int end_position, |
549 MessageTemplate::Template message, | 570 MessageTemplate::Template message, |
550 const AstRawString* arg); | 571 const AstRawString* arg); |
551 | 572 |
552 // --------------------------------------------------------------------------- | 573 // --------------------------------------------------------------------------- |
553 // Debugging. | 574 // Debugging. |
554 | 575 |
555 #ifdef DEBUG | 576 #ifdef DEBUG |
556 void Print(int n = 0); // n = indentation; n < 0 => don't print recursively | 577 void Print(int n = 0); // n = indentation; n < 0 => don't print recursively |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 VariableDeclaration* function_; | 616 VariableDeclaration* function_; |
596 // new.target variable, function scopes only. | 617 // new.target variable, function scopes only. |
597 Variable* new_target_; | 618 Variable* new_target_; |
598 // Convenience variable; function scopes only. | 619 // Convenience variable; function scopes only. |
599 Variable* arguments_; | 620 Variable* arguments_; |
600 // Convenience variable; Subclass constructor only | 621 // Convenience variable; Subclass constructor only |
601 Variable* this_function_; | 622 Variable* this_function_; |
602 // Module descriptor; module scopes only. | 623 // Module descriptor; module scopes only. |
603 ModuleDescriptor* module_descriptor_; | 624 ModuleDescriptor* module_descriptor_; |
604 | 625 |
| 626 // Map of function names to lists of functions defined in sloppy blocks |
| 627 SloppyBlockFunctionMap sloppy_block_function_map_; |
| 628 |
605 // Illegal redeclaration. | 629 // Illegal redeclaration. |
606 Expression* illegal_redecl_; | 630 Expression* illegal_redecl_; |
607 | 631 |
608 // Scope-specific information computed during parsing. | 632 // Scope-specific information computed during parsing. |
609 // | 633 // |
610 // This scope is inside a 'with' of some outer scope. | 634 // This scope is inside a 'with' of some outer scope. |
611 bool scope_inside_with_; | 635 bool scope_inside_with_; |
612 // This scope contains a 'with' statement. | 636 // This scope contains a 'with' statement. |
613 bool scope_contains_with_; | 637 bool scope_contains_with_; |
614 // This scope or a nested catch scope or with scope contain an 'eval' call. At | 638 // This scope or a nested catch scope or with scope contain an 'eval' call. At |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
793 PendingCompilationErrorHandler pending_error_handler_; | 817 PendingCompilationErrorHandler pending_error_handler_; |
794 | 818 |
795 // For tracking which classes are declared consecutively. Needed for strong | 819 // For tracking which classes are declared consecutively. Needed for strong |
796 // mode. | 820 // mode. |
797 int class_declaration_group_start_; | 821 int class_declaration_group_start_; |
798 }; | 822 }; |
799 | 823 |
800 } } // namespace v8::internal | 824 } } // namespace v8::internal |
801 | 825 |
802 #endif // V8_SCOPES_H_ | 826 #endif // V8_SCOPES_H_ |
OLD | NEW |