| 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 | 
|---|