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