| 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 "src/base/flags.h" | 7 #include "src/base/flags.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/compilation-dependencies.h" | 9 #include "src/compilation-dependencies.h" |
| 10 #include "src/compiler/common-operator.h" | 10 #include "src/compiler/common-operator.h" |
| (...skipping 1329 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1340 return Type::Any(); | 1340 return Type::Any(); |
| 1341 } | 1341 } |
| 1342 | 1342 |
| 1343 | 1343 |
| 1344 Type* Typer::Visitor::TypeJSLoadProperty(Node* node) { | 1344 Type* Typer::Visitor::TypeJSLoadProperty(Node* node) { |
| 1345 return TypeBinaryOp(node, JSLoadPropertyTyper); | 1345 return TypeBinaryOp(node, JSLoadPropertyTyper); |
| 1346 } | 1346 } |
| 1347 | 1347 |
| 1348 | 1348 |
| 1349 Type* Typer::Visitor::TypeJSLoadNamed(Node* node) { | 1349 Type* Typer::Visitor::TypeJSLoadNamed(Node* node) { |
| 1350 Factory* const f = isolate()->factory(); | |
| 1351 Handle<Name> name = NamedAccessOf(node->op()).name(); | |
| 1352 if (name.is_identical_to(f->prototype_string())) { | |
| 1353 Type* receiver = Operand(node, 0); | |
| 1354 if (receiver->Is(Type::None())) return Type::None(); | |
| 1355 if (receiver->IsConstant() && | |
| 1356 receiver->AsConstant()->Value()->IsJSFunction()) { | |
| 1357 Handle<JSFunction> function = | |
| 1358 Handle<JSFunction>::cast(receiver->AsConstant()->Value()); | |
| 1359 if (function->has_prototype()) { | |
| 1360 // We need to add a code dependency on the initial map of the {function} | |
| 1361 // in order to be notified about changes to "prototype" of {function}, | |
| 1362 // so we can only infer a constant type if deoptimization is enabled. | |
| 1363 if (flags() & kDeoptimizationEnabled) { | |
| 1364 JSFunction::EnsureHasInitialMap(function); | |
| 1365 Handle<Map> initial_map(function->initial_map(), isolate()); | |
| 1366 dependencies()->AssumeInitialMapCantChange(initial_map); | |
| 1367 return Type::Constant(handle(initial_map->prototype(), isolate()), | |
| 1368 zone()); | |
| 1369 } | |
| 1370 } | |
| 1371 } else if (receiver->IsClass() && | |
| 1372 receiver->AsClass()->Map()->IsJSFunctionMap()) { | |
| 1373 Handle<Map> map = receiver->AsClass()->Map(); | |
| 1374 return map->has_non_instance_prototype() ? Type::Primitive() | |
| 1375 : Type::Receiver(); | |
| 1376 } | |
| 1377 } | |
| 1378 return Type::Any(); | 1350 return Type::Any(); |
| 1379 } | 1351 } |
| 1380 | 1352 |
| 1381 | 1353 |
| 1382 Type* Typer::Visitor::TypeJSLoadGlobal(Node* node) { return Type::Any(); } | 1354 Type* Typer::Visitor::TypeJSLoadGlobal(Node* node) { return Type::Any(); } |
| 1383 | 1355 |
| 1384 | 1356 |
| 1385 // Returns a somewhat larger range if we previously assigned | 1357 // Returns a somewhat larger range if we previously assigned |
| 1386 // a (smaller) range to this node. This is used to speed up | 1358 // a (smaller) range to this node. This is used to speed up |
| 1387 // the fixpoint calculation in case there appears to be a loop | 1359 // the fixpoint calculation in case there appears to be a loop |
| (...skipping 1205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2593 } | 2565 } |
| 2594 if (Type::IsInteger(*value)) { | 2566 if (Type::IsInteger(*value)) { |
| 2595 return Type::Range(value->Number(), value->Number(), zone()); | 2567 return Type::Range(value->Number(), value->Number(), zone()); |
| 2596 } | 2568 } |
| 2597 return Type::Constant(value, zone()); | 2569 return Type::Constant(value, zone()); |
| 2598 } | 2570 } |
| 2599 | 2571 |
| 2600 } // namespace compiler | 2572 } // namespace compiler |
| 2601 } // namespace internal | 2573 } // namespace internal |
| 2602 } // namespace v8 | 2574 } // namespace v8 |
| OLD | NEW |