Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(601)

Side by Side Diff: src/ast/variables.h

Issue 2324783002: Include only stuff you need, part 9: variables.h (Closed)
Patch Set: rebased Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/ast/scopes.cc ('k') | src/ast/variables.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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_AST_VARIABLES_H_ 5 #ifndef V8_AST_VARIABLES_H_
6 #define V8_AST_VARIABLES_H_ 6 #define V8_AST_VARIABLES_H_
7 7
8 #include "src/ast/ast-value-factory.h" 8 #include "src/ast/ast-value-factory.h"
9 #include "src/globals.h"
9 #include "src/zone.h" 10 #include "src/zone.h"
10 11
11 namespace v8 { 12 namespace v8 {
12 namespace internal { 13 namespace internal {
13 14
14 // The AST refers to variables via VariableProxies - placeholders for the actual 15 // The AST refers to variables via VariableProxies - placeholders for the actual
15 // variables. Variables themselves are never directly referred to from the AST, 16 // variables. Variables themselves are never directly referred to from the AST,
16 // they are maintained by scopes, and referred to from VariableProxies and Slots 17 // they are maintained by scopes, and referred to from VariableProxies and Slots
17 // after binding and variable allocation. 18 // after binding and variable allocation.
18 class Variable final : public ZoneObject { 19 class Variable final : public ZoneObject {
19 public: 20 public:
20 enum Kind : uint8_t { 21 Variable(Scope* scope, const AstRawString* name, VariableMode mode,
21 NORMAL, 22 VariableKind kind, InitializationFlag initialization_flag,
22 FUNCTION,
23 THIS,
24 ARGUMENTS,
25 SLOPPY_FUNCTION_NAME,
26 kLastKind = SLOPPY_FUNCTION_NAME
27 };
28
29 Variable(Scope* scope, const AstRawString* name, VariableMode mode, Kind kind,
30 InitializationFlag initialization_flag,
31 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned); 23 MaybeAssignedFlag maybe_assigned_flag = kNotAssigned);
32 24
33 // Printing support
34 static const char* Mode2String(VariableMode mode);
35
36 // The source code for an eval() call may refer to a variable that is 25 // The source code for an eval() call may refer to a variable that is
37 // in an outer scope about which we don't know anything (it may not 26 // in an outer scope about which we don't know anything (it may not
38 // be the script scope). scope() is NULL in that case. Currently the 27 // be the script scope). scope() is NULL in that case. Currently the
39 // scope is only used to follow the context chain length. 28 // scope is only used to follow the context chain length.
40 Scope* scope() const { return scope_; } 29 Scope* scope() const { return scope_; }
41 30
42 // This is for adjusting the scope of temporaries used when desugaring 31 // This is for adjusting the scope of temporaries used when desugaring
43 // parameter initializers. 32 // parameter initializers.
44 void set_scope(Scope* scope) { scope_ = scope; } 33 void set_scope(Scope* scope) { scope_ = scope; }
45 34
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
77 bool IsGlobalObjectProperty() const; 66 bool IsGlobalObjectProperty() const;
78 bool IsStaticGlobalObjectProperty() const; 67 bool IsStaticGlobalObjectProperty() const;
79 68
80 bool is_dynamic() const { return IsDynamicVariableMode(mode()); } 69 bool is_dynamic() const { return IsDynamicVariableMode(mode()); }
81 bool binding_needs_init() const { 70 bool binding_needs_init() const {
82 DCHECK(initialization_flag() != kNeedsInitialization || 71 DCHECK(initialization_flag() != kNeedsInitialization ||
83 IsLexicalVariableMode(mode())); 72 IsLexicalVariableMode(mode()));
84 return initialization_flag() == kNeedsInitialization; 73 return initialization_flag() == kNeedsInitialization;
85 } 74 }
86 bool throw_on_const_assignment(LanguageMode language_mode) const { 75 bool throw_on_const_assignment(LanguageMode language_mode) const {
87 return kind() != SLOPPY_FUNCTION_NAME || is_strict(language_mode); 76 return kind() != SLOPPY_FUNCTION_NAME_VARIABLE || is_strict(language_mode);
88 } 77 }
89 78
90 bool is_function() const { return kind() == FUNCTION; } 79 bool is_function() const { return kind() == FUNCTION_VARIABLE; }
91 bool is_this() const { return kind() == THIS; } 80 bool is_this() const { return kind() == THIS_VARIABLE; }
92 bool is_arguments() const { return kind() == ARGUMENTS; } 81 bool is_arguments() const { return kind() == ARGUMENTS_VARIABLE; }
93 bool is_sloppy_function_name() const { 82 bool is_sloppy_function_name() const {
94 return kind() == SLOPPY_FUNCTION_NAME; 83 return kind() == SLOPPY_FUNCTION_NAME_VARIABLE;
95 } 84 }
96 85
97 Variable* local_if_not_shadowed() const { 86 Variable* local_if_not_shadowed() const {
98 DCHECK(mode() == DYNAMIC_LOCAL && local_if_not_shadowed_ != NULL); 87 DCHECK(mode() == DYNAMIC_LOCAL && local_if_not_shadowed_ != NULL);
99 return local_if_not_shadowed_; 88 return local_if_not_shadowed_;
100 } 89 }
101 90
102 void set_local_if_not_shadowed(Variable* local) { 91 void set_local_if_not_shadowed(Variable* local) {
103 local_if_not_shadowed_ = local; 92 local_if_not_shadowed_ = local;
104 } 93 }
105 94
106 VariableLocation location() const { 95 VariableLocation location() const {
107 return LocationField::decode(bit_field_); 96 return LocationField::decode(bit_field_);
108 } 97 }
109 Kind kind() const { return KindField::decode(bit_field_); } 98 VariableKind kind() const { return VariableKindField::decode(bit_field_); }
110 InitializationFlag initialization_flag() const { 99 InitializationFlag initialization_flag() const {
111 return InitializationFlagField::decode(bit_field_); 100 return InitializationFlagField::decode(bit_field_);
112 } 101 }
113 102
114 int index() const { return index_; } 103 int index() const { return index_; }
115 104
116 void AllocateTo(VariableLocation location, int index) { 105 void AllocateTo(VariableLocation location, int index) {
117 DCHECK(IsUnallocated() || 106 DCHECK(IsUnallocated() ||
118 (this->location() == location && this->index() == index)); 107 (this->location() == location && this->index() == index));
119 bit_field_ = LocationField::update(bit_field_, location); 108 bit_field_ = LocationField::update(bit_field_, location);
(...skipping 13 matching lines...) Expand all
133 // If this field is set, this variable references the stored locally bound 122 // If this field is set, this variable references the stored locally bound
134 // variable, but it might be shadowed by variable bindings introduced by 123 // variable, but it might be shadowed by variable bindings introduced by
135 // sloppy 'eval' calls between the reference scope (inclusive) and the 124 // sloppy 'eval' calls between the reference scope (inclusive) and the
136 // binding scope (exclusive). 125 // binding scope (exclusive).
137 Variable* local_if_not_shadowed_; 126 Variable* local_if_not_shadowed_;
138 int index_; 127 int index_;
139 int initializer_position_; 128 int initializer_position_;
140 uint16_t bit_field_; 129 uint16_t bit_field_;
141 130
142 class VariableModeField : public BitField16<VariableMode, 0, 3> {}; 131 class VariableModeField : public BitField16<VariableMode, 0, 3> {};
143 class KindField : public BitField16<Kind, VariableModeField::kNext, 3> {}; 132 class VariableKindField
133 : public BitField16<VariableKind, VariableModeField::kNext, 3> {};
144 class LocationField 134 class LocationField
145 : public BitField16<VariableLocation, KindField::kNext, 3> {}; 135 : public BitField16<VariableLocation, VariableKindField::kNext, 3> {};
146 class ForceContextAllocationField 136 class ForceContextAllocationField
147 : public BitField16<bool, LocationField::kNext, 1> {}; 137 : public BitField16<bool, LocationField::kNext, 1> {};
148 class IsUsedField 138 class IsUsedField
149 : public BitField16<bool, ForceContextAllocationField::kNext, 1> {}; 139 : public BitField16<bool, ForceContextAllocationField::kNext, 1> {};
150 class InitializationFlagField 140 class InitializationFlagField
151 : public BitField16<InitializationFlag, IsUsedField::kNext, 2> {}; 141 : public BitField16<InitializationFlag, IsUsedField::kNext, 2> {};
152 class MaybeAssignedFlagField 142 class MaybeAssignedFlagField
153 : public BitField16<MaybeAssignedFlag, InitializationFlagField::kNext, 143 : public BitField16<MaybeAssignedFlag, InitializationFlagField::kNext,
154 2> {}; 144 2> {};
155 }; 145 };
156 } // namespace internal 146 } // namespace internal
157 } // namespace v8 147 } // namespace v8
158 148
159 #endif // V8_AST_VARIABLES_H_ 149 #endif // V8_AST_VARIABLES_H_
OLDNEW
« no previous file with comments | « src/ast/scopes.cc ('k') | src/ast/variables.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698