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/ast.h" 8 #include "src/ast/scopes.h" 9 10 namespace v8 { 11 namespace internal { 12 13 // ---------------------------------------------------------------------------- 14 // Implementation Variable. 15 16 const char* Variable::Mode2String(VariableMode mode) { 17 switch (mode) { 18 case VAR: return "VAR"; 19 case CONST_LEGACY: return "CONST_LEGACY"; 20 case LET: return "LET"; 21 case CONST: return "CONST"; 22 case DYNAMIC: return "DYNAMIC"; 23 case DYNAMIC_GLOBAL: return "DYNAMIC_GLOBAL"; 24 case DYNAMIC_LOCAL: return "DYNAMIC_LOCAL"; 25 case TEMPORARY: return "TEMPORARY"; 26 } 27 UNREACHABLE(); 28 return NULL; 29 } 30 31 32 Variable::Variable(Scope* scope, const AstRawString* name, VariableMode mode, 33 Kind kind, InitializationFlag initialization_flag, 34 MaybeAssignedFlag maybe_assigned_flag) 35 : scope_(scope), 36 name_(name), 37 mode_(mode), 38 kind_(kind), 39 location_(VariableLocation::UNALLOCATED), 40 index_(-1), 41 initializer_position_(RelocInfo::kNoPosition), 42 local_if_not_shadowed_(NULL), 43 force_context_allocation_(false), 44 is_used_(false), 45 initialization_flag_(initialization_flag), 46 maybe_assigned_(maybe_assigned_flag) { 47 // Var declared variables never need initialization. 48 DCHECK(!(mode == VAR && initialization_flag == kNeedsInitialization)); 49 } 50 51 52 bool Variable::IsGlobalObjectProperty() const { 53 // Temporaries are never global, they must always be allocated in the 54 // activation frame. 55 return (IsDynamicVariableMode(mode_) || 56 (IsDeclaredVariableMode(mode_) && !IsLexicalVariableMode(mode_))) && 57 scope_ != NULL && scope_->is_script_scope() && !is_this(); 58 } 59 60 61 bool Variable::IsStaticGlobalObjectProperty() const { 62 // Temporaries are never global, they must always be allocated in the 63 // activation frame. 64 return (IsDeclaredVariableMode(mode_) && !IsLexicalVariableMode(mode_)) && 65 scope_ != NULL && scope_->is_script_scope() && !is_this(); 66 } 67 68 69 int Variable::CompareIndex(Variable* const* v, Variable* const* w) { 70 int x = (*v)->index(); 71 int y = (*w)->index(); 72 // Consider sorting them according to type as well? 73 return x - y; 74 } 75 76 } // namespace internal 77 } // namespace v8 78