OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 } | 521 } |
522 | 522 |
523 | 523 |
524 Handle<Code> KeyedStoreFastElementStub::GenerateCode() { | 524 Handle<Code> KeyedStoreFastElementStub::GenerateCode() { |
525 return DoGenerateCode(this); | 525 return DoGenerateCode(this); |
526 } | 526 } |
527 | 527 |
528 | 528 |
529 template <> | 529 template <> |
530 HValue* CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() { | 530 HValue* CodeStubGraphBuilder<TransitionElementsKindStub>::BuildCodeStub() { |
531 TransitionElementsKindStub* stub = casted_stub(); | |
532 ElementsKind from_kind = stub->from_kind(); | |
533 ElementsKind to_kind = stub->to_kind(); | |
534 | |
535 HValue* js_array = GetParameter(0); | |
536 HValue* map = GetParameter(1); | |
537 | |
538 info()->MarkAsSavesCallerDoubles(); | 531 info()->MarkAsSavesCallerDoubles(); |
539 | 532 |
540 if (AllocationSite::GetMode(from_kind, to_kind) == TRACK_ALLOCATION_SITE) { | 533 BuildTransitionElementsKind(GetParameter(0), |
541 Add<HTrapAllocationMemento>(js_array); | 534 GetParameter(1), |
542 } | 535 casted_stub()->from_kind(), |
| 536 casted_stub()->to_kind(), |
| 537 true); |
543 | 538 |
544 HInstruction* elements = AddLoadElements(js_array); | 539 return GetParameter(0); |
545 | |
546 HInstruction* empty_fixed_array = Add<HConstant>( | |
547 isolate()->factory()->empty_fixed_array(), Representation::Tagged()); | |
548 | |
549 IfBuilder if_builder(this); | |
550 | |
551 if_builder.IfNot<HCompareObjectEqAndBranch>(elements, empty_fixed_array); | |
552 | |
553 if_builder.Then(); | |
554 | |
555 HInstruction* elements_length = AddLoadFixedArrayLength(elements); | |
556 | |
557 HInstruction* array_length = AddLoad( | |
558 js_array, HObjectAccess::ForArrayLength(), NULL, Representation::Smi()); | |
559 array_length->set_type(HType::Smi()); | |
560 | |
561 BuildGrowElementsCapacity(js_array, elements, from_kind, to_kind, | |
562 array_length, elements_length); | |
563 | |
564 if_builder.End(); | |
565 | |
566 AddStore(js_array, HObjectAccess::ForMap(), map); | |
567 | |
568 return js_array; | |
569 } | 540 } |
570 | 541 |
571 | 542 |
572 Handle<Code> TransitionElementsKindStub::GenerateCode() { | 543 Handle<Code> TransitionElementsKindStub::GenerateCode() { |
573 return DoGenerateCode(this); | 544 return DoGenerateCode(this); |
574 } | 545 } |
575 | 546 |
576 HValue* CodeStubGraphBuilderBase::BuildArrayConstructor( | 547 HValue* CodeStubGraphBuilderBase::BuildArrayConstructor( |
577 ElementsKind kind, | 548 ElementsKind kind, |
578 ContextCheckMode context_mode, | 549 ContextCheckMode context_mode, |
(...skipping 324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 } | 874 } |
904 return value; | 875 return value; |
905 } | 876 } |
906 | 877 |
907 | 878 |
908 Handle<Code> StoreGlobalStub::GenerateCode() { | 879 Handle<Code> StoreGlobalStub::GenerateCode() { |
909 return DoGenerateCode(this); | 880 return DoGenerateCode(this); |
910 } | 881 } |
911 | 882 |
912 | 883 |
| 884 template<> |
| 885 HValue* CodeStubGraphBuilder<ElementsTransitionAndStoreStub>::BuildCodeStub() { |
| 886 HValue* value = GetParameter(0); |
| 887 HValue* map = GetParameter(1); |
| 888 HValue* key = GetParameter(2); |
| 889 HValue* object = GetParameter(3); |
| 890 |
| 891 if (FLAG_trace_elements_transitions) { |
| 892 // Tracing elements transitions is the job of the runtime. |
| 893 current_block()->FinishExitWithDeoptimization(HDeoptimize::kUseAll); |
| 894 set_current_block(NULL); |
| 895 } else { |
| 896 info()->MarkAsSavesCallerDoubles(); |
| 897 |
| 898 BuildTransitionElementsKind(object, map, |
| 899 casted_stub()->from_kind(), |
| 900 casted_stub()->to_kind(), |
| 901 casted_stub()->is_jsarray()); |
| 902 |
| 903 BuildUncheckedMonomorphicElementAccess(object, key, value, NULL, |
| 904 casted_stub()->is_jsarray(), |
| 905 casted_stub()->to_kind(), |
| 906 true, ALLOW_RETURN_HOLE, |
| 907 casted_stub()->store_mode()); |
| 908 } |
| 909 |
| 910 return value; |
| 911 } |
| 912 |
| 913 |
| 914 Handle<Code> ElementsTransitionAndStoreStub::GenerateCode() { |
| 915 return DoGenerateCode(this); |
| 916 } |
| 917 |
| 918 |
913 } } // namespace v8::internal | 919 } } // namespace v8::internal |
OLD | NEW |