OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
8 #include "src/crankshaft/hydrogen.h" | 8 #include "src/crankshaft/hydrogen.h" |
9 #include "src/crankshaft/lithium.h" | 9 #include "src/crankshaft/lithium.h" |
10 #include "src/field-index.h" | 10 #include "src/field-index.h" |
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
787 HValue* argument_elements, | 787 HValue* argument_elements, |
788 ElementsKind kind) { | 788 ElementsKind kind) { |
789 // Precheck whether all elements fit into the array. | 789 // Precheck whether all elements fit into the array. |
790 if (!IsFastObjectElementsKind(kind)) { | 790 if (!IsFastObjectElementsKind(kind)) { |
791 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); | 791 LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); |
792 HValue* start = graph()->GetConstant0(); | 792 HValue* start = graph()->GetConstant0(); |
793 HValue* key = builder.BeginBody(start, argc, Token::LT); | 793 HValue* key = builder.BeginBody(start, argc, Token::LT); |
794 { | 794 { |
795 HInstruction* argument = | 795 HInstruction* argument = |
796 Add<HAccessArgumentsAt>(argument_elements, argc, key); | 796 Add<HAccessArgumentsAt>(argument_elements, argc, key); |
797 Representation r = IsFastSmiElementsKind(kind) ? Representation::Smi() | 797 IfBuilder can_store(this); |
798 : Representation::Double(); | 798 can_store.IfNot<HIsSmiAndBranch>(argument); |
799 AddUncasted<HForceRepresentation>(argument, r); | 799 if (IsFastDoubleElementsKind(kind)) { |
| 800 can_store.And(); |
| 801 can_store.IfNot<HCompareMap>(argument, |
| 802 isolate()->factory()->heap_number_map()); |
| 803 } |
| 804 can_store.ThenDeopt(Deoptimizer::kFastArrayPushFailed); |
| 805 can_store.End(); |
800 } | 806 } |
801 builder.EndBody(); | 807 builder.EndBody(); |
802 } | 808 } |
803 | 809 |
804 HValue* length = Add<HLoadNamedField>(object, nullptr, | 810 HValue* length = Add<HLoadNamedField>(object, nullptr, |
805 HObjectAccess::ForArrayLength(kind)); | 811 HObjectAccess::ForArrayLength(kind)); |
806 HValue* new_length = AddUncasted<HAdd>(length, argc); | 812 HValue* new_length = AddUncasted<HAdd>(length, argc); |
807 HValue* max_key = AddUncasted<HSub>(new_length, graph()->GetConstant1()); | 813 HValue* max_key = AddUncasted<HSub>(new_length, graph()->GetConstant1()); |
808 | 814 |
809 HValue* elements = Add<HLoadNamedField>(object, nullptr, | 815 HValue* elements = Add<HLoadNamedField>(object, nullptr, |
(...skipping 1758 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2568 return Pop(); | 2574 return Pop(); |
2569 } | 2575 } |
2570 | 2576 |
2571 | 2577 |
2572 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2578 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
2573 return DoGenerateCode(this); | 2579 return DoGenerateCode(this); |
2574 } | 2580 } |
2575 | 2581 |
2576 } // namespace internal | 2582 } // namespace internal |
2577 } // namespace v8 | 2583 } // namespace v8 |
OLD | NEW |