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