• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2011 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #include "v8.h"
29 
30 #include "ast.h"
31 #include "scopes.h"
32 #include "variables.h"
33 
34 namespace v8 {
35 namespace internal {
36 
37 // ----------------------------------------------------------------------------
38 // Implementation Variable.
39 
Mode2String(VariableMode mode)40 const char* Variable::Mode2String(VariableMode mode) {
41   switch (mode) {
42     case VAR: return "VAR";
43     case CONST: return "CONST";
44     case CONST_HARMONY: return "CONST";
45     case LET: return "LET";
46     case DYNAMIC: return "DYNAMIC";
47     case DYNAMIC_GLOBAL: return "DYNAMIC_GLOBAL";
48     case DYNAMIC_LOCAL: return "DYNAMIC_LOCAL";
49     case INTERNAL: return "INTERNAL";
50     case TEMPORARY: return "TEMPORARY";
51   }
52   UNREACHABLE();
53   return NULL;
54 }
55 
56 
Variable(Scope * scope,Handle<String> name,VariableMode mode,bool is_valid_LHS,Kind kind,InitializationFlag initialization_flag,Interface * interface)57 Variable::Variable(Scope* scope,
58                    Handle<String> name,
59                    VariableMode mode,
60                    bool is_valid_LHS,
61                    Kind kind,
62                    InitializationFlag initialization_flag,
63                    Interface* interface)
64   : scope_(scope),
65     name_(name),
66     mode_(mode),
67     kind_(kind),
68     location_(UNALLOCATED),
69     index_(-1),
70     initializer_position_(RelocInfo::kNoPosition),
71     local_if_not_shadowed_(NULL),
72     is_valid_LHS_(is_valid_LHS),
73     force_context_allocation_(false),
74     is_used_(false),
75     initialization_flag_(initialization_flag),
76     interface_(interface) {
77   // Names must be canonicalized for fast equality checks.
78   ASSERT(name->IsSymbol());
79   // Var declared variables never need initialization.
80   ASSERT(!(mode == VAR && initialization_flag == kNeedsInitialization));
81 }
82 
83 
is_global() const84 bool Variable::is_global() const {
85   // Temporaries are never global, they must always be allocated in the
86   // activation frame.
87   return mode_ != TEMPORARY && scope_ != NULL && scope_->is_global_scope();
88 }
89 
90 
CompareIndex(Variable * const * v,Variable * const * w)91 int Variable::CompareIndex(Variable* const* v, Variable* const* w) {
92   int x = (*v)->index();
93   int y = (*w)->index();
94   // Consider sorting them according to type as well?
95   return x - y;
96 }
97 
98 } }  // namespace v8::internal
99