OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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/hydrogen.h" | 5 #include "src/hydrogen.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/v8.h" | 9 #include "src/v8.h" |
10 | 10 |
(...skipping 12630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12641 HValue* receiver = Pop(); | 12641 HValue* receiver = Pop(); |
12642 HValue* table = Add<HLoadNamedField>(receiver, static_cast<HValue*>(NULL), | 12642 HValue* table = Add<HLoadNamedField>(receiver, static_cast<HValue*>(NULL), |
12643 HObjectAccess::ForJSCollectionTable()); | 12643 HObjectAccess::ForJSCollectionTable()); |
12644 HInstruction* result = New<HLoadNamedField>( | 12644 HInstruction* result = New<HLoadNamedField>( |
12645 table, static_cast<HValue*>(NULL), | 12645 table, static_cast<HValue*>(NULL), |
12646 HObjectAccess::ForOrderedHashTableNumberOfElements<OrderedHashMap>()); | 12646 HObjectAccess::ForOrderedHashTableNumberOfElements<OrderedHashMap>()); |
12647 return ast_context()->ReturnInstruction(result, call->id()); | 12647 return ast_context()->ReturnInstruction(result, call->id()); |
12648 } | 12648 } |
12649 | 12649 |
12650 | 12650 |
| 12651 template <typename CollectionType> |
| 12652 HValue* HOptimizedGraphBuilder::BuildAllocateOrderedHashTable() { |
| 12653 static const int kCapacity = CollectionType::kMinCapacity; |
| 12654 static const int kBucketCount = kCapacity / CollectionType::kLoadFactor; |
| 12655 static const int kFixedArrayLength = CollectionType::kHashTableStartIndex + |
| 12656 kBucketCount + |
| 12657 (kCapacity * CollectionType::kEntrySize); |
| 12658 static const int kSizeInBytes = |
| 12659 FixedArray::kHeaderSize + (kFixedArrayLength * kPointerSize); |
| 12660 |
| 12661 // Allocate the table and add the proper map. |
| 12662 HValue* table = |
| 12663 Add<HAllocate>(Add<HConstant>(kSizeInBytes), HType::HeapObject(), |
| 12664 NOT_TENURED, FIXED_ARRAY_TYPE); |
| 12665 AddStoreMapConstant(table, isolate()->factory()->ordered_hash_table_map()); |
| 12666 |
| 12667 // Initialize the FixedArray... |
| 12668 HValue* length = Add<HConstant>(kFixedArrayLength); |
| 12669 Add<HStoreNamedField>(table, HObjectAccess::ForFixedArrayLength(), length); |
| 12670 |
| 12671 // ...and the OrderedHashTable fields. |
| 12672 Add<HStoreNamedField>( |
| 12673 table, |
| 12674 HObjectAccess::ForOrderedHashTableNumberOfBuckets<CollectionType>(), |
| 12675 Add<HConstant>(kBucketCount)); |
| 12676 Add<HStoreNamedField>( |
| 12677 table, |
| 12678 HObjectAccess::ForOrderedHashTableNumberOfElements<CollectionType>(), |
| 12679 graph()->GetConstant0()); |
| 12680 Add<HStoreNamedField>( |
| 12681 table, HObjectAccess::ForOrderedHashTableNumberOfDeletedElements< |
| 12682 CollectionType>(), |
| 12683 graph()->GetConstant0()); |
| 12684 |
| 12685 // Fill the buckets with kNotFound. |
| 12686 HValue* not_found = Add<HConstant>(CollectionType::kNotFound); |
| 12687 for (int i = 0; i < kBucketCount; ++i) { |
| 12688 Add<HStoreNamedField>( |
| 12689 table, HObjectAccess::ForOrderedHashTableBucket<CollectionType>(i), |
| 12690 not_found); |
| 12691 } |
| 12692 |
| 12693 // Fill the data table with undefined. |
| 12694 HValue* undefined = graph()->GetConstantUndefined(); |
| 12695 for (int i = 0; i < (kCapacity * CollectionType::kEntrySize); ++i) { |
| 12696 Add<HStoreNamedField>(table, |
| 12697 HObjectAccess::ForOrderedHashTableDataTableIndex< |
| 12698 CollectionType, kBucketCount>(i), |
| 12699 undefined); |
| 12700 } |
| 12701 |
| 12702 return table; |
| 12703 } |
| 12704 |
| 12705 |
| 12706 void HOptimizedGraphBuilder::GenerateSetInitialize(CallRuntime* call) { |
| 12707 DCHECK(call->arguments()->length() == 1); |
| 12708 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 12709 HValue* receiver = Pop(); |
| 12710 |
| 12711 NoObservableSideEffectsScope no_effects(this); |
| 12712 HValue* table = BuildAllocateOrderedHashTable<OrderedHashSet>(); |
| 12713 Add<HStoreNamedField>(receiver, HObjectAccess::ForJSCollectionTable(), table); |
| 12714 return ast_context()->ReturnValue(receiver); |
| 12715 } |
| 12716 |
| 12717 |
| 12718 void HOptimizedGraphBuilder::GenerateMapInitialize(CallRuntime* call) { |
| 12719 DCHECK(call->arguments()->length() == 1); |
| 12720 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
| 12721 HValue* receiver = Pop(); |
| 12722 |
| 12723 NoObservableSideEffectsScope no_effects(this); |
| 12724 HValue* table = BuildAllocateOrderedHashTable<OrderedHashMap>(); |
| 12725 Add<HStoreNamedField>(receiver, HObjectAccess::ForJSCollectionTable(), table); |
| 12726 return ast_context()->ReturnValue(receiver); |
| 12727 } |
| 12728 |
| 12729 |
12651 void HOptimizedGraphBuilder::GenerateGetCachedArrayIndex(CallRuntime* call) { | 12730 void HOptimizedGraphBuilder::GenerateGetCachedArrayIndex(CallRuntime* call) { |
12652 DCHECK(call->arguments()->length() == 1); | 12731 DCHECK(call->arguments()->length() == 1); |
12653 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); | 12732 CHECK_ALIVE(VisitForValue(call->arguments()->at(0))); |
12654 HValue* value = Pop(); | 12733 HValue* value = Pop(); |
12655 HGetCachedArrayIndex* result = New<HGetCachedArrayIndex>(value); | 12734 HGetCachedArrayIndex* result = New<HGetCachedArrayIndex>(value); |
12656 return ast_context()->ReturnInstruction(result, call->id()); | 12735 return ast_context()->ReturnInstruction(result, call->id()); |
12657 } | 12736 } |
12658 | 12737 |
12659 | 12738 |
12660 void HOptimizedGraphBuilder::GenerateFastOneByteArrayJoin(CallRuntime* call) { | 12739 void HOptimizedGraphBuilder::GenerateFastOneByteArrayJoin(CallRuntime* call) { |
(...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13368 if (ShouldProduceTraceOutput()) { | 13447 if (ShouldProduceTraceOutput()) { |
13369 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 13448 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
13370 } | 13449 } |
13371 | 13450 |
13372 #ifdef DEBUG | 13451 #ifdef DEBUG |
13373 graph_->Verify(false); // No full verify. | 13452 graph_->Verify(false); // No full verify. |
13374 #endif | 13453 #endif |
13375 } | 13454 } |
13376 | 13455 |
13377 } } // namespace v8::internal | 13456 } } // namespace v8::internal |
OLD | NEW |