| 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 1626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1637 | 1637 |
| 1638 Handle<Code> KeyedIC::ComputeMonomorphicStubWithoutMapCheck( | 1638 Handle<Code> KeyedIC::ComputeMonomorphicStubWithoutMapCheck( |
| 1639 Handle<Map> receiver_map, | 1639 Handle<Map> receiver_map, |
| 1640 StrictModeFlag strict_mode, | 1640 StrictModeFlag strict_mode, |
| 1641 KeyedAccessGrowMode grow_mode) { | 1641 KeyedAccessGrowMode grow_mode) { |
| 1642 if ((receiver_map->instance_type() & kNotStringTag) == 0) { | 1642 if ((receiver_map->instance_type() & kNotStringTag) == 0) { |
| 1643 ASSERT(!string_stub().is_null()); | 1643 ASSERT(!string_stub().is_null()); |
| 1644 return string_stub(); | 1644 return string_stub(); |
| 1645 } else { | 1645 } else { |
| 1646 ASSERT(receiver_map->has_dictionary_elements() || | 1646 ASSERT(receiver_map->has_dictionary_elements() || |
| 1647 receiver_map->has_fast_smi_or_object_elements() || | 1647 receiver_map->has_fast_elements() || |
| 1648 receiver_map->has_fast_smi_only_elements() || |
| 1648 receiver_map->has_fast_double_elements() || | 1649 receiver_map->has_fast_double_elements() || |
| 1649 receiver_map->has_external_array_elements()); | 1650 receiver_map->has_external_array_elements()); |
| 1650 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; | 1651 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
| 1651 return GetElementStubWithoutMapCheck(is_js_array, | 1652 return GetElementStubWithoutMapCheck(is_js_array, |
| 1652 receiver_map->elements_kind(), | 1653 receiver_map->elements_kind(), |
| 1653 grow_mode); | 1654 grow_mode); |
| 1654 } | 1655 } |
| 1655 } | 1656 } |
| 1656 | 1657 |
| 1657 | 1658 |
| 1658 Handle<Code> KeyedIC::ComputeMonomorphicStub(Handle<JSObject> receiver, | 1659 Handle<Code> KeyedIC::ComputeMonomorphicStub(Handle<JSObject> receiver, |
| 1659 StubKind stub_kind, | 1660 StubKind stub_kind, |
| 1660 StrictModeFlag strict_mode, | 1661 StrictModeFlag strict_mode, |
| 1661 Handle<Code> generic_stub) { | 1662 Handle<Code> generic_stub) { |
| 1662 if (receiver->HasFastSmiOrObjectElements() || | 1663 if (receiver->HasFastElements() || |
| 1664 receiver->HasFastSmiOnlyElements() || |
| 1663 receiver->HasExternalArrayElements() || | 1665 receiver->HasExternalArrayElements() || |
| 1664 receiver->HasFastDoubleElements() || | 1666 receiver->HasFastDoubleElements() || |
| 1665 receiver->HasDictionaryElements()) { | 1667 receiver->HasDictionaryElements()) { |
| 1666 return isolate()->stub_cache()->ComputeKeyedLoadOrStoreElement( | 1668 return isolate()->stub_cache()->ComputeKeyedLoadOrStoreElement( |
| 1667 receiver, stub_kind, strict_mode); | 1669 receiver, stub_kind, strict_mode); |
| 1668 } else { | 1670 } else { |
| 1669 return generic_stub; | 1671 return generic_stub; |
| 1670 } | 1672 } |
| 1671 } | 1673 } |
| 1672 | 1674 |
| 1673 | 1675 |
| 1674 Handle<Map> KeyedIC::ComputeTransitionedMap(Handle<JSObject> receiver, | 1676 Handle<Map> KeyedIC::ComputeTransitionedMap(Handle<JSObject> receiver, |
| 1675 StubKind stub_kind) { | 1677 StubKind stub_kind) { |
| 1676 switch (stub_kind) { | 1678 switch (stub_kind) { |
| 1677 case KeyedIC::STORE_TRANSITION_SMI_TO_OBJECT: | 1679 case KeyedIC::STORE_TRANSITION_SMI_TO_OBJECT: |
| 1678 case KeyedIC::STORE_TRANSITION_DOUBLE_TO_OBJECT: | 1680 case KeyedIC::STORE_TRANSITION_DOUBLE_TO_OBJECT: |
| 1679 case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT: | 1681 case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT: |
| 1680 case KeyedIC::STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT: | 1682 case KeyedIC::STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT: |
| 1681 return JSObject::GetElementsTransitionMap(receiver, FAST_ELEMENTS); | 1683 return JSObject::GetElementsTransitionMap(receiver, FAST_ELEMENTS); |
| 1684 break; |
| 1682 case KeyedIC::STORE_TRANSITION_SMI_TO_DOUBLE: | 1685 case KeyedIC::STORE_TRANSITION_SMI_TO_DOUBLE: |
| 1683 case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE: | 1686 case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE: |
| 1684 return JSObject::GetElementsTransitionMap(receiver, FAST_DOUBLE_ELEMENTS); | 1687 return JSObject::GetElementsTransitionMap(receiver, FAST_DOUBLE_ELEMENTS); |
| 1685 case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_OBJECT: | 1688 break; |
| 1686 case KeyedIC::STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: | 1689 default: |
| 1687 case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT: | |
| 1688 case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: | |
| 1689 return JSObject::GetElementsTransitionMap(receiver, | |
| 1690 FAST_HOLEY_ELEMENTS); | |
| 1691 case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE: | |
| 1692 case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE: | |
| 1693 return JSObject::GetElementsTransitionMap(receiver, | |
| 1694 FAST_HOLEY_DOUBLE_ELEMENTS); | |
| 1695 case KeyedIC::LOAD: | |
| 1696 case KeyedIC::STORE_NO_TRANSITION: | |
| 1697 case KeyedIC::STORE_AND_GROW_NO_TRANSITION: | |
| 1698 UNREACHABLE(); | 1690 UNREACHABLE(); |
| 1699 break; | 1691 return Handle<Map>::null(); |
| 1700 } | 1692 } |
| 1701 return Handle<Map>::null(); | |
| 1702 } | 1693 } |
| 1703 | 1694 |
| 1704 | 1695 |
| 1705 Handle<Code> KeyedStoreIC::GetElementStubWithoutMapCheck( | 1696 Handle<Code> KeyedStoreIC::GetElementStubWithoutMapCheck( |
| 1706 bool is_js_array, | 1697 bool is_js_array, |
| 1707 ElementsKind elements_kind, | 1698 ElementsKind elements_kind, |
| 1708 KeyedAccessGrowMode grow_mode) { | 1699 KeyedAccessGrowMode grow_mode) { |
| 1709 return KeyedStoreElementStub(is_js_array, elements_kind, grow_mode).GetCode(); | 1700 return KeyedStoreElementStub(is_js_array, elements_kind, grow_mode).GetCode(); |
| 1710 } | 1701 } |
| 1711 | 1702 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1751 Handle<Object> key, | 1742 Handle<Object> key, |
| 1752 Handle<Object> value) { | 1743 Handle<Object> value) { |
| 1753 ASSERT(key->IsSmi()); | 1744 ASSERT(key->IsSmi()); |
| 1754 int index = Smi::cast(*key)->value(); | 1745 int index = Smi::cast(*key)->value(); |
| 1755 bool allow_growth = receiver->IsJSArray() && | 1746 bool allow_growth = receiver->IsJSArray() && |
| 1756 JSArray::cast(*receiver)->length()->IsSmi() && | 1747 JSArray::cast(*receiver)->length()->IsSmi() && |
| 1757 index >= Smi::cast(JSArray::cast(*receiver)->length())->value(); | 1748 index >= Smi::cast(JSArray::cast(*receiver)->length())->value(); |
| 1758 | 1749 |
| 1759 if (allow_growth) { | 1750 if (allow_growth) { |
| 1760 // Handle growing array in stub if necessary. | 1751 // Handle growing array in stub if necessary. |
| 1761 if (receiver->HasFastSmiElements()) { | 1752 if (receiver->HasFastSmiOnlyElements()) { |
| 1762 if (value->IsHeapNumber()) { | 1753 if (value->IsHeapNumber()) { |
| 1763 if (receiver->HasFastHoleyElements()) { | 1754 return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE; |
| 1764 return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE; | |
| 1765 } else { | |
| 1766 return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE; | |
| 1767 } | |
| 1768 } | 1755 } |
| 1769 if (value->IsHeapObject()) { | 1756 if (value->IsHeapObject()) { |
| 1770 if (receiver->HasFastHoleyElements()) { | 1757 return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT; |
| 1771 return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT; | |
| 1772 } else { | |
| 1773 return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT; | |
| 1774 } | |
| 1775 } | 1758 } |
| 1776 } else if (receiver->HasFastDoubleElements()) { | 1759 } else if (receiver->HasFastDoubleElements()) { |
| 1777 if (!value->IsSmi() && !value->IsHeapNumber()) { | 1760 if (!value->IsSmi() && !value->IsHeapNumber()) { |
| 1778 if (receiver->HasFastHoleyElements()) { | 1761 return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT; |
| 1779 return STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; | |
| 1780 } else { | |
| 1781 return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT; | |
| 1782 } | |
| 1783 } | 1762 } |
| 1784 } | 1763 } |
| 1785 return STORE_AND_GROW_NO_TRANSITION; | 1764 return STORE_AND_GROW_NO_TRANSITION; |
| 1786 } else { | 1765 } else { |
| 1787 // Handle only in-bounds elements accesses. | 1766 // Handle only in-bounds elements accesses. |
| 1788 if (receiver->HasFastSmiElements()) { | 1767 if (receiver->HasFastSmiOnlyElements()) { |
| 1789 if (value->IsHeapNumber()) { | 1768 if (value->IsHeapNumber()) { |
| 1790 if (receiver->HasFastHoleyElements()) { | 1769 return STORE_TRANSITION_SMI_TO_DOUBLE; |
| 1791 return STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE; | |
| 1792 } else { | |
| 1793 return STORE_TRANSITION_SMI_TO_DOUBLE; | |
| 1794 } | |
| 1795 } else if (value->IsHeapObject()) { | 1770 } else if (value->IsHeapObject()) { |
| 1796 if (receiver->HasFastHoleyElements()) { | 1771 return STORE_TRANSITION_SMI_TO_OBJECT; |
| 1797 return STORE_TRANSITION_HOLEY_SMI_TO_OBJECT; | |
| 1798 } else { | |
| 1799 return STORE_TRANSITION_SMI_TO_OBJECT; | |
| 1800 } | |
| 1801 } | 1772 } |
| 1802 } else if (receiver->HasFastDoubleElements()) { | 1773 } else if (receiver->HasFastDoubleElements()) { |
| 1803 if (!value->IsSmi() && !value->IsHeapNumber()) { | 1774 if (!value->IsSmi() && !value->IsHeapNumber()) { |
| 1804 if (receiver->HasFastHoleyElements()) { | 1775 return STORE_TRANSITION_DOUBLE_TO_OBJECT; |
| 1805 return STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; | |
| 1806 } else { | |
| 1807 return STORE_TRANSITION_DOUBLE_TO_OBJECT; | |
| 1808 } | |
| 1809 } | 1776 } |
| 1810 } | 1777 } |
| 1811 return STORE_NO_TRANSITION; | 1778 return STORE_NO_TRANSITION; |
| 1812 } | 1779 } |
| 1813 } | 1780 } |
| 1814 | 1781 |
| 1815 | 1782 |
| 1816 MaybeObject* KeyedStoreIC::Store(State state, | 1783 MaybeObject* KeyedStoreIC::Store(State state, |
| 1817 StrictModeFlag strict_mode, | 1784 StrictModeFlag strict_mode, |
| 1818 Handle<Object> object, | 1785 Handle<Object> object, |
| (...skipping 820 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2639 #undef ADDR | 2606 #undef ADDR |
| 2640 }; | 2607 }; |
| 2641 | 2608 |
| 2642 | 2609 |
| 2643 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2610 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 2644 return IC_utilities[id]; | 2611 return IC_utilities[id]; |
| 2645 } | 2612 } |
| 2646 | 2613 |
| 2647 | 2614 |
| 2648 } } // namespace v8::internal | 2615 } } // namespace v8::internal |
| OLD | NEW |