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 1648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1659 JSArrayBuilder(HGraphBuilder* builder, | 1659 JSArrayBuilder(HGraphBuilder* builder, |
1660 ElementsKind kind, | 1660 ElementsKind kind, |
1661 HValue* constructor_function = NULL); | 1661 HValue* constructor_function = NULL); |
1662 | 1662 |
1663 enum FillMode { | 1663 enum FillMode { |
1664 DONT_FILL_WITH_HOLE, | 1664 DONT_FILL_WITH_HOLE, |
1665 FILL_WITH_HOLE | 1665 FILL_WITH_HOLE |
1666 }; | 1666 }; |
1667 | 1667 |
1668 ElementsKind kind() { return kind_; } | 1668 ElementsKind kind() { return kind_; } |
| 1669 HAllocate* elements_location() { return elements_location_; } |
1669 | 1670 |
1670 HValue* AllocateEmptyArray(); | 1671 HAllocate* AllocateEmptyArray(); |
1671 HValue* AllocateArray(HValue* capacity, HValue* length_field, | 1672 HAllocate* AllocateArray(HValue* capacity, |
1672 FillMode fill_mode = FILL_WITH_HOLE); | 1673 HValue* length_field, |
| 1674 FillMode fill_mode = FILL_WITH_HOLE); |
| 1675 // Use these allocators when capacity could be unknown at compile time |
| 1676 // but its limit is known. For constant |capacity| the value of |
| 1677 // |capacity_upper_bound| is ignored and the actual |capacity| |
| 1678 // value is used as an upper bound. |
| 1679 HAllocate* AllocateArray(HValue* capacity, |
| 1680 int capacity_upper_bound, |
| 1681 HValue* length_field, |
| 1682 FillMode fill_mode = FILL_WITH_HOLE); |
| 1683 HAllocate* AllocateArray(HValue* capacity, |
| 1684 HConstant* capacity_upper_bound, |
| 1685 HValue* length_field, |
| 1686 FillMode fill_mode = FILL_WITH_HOLE); |
1673 HValue* GetElementsLocation() { return elements_location_; } | 1687 HValue* GetElementsLocation() { return elements_location_; } |
1674 HValue* EmitMapCode(); | 1688 HValue* EmitMapCode(); |
1675 | 1689 |
1676 private: | 1690 private: |
1677 Zone* zone() const { return builder_->zone(); } | 1691 Zone* zone() const { return builder_->zone(); } |
1678 int elements_size() const { | 1692 int elements_size() const { |
1679 return IsFastDoubleElementsKind(kind_) ? kDoubleSize : kPointerSize; | 1693 return IsFastDoubleElementsKind(kind_) ? kDoubleSize : kPointerSize; |
1680 } | 1694 } |
1681 HGraphBuilder* builder() { return builder_; } | 1695 HGraphBuilder* builder() { return builder_; } |
1682 HGraph* graph() { return builder_->graph(); } | 1696 HGraph* graph() { return builder_->graph(); } |
1683 int initial_capacity() { | 1697 int initial_capacity() { |
1684 STATIC_ASSERT(JSArray::kPreallocatedArrayElements > 0); | 1698 STATIC_ASSERT(JSArray::kPreallocatedArrayElements > 0); |
1685 return JSArray::kPreallocatedArrayElements; | 1699 return JSArray::kPreallocatedArrayElements; |
1686 } | 1700 } |
1687 | 1701 |
1688 HValue* EmitInternalMapCode(); | 1702 HValue* EmitInternalMapCode(); |
1689 HValue* EstablishEmptyArrayAllocationSize(); | |
1690 HValue* EstablishAllocationSize(HValue* length_node); | |
1691 HValue* AllocateArray(HValue* size_in_bytes, HValue* capacity, | |
1692 HValue* length_field, | |
1693 FillMode fill_mode = FILL_WITH_HOLE); | |
1694 | 1703 |
1695 HGraphBuilder* builder_; | 1704 HGraphBuilder* builder_; |
1696 ElementsKind kind_; | 1705 ElementsKind kind_; |
1697 AllocationSiteMode mode_; | 1706 AllocationSiteMode mode_; |
1698 HValue* allocation_site_payload_; | 1707 HValue* allocation_site_payload_; |
1699 HValue* constructor_function_; | 1708 HValue* constructor_function_; |
1700 HInnerAllocatedObject* elements_location_; | 1709 HAllocate* elements_location_; |
1701 }; | 1710 }; |
1702 | 1711 |
1703 HValue* BuildAllocateArrayFromLength(JSArrayBuilder* array_builder, | 1712 HValue* BuildAllocateArrayFromLength(JSArrayBuilder* array_builder, |
1704 HValue* length_argument); | 1713 HValue* length_argument); |
| 1714 HValue* BuildCalculateElementsSize(ElementsKind kind, |
| 1715 HValue* capacity); |
| 1716 HConstant* EstablishHeaderAllocationSize(AllocationSiteMode mode); |
| 1717 HConstant* EstablishElementsAllocationSize(ElementsKind kind, int capacity); |
1705 | 1718 |
1706 HValue* BuildAllocateElements(ElementsKind kind, | 1719 HAllocate* BuildAllocateElements(ElementsKind kind, |
1707 HValue* capacity); | 1720 HValue* size_in_bytes, |
| 1721 PretenureFlag pretenure); |
1708 | 1722 |
1709 void BuildInitializeElementsHeader(HValue* elements, | 1723 void BuildInitializeElementsHeader(HValue* elements, |
1710 ElementsKind kind, | 1724 ElementsKind kind, |
1711 HValue* capacity); | 1725 HValue* capacity); |
1712 | 1726 |
1713 HValue* BuildAllocateElementsAndInitializeElementsHeader(ElementsKind kind, | 1727 HValue* BuildAllocateElementsAndInitializeElementsHeader(ElementsKind kind, |
1714 HValue* capacity); | 1728 HValue* capacity); |
1715 | 1729 |
1716 // array must have been allocated with enough room for | 1730 // |array| must have been allocated with enough room for |
1717 // 1) the JSArray, 2) a AllocationMemento if mode requires it, | 1731 // 1) the JSArray and 2) an AllocationMemento if mode requires it. |
1718 // 3) a FixedArray or FixedDoubleArray. | 1732 // Initially the array elements storage is initialized with empty array. |
1719 // A pointer to the Fixed(Double)Array is returned. | 1733 void BuildJSArrayHeader(HValue* array, |
1720 HInnerAllocatedObject* BuildJSArrayHeader(HValue* array, | 1734 HValue* array_map, |
1721 HValue* array_map, | 1735 AllocationSiteMode mode, |
1722 AllocationSiteMode mode, | 1736 ElementsKind elements_kind, |
1723 ElementsKind elements_kind, | 1737 HValue* allocation_site_payload, |
1724 HValue* allocation_site_payload, | 1738 HValue* length_field); |
1725 HValue* length_field); | |
1726 | 1739 |
1727 HValue* BuildGrowElementsCapacity(HValue* object, | 1740 HValue* BuildGrowElementsCapacity(HValue* object, |
1728 HValue* elements, | 1741 HValue* elements, |
1729 ElementsKind kind, | 1742 ElementsKind kind, |
1730 ElementsKind new_kind, | 1743 ElementsKind new_kind, |
1731 HValue* length, | 1744 HValue* length, |
1732 HValue* new_capacity); | 1745 HValue* new_capacity); |
1733 | 1746 |
1734 void BuildFillElementsWithHole(HValue* elements, | 1747 void BuildFillElementsWithHole(HValue* elements, |
1735 ElementsKind elements_kind, | 1748 ElementsKind elements_kind, |
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2696 } | 2709 } |
2697 | 2710 |
2698 private: | 2711 private: |
2699 HGraphBuilder* builder_; | 2712 HGraphBuilder* builder_; |
2700 }; | 2713 }; |
2701 | 2714 |
2702 | 2715 |
2703 } } // namespace v8::internal | 2716 } } // namespace v8::internal |
2704 | 2717 |
2705 #endif // V8_HYDROGEN_H_ | 2718 #endif // V8_HYDROGEN_H_ |
OLD | NEW |