| 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/compiler/typer.h" | 5 #include "src/compiler/typer.h" |
| 6 | 6 |
| 7 #include <iomanip> | 7 #include <iomanip> |
| 8 | 8 |
| 9 #include "src/base/flags.h" | 9 #include "src/base/flags.h" |
| 10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 Type* TypeOrNone(Node* node) { | 220 Type* TypeOrNone(Node* node) { |
| 221 return NodeProperties::IsTyped(node) ? NodeProperties::GetType(node) | 221 return NodeProperties::IsTyped(node) ? NodeProperties::GetType(node) |
| 222 : Type::None(); | 222 : Type::None(); |
| 223 } | 223 } |
| 224 | 224 |
| 225 Type* Operand(Node* node, int i) { | 225 Type* Operand(Node* node, int i) { |
| 226 Node* operand_node = NodeProperties::GetValueInput(node, i); | 226 Node* operand_node = NodeProperties::GetValueInput(node, i); |
| 227 return TypeOrNone(operand_node); | 227 return TypeOrNone(operand_node); |
| 228 } | 228 } |
| 229 | 229 |
| 230 Type* WrapContextTypeForInput(Node* node); | |
| 231 Type* Weaken(Node* node, Type* current_type, Type* previous_type); | 230 Type* Weaken(Node* node, Type* current_type, Type* previous_type); |
| 232 | 231 |
| 233 Zone* zone() { return typer_->zone(); } | 232 Zone* zone() { return typer_->zone(); } |
| 234 Isolate* isolate() { return typer_->isolate(); } | 233 Isolate* isolate() { return typer_->isolate(); } |
| 235 Graph* graph() { return typer_->graph(); } | 234 Graph* graph() { return typer_->graph(); } |
| 236 | 235 |
| 237 void SetWeakened(NodeId node_id) { weakened_nodes_.insert(node_id); } | 236 void SetWeakened(NodeId node_id) { weakened_nodes_.insert(node_id); } |
| 238 bool IsWeakened(NodeId node_id) { | 237 bool IsWeakened(NodeId node_id) { |
| 239 return weakened_nodes_.find(node_id) != weakened_nodes_.end(); | 238 return weakened_nodes_.find(node_id) != weakened_nodes_.end(); |
| 240 } | 239 } |
| (...skipping 979 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1220 | 1219 |
| 1221 Type* Typer::Visitor::TypeJSHasProperty(Node* node) { return Type::Boolean(); } | 1220 Type* Typer::Visitor::TypeJSHasProperty(Node* node) { return Type::Boolean(); } |
| 1222 | 1221 |
| 1223 Type* Typer::Visitor::TypeJSInstanceOf(Node* node) { return Type::Boolean(); } | 1222 Type* Typer::Visitor::TypeJSInstanceOf(Node* node) { return Type::Boolean(); } |
| 1224 | 1223 |
| 1225 // JS context operators. | 1224 // JS context operators. |
| 1226 | 1225 |
| 1227 | 1226 |
| 1228 Type* Typer::Visitor::TypeJSLoadContext(Node* node) { | 1227 Type* Typer::Visitor::TypeJSLoadContext(Node* node) { |
| 1229 ContextAccess const& access = ContextAccessOf(node->op()); | 1228 ContextAccess const& access = ContextAccessOf(node->op()); |
| 1230 if (access.index() == Context::EXTENSION_INDEX) { | 1229 switch (access.index()) { |
| 1231 return Type::TaggedPointer(); | 1230 case Context::PREVIOUS_INDEX: |
| 1231 case Context::NATIVE_CONTEXT_INDEX: |
| 1232 return Type::OtherInternal(); |
| 1233 case Context::CLOSURE_INDEX: |
| 1234 return Type::Function(); |
| 1235 default: |
| 1236 return Type::Any(); |
| 1232 } | 1237 } |
| 1233 // Since contexts are mutable, we just return the top. | |
| 1234 return Type::Any(); | |
| 1235 } | 1238 } |
| 1236 | 1239 |
| 1237 | 1240 |
| 1238 Type* Typer::Visitor::TypeJSStoreContext(Node* node) { | 1241 Type* Typer::Visitor::TypeJSStoreContext(Node* node) { |
| 1239 UNREACHABLE(); | 1242 UNREACHABLE(); |
| 1240 return nullptr; | 1243 return nullptr; |
| 1241 } | 1244 } |
| 1242 | 1245 |
| 1243 | 1246 |
| 1244 Type* Typer::Visitor::WrapContextTypeForInput(Node* node) { | |
| 1245 Type* outer = TypeOrNone(NodeProperties::GetContextInput(node)); | |
| 1246 if (outer->Is(Type::None())) { | |
| 1247 return Type::None(); | |
| 1248 } else { | |
| 1249 DCHECK(outer->Maybe(Type::OtherInternal())); | |
| 1250 return Type::Context(outer, zone()); | |
| 1251 } | |
| 1252 } | |
| 1253 | |
| 1254 | |
| 1255 Type* Typer::Visitor::TypeJSCreateFunctionContext(Node* node) { | 1247 Type* Typer::Visitor::TypeJSCreateFunctionContext(Node* node) { |
| 1256 return WrapContextTypeForInput(node); | 1248 return Type::OtherInternal(); |
| 1257 } | 1249 } |
| 1258 | 1250 |
| 1259 | |
| 1260 Type* Typer::Visitor::TypeJSCreateCatchContext(Node* node) { | 1251 Type* Typer::Visitor::TypeJSCreateCatchContext(Node* node) { |
| 1261 return WrapContextTypeForInput(node); | 1252 return Type::OtherInternal(); |
| 1262 } | 1253 } |
| 1263 | 1254 |
| 1264 | |
| 1265 Type* Typer::Visitor::TypeJSCreateWithContext(Node* node) { | 1255 Type* Typer::Visitor::TypeJSCreateWithContext(Node* node) { |
| 1266 return WrapContextTypeForInput(node); | 1256 return Type::OtherInternal(); |
| 1267 } | 1257 } |
| 1268 | 1258 |
| 1269 | |
| 1270 Type* Typer::Visitor::TypeJSCreateBlockContext(Node* node) { | 1259 Type* Typer::Visitor::TypeJSCreateBlockContext(Node* node) { |
| 1271 return WrapContextTypeForInput(node); | 1260 return Type::OtherInternal(); |
| 1272 } | 1261 } |
| 1273 | 1262 |
| 1274 | |
| 1275 Type* Typer::Visitor::TypeJSCreateScriptContext(Node* node) { | 1263 Type* Typer::Visitor::TypeJSCreateScriptContext(Node* node) { |
| 1276 return WrapContextTypeForInput(node); | 1264 return Type::OtherInternal(); |
| 1277 } | 1265 } |
| 1278 | 1266 |
| 1279 | |
| 1280 // JS other operators. | 1267 // JS other operators. |
| 1281 | 1268 |
| 1282 | 1269 |
| 1283 Type* Typer::Visitor::TypeJSCallConstruct(Node* node) { | 1270 Type* Typer::Visitor::TypeJSCallConstruct(Node* node) { |
| 1284 return Type::Receiver(); | 1271 return Type::Receiver(); |
| 1285 } | 1272 } |
| 1286 | 1273 |
| 1287 | 1274 |
| 1288 Type* Typer::Visitor::JSCallFunctionTyper(Type* fun, Typer* t) { | 1275 Type* Typer::Visitor::JSCallFunctionTyper(Type* fun, Typer* t) { |
| 1289 if (fun->IsFunction()) { | 1276 if (fun->IsFunction()) { |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1719 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { | 1706 Type* Typer::Visitor::TypeConstant(Handle<Object> value) { |
| 1720 if (Type::IsInteger(*value)) { | 1707 if (Type::IsInteger(*value)) { |
| 1721 return Type::Range(value->Number(), value->Number(), zone()); | 1708 return Type::Range(value->Number(), value->Number(), zone()); |
| 1722 } | 1709 } |
| 1723 return Type::Constant(value, zone()); | 1710 return Type::Constant(value, zone()); |
| 1724 } | 1711 } |
| 1725 | 1712 |
| 1726 } // namespace compiler | 1713 } // namespace compiler |
| 1727 } // namespace internal | 1714 } // namespace internal |
| 1728 } // namespace v8 | 1715 } // namespace v8 |
| OLD | NEW |