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
3 // found in the LICENSE file.
4 
5 #include "src/ast/variables.h"
6 
7 #include "src/ast/scopes.h"
8 #include "src/globals.h"
9 
10 namespace v8 {
11 namespace internal {
12 
13 // ----------------------------------------------------------------------------
14 // Implementation Variable.
15 
Variable(Scope * scope,const AstRawString * name,VariableMode mode,VariableKind kind,InitializationFlag initialization_flag,MaybeAssignedFlag maybe_assigned_flag)16 Variable::Variable(Scope* scope, const AstRawString* name, VariableMode mode,
17                    VariableKind kind, InitializationFlag initialization_flag,
18                    MaybeAssignedFlag maybe_assigned_flag)
19     : scope_(scope),
20       name_(name),
21       local_if_not_shadowed_(nullptr),
22       next_(nullptr),
23       index_(-1),
24       initializer_position_(kNoSourcePosition),
25       bit_field_(MaybeAssignedFlagField::encode(maybe_assigned_flag) |
26                  InitializationFlagField::encode(initialization_flag) |
27                  VariableModeField::encode(mode) | IsUsedField::encode(false) |
28                  ForceContextAllocationField::encode(false) |
29                  LocationField::encode(VariableLocation::UNALLOCATED) |
30                  VariableKindField::encode(kind)) {
31   // Var declared variables never need initialization.
32   DCHECK(!(mode == VAR && initialization_flag == kNeedsInitialization));
33 }
34 
35 
IsGlobalObjectProperty() const36 bool Variable::IsGlobalObjectProperty() const {
37   // Temporaries are never global, they must always be allocated in the
38   // activation frame.
39   return (IsDynamicVariableMode(mode()) ||
40           (IsDeclaredVariableMode(mode()) && !IsLexicalVariableMode(mode()))) &&
41          scope_ != NULL && scope_->is_script_scope();
42 }
43 
44 }  // namespace internal
45 }  // namespace v8
46