blob: f46a54d6ef5daa1e0cd5b65301eb58f817bbb608 [file] [log] [blame]
Steve Blocka7e24c12009-10-30 11:49:00 +00001// Copyright 2006-2008 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
34namespace v8 {
35namespace internal {
36
37// ----------------------------------------------------------------------------
Leon Clarkee46be812010-01-19 14:06:41 +000038// Implementation StaticType.
Steve Blocka7e24c12009-10-30 11:49:00 +000039
40
Leon Clarkee46be812010-01-19 14:06:41 +000041const char* StaticType::Type2String(StaticType* type) {
Steve Blocka7e24c12009-10-30 11:49:00 +000042 switch (type->kind_) {
43 case UNKNOWN:
44 return "UNKNOWN";
45 case LIKELY_SMI:
46 return "LIKELY_SMI";
47 default:
48 UNREACHABLE();
49 }
50 return "UNREACHABLE";
51}
52
53
54// ----------------------------------------------------------------------------
55// Implementation Variable.
56
57
58const char* Variable::Mode2String(Mode mode) {
59 switch (mode) {
60 case VAR: return "VAR";
61 case CONST: return "CONST";
62 case DYNAMIC: return "DYNAMIC";
63 case DYNAMIC_GLOBAL: return "DYNAMIC_GLOBAL";
64 case DYNAMIC_LOCAL: return "DYNAMIC_LOCAL";
65 case INTERNAL: return "INTERNAL";
66 case TEMPORARY: return "TEMPORARY";
67 }
68 UNREACHABLE();
69 return NULL;
70}
71
72
73Property* Variable::AsProperty() {
74 return rewrite_ == NULL ? NULL : rewrite_->AsProperty();
75}
76
77
78Variable* Variable::AsVariable() {
79 return rewrite_ == NULL || rewrite_->AsSlot() != NULL ? this : NULL;
80}
81
82
83Slot* Variable::slot() const {
84 return rewrite_ != NULL ? rewrite_->AsSlot() : NULL;
85}
86
87
Steve Block6ded16b2010-05-10 14:33:55 +010088bool Variable::IsStackAllocated() const {
89 Slot* s = slot();
90 return s != NULL && s->IsStackAllocated();
91}
92
93
Steve Blocka7e24c12009-10-30 11:49:00 +000094Variable::Variable(Scope* scope,
95 Handle<String> name,
96 Mode mode,
97 bool is_valid_LHS,
98 Kind kind)
99 : scope_(scope),
100 name_(name),
101 mode_(mode),
102 is_valid_LHS_(is_valid_LHS),
103 kind_(kind),
104 local_if_not_shadowed_(NULL),
105 is_accessed_from_inner_scope_(false),
Steve Block6ded16b2010-05-10 14:33:55 +0100106 is_used_(false),
Steve Blocka7e24c12009-10-30 11:49:00 +0000107 rewrite_(NULL) {
108 // names must be canonicalized for fast equality checks
109 ASSERT(name->IsSymbol());
110}
111
112
113bool Variable::is_global() const {
114 // Temporaries are never global, they must always be allocated in the
115 // activation frame.
116 return mode_ != TEMPORARY && scope_ != NULL && scope_->is_global_scope();
117}
118
119} } // namespace v8::internal