OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 #include "src/compiler/graph-inl.h" | 6 #include "src/compiler/graph-inl.h" |
7 #include "src/compiler/graph-reducer.h" | 7 #include "src/compiler/graph-reducer.h" |
8 #include "src/compiler/js-operator.h" | 8 #include "src/compiler/js-operator.h" |
9 #include "src/compiler/node.h" | 9 #include "src/compiler/node.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 27 matching lines...) Expand all Loading... |
38 TYPED_ARRAYS(TYPED_ARRAY_CASE) | 38 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
39 #undef TYPED_ARRAY_CASE | 39 #undef TYPED_ARRAY_CASE |
40 kNumLazyCachedTypes | 40 kNumLazyCachedTypes |
41 }; | 41 }; |
42 | 42 |
43 | 43 |
44 // Constructs and caches types lazily. | 44 // Constructs and caches types lazily. |
45 // TODO(turbofan): these types could be globally cached or cached per isolate. | 45 // TODO(turbofan): these types could be globally cached or cached per isolate. |
46 class LazyTypeCache FINAL : public ZoneObject { | 46 class LazyTypeCache FINAL : public ZoneObject { |
47 public: | 47 public: |
48 explicit LazyTypeCache(Zone* zone) : zone_(zone) { | 48 explicit LazyTypeCache(Isolate* isolate, Zone* zone) |
| 49 : isolate_(isolate), zone_(zone) { |
49 memset(cache_, 0, sizeof(cache_)); | 50 memset(cache_, 0, sizeof(cache_)); |
50 } | 51 } |
51 | 52 |
52 inline Type* Get(LazyCachedType type) { | 53 inline Type* Get(LazyCachedType type) { |
53 int index = static_cast<int>(type); | 54 int index = static_cast<int>(type); |
54 DCHECK(index < kNumLazyCachedTypes); | 55 DCHECK(index < kNumLazyCachedTypes); |
55 if (cache_[index] == NULL) cache_[index] = Create(type); | 56 if (cache_[index] == NULL) cache_[index] = Create(type); |
56 return cache_[index]; | 57 return cache_[index]; |
57 } | 58 } |
58 | 59 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 return CreateRange(std::numeric_limits<T>::min(), | 127 return CreateRange(std::numeric_limits<T>::min(), |
127 std::numeric_limits<T>::max()); | 128 std::numeric_limits<T>::max()); |
128 } | 129 } |
129 | 130 |
130 Type* CreateRange(double min, double max) const { | 131 Type* CreateRange(double min, double max) const { |
131 return Type::Range(factory()->NewNumber(min), factory()->NewNumber(max), | 132 return Type::Range(factory()->NewNumber(min), factory()->NewNumber(max), |
132 zone()); | 133 zone()); |
133 } | 134 } |
134 | 135 |
135 Factory* factory() const { return isolate()->factory(); } | 136 Factory* factory() const { return isolate()->factory(); } |
136 Isolate* isolate() const { return zone()->isolate(); } | 137 Isolate* isolate() const { return isolate_; } |
137 Zone* zone() const { return zone_; } | 138 Zone* zone() const { return zone_; } |
138 | 139 |
139 Type* cache_[kNumLazyCachedTypes]; | 140 Type* cache_[kNumLazyCachedTypes]; |
| 141 Isolate* isolate_; |
140 Zone* zone_; | 142 Zone* zone_; |
141 }; | 143 }; |
142 | 144 |
143 | 145 |
144 class Typer::Decorator FINAL : public GraphDecorator { | 146 class Typer::Decorator FINAL : public GraphDecorator { |
145 public: | 147 public: |
146 explicit Decorator(Typer* typer) : typer_(typer) {} | 148 explicit Decorator(Typer* typer) : typer_(typer) {} |
147 void Decorate(Node* node) FINAL; | 149 void Decorate(Node* node) FINAL; |
148 | 150 |
149 private: | 151 private: |
150 Typer* typer_; | 152 Typer* typer_; |
151 }; | 153 }; |
152 | 154 |
153 | 155 |
154 Typer::Typer(Graph* graph, MaybeHandle<Context> context) | 156 Typer::Typer(Isolate* isolate, Graph* graph, MaybeHandle<Context> context) |
155 : graph_(graph), | 157 : isolate_(isolate), |
| 158 graph_(graph), |
156 context_(context), | 159 context_(context), |
157 decorator_(NULL), | 160 decorator_(NULL), |
158 cache_(new (graph->zone()) LazyTypeCache(graph->zone())), | 161 cache_(new (graph->zone()) LazyTypeCache(isolate, graph->zone())), |
159 weaken_min_limits_(graph->zone()), | 162 weaken_min_limits_(graph->zone()), |
160 weaken_max_limits_(graph->zone()) { | 163 weaken_max_limits_(graph->zone()) { |
161 Zone* zone = this->zone(); | 164 Zone* zone = this->zone(); |
162 Factory* f = zone->isolate()->factory(); | 165 Factory* f = isolate->factory(); |
163 | 166 |
164 Handle<Object> zero = f->NewNumber(0); | 167 Handle<Object> zero = f->NewNumber(0); |
165 Handle<Object> one = f->NewNumber(1); | 168 Handle<Object> one = f->NewNumber(1); |
166 Handle<Object> infinity = f->NewNumber(+V8_INFINITY); | 169 Handle<Object> infinity = f->NewNumber(+V8_INFINITY); |
167 Handle<Object> minusinfinity = f->NewNumber(-V8_INFINITY); | 170 Handle<Object> minusinfinity = f->NewNumber(-V8_INFINITY); |
168 | 171 |
169 Type* number = Type::Number(); | 172 Type* number = Type::Number(); |
170 Type* signed32 = Type::Signed32(); | 173 Type* signed32 = Type::Signed32(); |
171 Type* unsigned32 = Type::Unsigned32(); | 174 Type* unsigned32 = Type::Unsigned32(); |
172 Type* nan_or_minuszero = Type::Union(Type::NaN(), Type::MinusZero(), zone); | 175 Type* nan_or_minuszero = Type::Union(Type::NaN(), Type::MinusZero(), zone); |
(...skipping 1941 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2114 TYPED_ARRAYS(TYPED_ARRAY_CASE) | 2117 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
2115 #undef TYPED_ARRAY_CASE | 2118 #undef TYPED_ARRAY_CASE |
2116 } | 2119 } |
2117 } | 2120 } |
2118 return Type::Constant(value, zone()); | 2121 return Type::Constant(value, zone()); |
2119 } | 2122 } |
2120 | 2123 |
2121 } // namespace compiler | 2124 } // namespace compiler |
2122 } // namespace internal | 2125 } // namespace internal |
2123 } // namespace v8 | 2126 } // namespace v8 |
OLD | NEW |