| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 1690 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1701 AllocationSiteMode mode, | 1701 AllocationSiteMode mode, |
| 1702 ElementsKind kind, | 1702 ElementsKind kind, |
| 1703 int length) { | 1703 int length) { |
| 1704 NoObservableSideEffectsScope no_effects(this); | 1704 NoObservableSideEffectsScope no_effects(this); |
| 1705 | 1705 |
| 1706 // All sizes here are multiples of kPointerSize. | 1706 // All sizes here are multiples of kPointerSize. |
| 1707 int size = JSArray::kSize; | 1707 int size = JSArray::kSize; |
| 1708 if (mode == TRACK_ALLOCATION_SITE) { | 1708 if (mode == TRACK_ALLOCATION_SITE) { |
| 1709 size += AllocationMemento::kSize; | 1709 size += AllocationMemento::kSize; |
| 1710 } | 1710 } |
| 1711 int elems_offset = size; | |
| 1712 InstanceType instance_type = IsFastDoubleElementsKind(kind) ? | |
| 1713 FIXED_DOUBLE_ARRAY_TYPE : FIXED_ARRAY_TYPE; | |
| 1714 if (length > 0) { | |
| 1715 size += IsFastDoubleElementsKind(kind) | |
| 1716 ? FixedDoubleArray::SizeFor(length) | |
| 1717 : FixedArray::SizeFor(length); | |
| 1718 } | |
| 1719 | 1711 |
| 1720 // Allocate both the JS array and the elements array in one big | |
| 1721 // allocation. This avoids multiple limit checks. | |
| 1722 HValue* size_in_bytes = Add<HConstant>(size); | 1712 HValue* size_in_bytes = Add<HConstant>(size); |
| 1723 HInstruction* object = Add<HAllocate>(size_in_bytes, | 1713 HInstruction* object = Add<HAllocate>(size_in_bytes, |
| 1724 HType::JSObject(), | 1714 HType::JSObject(), |
| 1725 NOT_TENURED, | 1715 NOT_TENURED, |
| 1726 instance_type); | 1716 JS_OBJECT_TYPE); |
| 1727 | 1717 |
| 1728 // Copy the JS array part. | 1718 // Copy the JS array part. |
| 1729 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { | 1719 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { |
| 1730 if ((i != JSArray::kElementsOffset) || (length == 0)) { | 1720 if ((i != JSArray::kElementsOffset) || (length == 0)) { |
| 1731 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); | 1721 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); |
| 1732 Add<HStoreNamedField>(object, access, | 1722 Add<HStoreNamedField>(object, access, |
| 1733 Add<HLoadNamedField>(boilerplate, access)); | 1723 Add<HLoadNamedField>(boilerplate, access)); |
| 1734 } | 1724 } |
| 1735 } | 1725 } |
| 1736 | 1726 |
| 1737 // Create an allocation site info if requested. | 1727 // Create an allocation site info if requested. |
| 1738 if (mode == TRACK_ALLOCATION_SITE) { | 1728 if (mode == TRACK_ALLOCATION_SITE) { |
| 1739 BuildCreateAllocationMemento(object, JSArray::kSize, allocation_site); | 1729 BuildCreateAllocationMemento(object, JSArray::kSize, allocation_site); |
| 1740 } | 1730 } |
| 1741 | 1731 |
| 1742 if (length > 0) { | 1732 if (length > 0) { |
| 1743 // Get hold of the elements array of the boilerplate and setup the | |
| 1744 // elements pointer in the resulting object. | |
| 1745 HValue* boilerplate_elements = AddLoadElements(boilerplate); | 1733 HValue* boilerplate_elements = AddLoadElements(boilerplate); |
| 1746 HValue* object_elements = Add<HInnerAllocatedObject>(object, elems_offset); | 1734 HValue* object_elements; |
| 1735 if (IsFastDoubleElementsKind(kind)) { |
| 1736 HValue* elems_size = Add<HConstant>(FixedDoubleArray::SizeFor(length)); |
| 1737 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), |
| 1738 NOT_TENURED, FIXED_DOUBLE_ARRAY_TYPE); |
| 1739 } else { |
| 1740 HValue* elems_size = Add<HConstant>(FixedArray::SizeFor(length)); |
| 1741 object_elements = Add<HAllocate>(elems_size, HType::JSArray(), |
| 1742 NOT_TENURED, FIXED_ARRAY_TYPE); |
| 1743 } |
| 1747 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), | 1744 Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| 1748 object_elements); | 1745 object_elements); |
| 1749 | 1746 |
| 1750 // Copy the elements array header. | 1747 // Copy the elements array header. |
| 1751 for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) { | 1748 for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) { |
| 1752 HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i); | 1749 HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i); |
| 1753 Add<HStoreNamedField>(object_elements, access, | 1750 Add<HStoreNamedField>(object_elements, access, |
| 1754 Add<HLoadNamedField>(boilerplate_elements, access)); | 1751 Add<HLoadNamedField>(boilerplate_elements, access)); |
| 1755 } | 1752 } |
| 1756 | 1753 |
| (...skipping 8131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9888 if (ShouldProduceTraceOutput()) { | 9885 if (ShouldProduceTraceOutput()) { |
| 9889 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); | 9886 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); |
| 9890 } | 9887 } |
| 9891 | 9888 |
| 9892 #ifdef DEBUG | 9889 #ifdef DEBUG |
| 9893 graph_->Verify(false); // No full verify. | 9890 graph_->Verify(false); // No full verify. |
| 9894 #endif | 9891 #endif |
| 9895 } | 9892 } |
| 9896 | 9893 |
| 9897 } } // namespace v8::internal | 9894 } } // namespace v8::internal |
| OLD | NEW |