variables.cc revision f91f0611dbaf29ca0f1d4aecb357ce243a19d2fa
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
10namespace v8 {
11namespace internal {
12
13// ----------------------------------------------------------------------------
14// Implementation Variable.
15
16const 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
31Variable::Variable(Scope* scope, const AstRawString* name, VariableMode mode,
32                   Kind kind, InitializationFlag initialization_flag,
33                   MaybeAssignedFlag maybe_assigned_flag)
34    : scope_(scope),
35      name_(name),
36      mode_(mode),
37      kind_(kind),
38      location_(VariableLocation::UNALLOCATED),
39      index_(-1),
40      initializer_position_(kNoSourcePosition),
41      local_if_not_shadowed_(NULL),
42      force_context_allocation_(false),
43      is_used_(false),
44      initialization_flag_(initialization_flag),
45      maybe_assigned_(maybe_assigned_flag) {
46  // Var declared variables never need initialization.
47  DCHECK(!(mode == VAR && initialization_flag == kNeedsInitialization));
48}
49
50
51bool Variable::IsGlobalObjectProperty() const {
52  // Temporaries are never global, they must always be allocated in the
53  // activation frame.
54  return (IsDynamicVariableMode(mode_) ||
55          (IsDeclaredVariableMode(mode_) && !IsLexicalVariableMode(mode_))) &&
56         scope_ != NULL && scope_->is_script_scope();
57}
58
59
60bool Variable::IsStaticGlobalObjectProperty() const {
61  // Temporaries are never global, they must always be allocated in the
62  // activation frame.
63  return (IsDeclaredVariableMode(mode_) && !IsLexicalVariableMode(mode_)) &&
64         scope_ != NULL && scope_->is_script_scope();
65}
66
67
68int Variable::CompareIndex(Variable* const* v, Variable* const* w) {
69  int x = (*v)->index();
70  int y = (*w)->index();
71  // Consider sorting them according to type as well?
72  return x - y;
73}
74
75}  // namespace internal
76}  // namespace v8
77