[V8] Introduce a QML compilation mode
[profile/ivi/qtjsbackend.git] / src / 3rdparty / v8 / src / variables.cc
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
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
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     is_qml_global_(false) {
78   // Names must be canonicalized for fast equality checks.
79   ASSERT(name->IsSymbol());
80   // Var declared variables never need initialization.
81   ASSERT(!(mode == VAR && initialization_flag == kNeedsInitialization));
82 }
83
84
85 bool Variable::is_global() const {
86   // Temporaries are never global, they must always be allocated in the
87   // activation frame.
88   return mode_ != TEMPORARY && scope_ != NULL && scope_->is_global_scope();
89 }
90
91
92 int Variable::CompareIndex(Variable* const* v, Variable* const* w) {
93   int x = (*v)->index();
94   int y = (*w)->index();
95   // Consider sorting them according to type as well?
96   return x - y;
97 }
98
99 } }  // namespace v8::internal