| 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/code-factory.h" | 5 #include "src/code-factory.h" |
| 6 #include "src/compilation-dependencies.h" | 6 #include "src/compilation-dependencies.h" |
| 7 #include "src/compiler/access-builder.h" | 7 #include "src/compiler/access-builder.h" |
| 8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" |
| 9 #include "src/compiler/js-typed-lowering.h" | 9 #include "src/compiler/js-typed-lowering.h" |
| 10 #include "src/compiler/linkage.h" | 10 #include "src/compiler/linkage.h" |
| (...skipping 957 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 968 Handle<Name> name = NamedAccessOf(node->op()).name(); | 968 Handle<Name> name = NamedAccessOf(node->op()).name(); |
| 969 // Optimize "length" property of strings. | 969 // Optimize "length" property of strings. |
| 970 if (name.is_identical_to(factory()->length_string()) && | 970 if (name.is_identical_to(factory()->length_string()) && |
| 971 receiver_type->Is(Type::String())) { | 971 receiver_type->Is(Type::String())) { |
| 972 Node* value = effect = graph()->NewNode( | 972 Node* value = effect = graph()->NewNode( |
| 973 simplified()->LoadField(AccessBuilder::ForStringLength()), receiver, | 973 simplified()->LoadField(AccessBuilder::ForStringLength()), receiver, |
| 974 effect, control); | 974 effect, control); |
| 975 ReplaceWithValue(node, value, effect); | 975 ReplaceWithValue(node, value, effect); |
| 976 return Replace(value); | 976 return Replace(value); |
| 977 } | 977 } |
| 978 // Optimize "prototype" property of functions. |
| 979 if (name.is_identical_to(factory()->prototype_string()) && |
| 980 receiver_type->IsConstant() && |
| 981 receiver_type->AsConstant()->Value()->IsJSFunction()) { |
| 982 // TODO(turbofan): This lowering might not kick in if we ever lower |
| 983 // the C++ accessor for "prototype" in an earlier optimization pass. |
| 984 Handle<JSFunction> function = |
| 985 Handle<JSFunction>::cast(receiver_type->AsConstant()->Value()); |
| 986 if (function->has_initial_map()) { |
| 987 // We need to add a code dependency on the initial map of the {function} |
| 988 // in order to be notified about changes to the "prototype" of {function}, |
| 989 // so it doesn't make sense to continue unless deoptimization is enabled. |
| 990 if (!(flags() & kDeoptimizationEnabled)) return NoChange(); |
| 991 Handle<Map> initial_map(function->initial_map(), isolate()); |
| 992 dependencies()->AssumeInitialMapCantChange(initial_map); |
| 993 Node* value = |
| 994 jsgraph()->Constant(handle(initial_map->prototype(), isolate())); |
| 995 ReplaceWithValue(node, value); |
| 996 return Replace(value); |
| 997 } |
| 998 } |
| 978 return NoChange(); | 999 return NoChange(); |
| 979 } | 1000 } |
| 980 | 1001 |
| 981 | 1002 |
| 982 Reduction JSTypedLowering::ReduceJSLoadProperty(Node* node) { | 1003 Reduction JSTypedLowering::ReduceJSLoadProperty(Node* node) { |
| 983 Node* key = NodeProperties::GetValueInput(node, 1); | 1004 Node* key = NodeProperties::GetValueInput(node, 1); |
| 984 Node* base = NodeProperties::GetValueInput(node, 0); | 1005 Node* base = NodeProperties::GetValueInput(node, 0); |
| 985 Type* key_type = NodeProperties::GetType(key); | 1006 Type* key_type = NodeProperties::GetType(key); |
| 986 HeapObjectMatcher mbase(base); | 1007 HeapObjectMatcher mbase(base); |
| 987 if (mbase.HasValue() && mbase.Value()->IsJSTypedArray()) { | 1008 if (mbase.HasValue() && mbase.Value()->IsJSTypedArray()) { |
| (...skipping 1580 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2568 } | 2589 } |
| 2569 | 2590 |
| 2570 | 2591 |
| 2571 CompilationDependencies* JSTypedLowering::dependencies() const { | 2592 CompilationDependencies* JSTypedLowering::dependencies() const { |
| 2572 return dependencies_; | 2593 return dependencies_; |
| 2573 } | 2594 } |
| 2574 | 2595 |
| 2575 } // namespace compiler | 2596 } // namespace compiler |
| 2576 } // namespace internal | 2597 } // namespace internal |
| 2577 } // namespace v8 | 2598 } // namespace v8 |
| OLD | NEW |