| 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 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1627 | 1627 |
| 1628 Handle<Code> KeyedIC::ComputeMonomorphicStubWithoutMapCheck( | 1628 Handle<Code> KeyedIC::ComputeMonomorphicStubWithoutMapCheck( |
| 1629 Handle<Map> receiver_map, | 1629 Handle<Map> receiver_map, |
| 1630 StrictModeFlag strict_mode, | 1630 StrictModeFlag strict_mode, |
| 1631 KeyedAccessGrowMode grow_mode) { | 1631 KeyedAccessGrowMode grow_mode) { |
| 1632 if ((receiver_map->instance_type() & kNotStringTag) == 0) { | 1632 if ((receiver_map->instance_type() & kNotStringTag) == 0) { |
| 1633 ASSERT(!string_stub().is_null()); | 1633 ASSERT(!string_stub().is_null()); |
| 1634 return string_stub(); | 1634 return string_stub(); |
| 1635 } else { | 1635 } else { |
| 1636 ASSERT(receiver_map->has_dictionary_elements() || | 1636 ASSERT(receiver_map->has_dictionary_elements() || |
| 1637 receiver_map->has_fast_elements() || | 1637 receiver_map->has_fast_smi_or_object_elements() || |
| 1638 receiver_map->has_fast_smi_only_elements() || | |
| 1639 receiver_map->has_fast_double_elements() || | 1638 receiver_map->has_fast_double_elements() || |
| 1640 receiver_map->has_external_array_elements()); | 1639 receiver_map->has_external_array_elements()); |
| 1641 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; | 1640 bool is_js_array = receiver_map->instance_type() == JS_ARRAY_TYPE; |
| 1642 return GetElementStubWithoutMapCheck(is_js_array, | 1641 return GetElementStubWithoutMapCheck(is_js_array, |
| 1643 receiver_map->elements_kind(), | 1642 receiver_map->elements_kind(), |
| 1644 grow_mode); | 1643 grow_mode); |
| 1645 } | 1644 } |
| 1646 } | 1645 } |
| 1647 | 1646 |
| 1648 | 1647 |
| 1649 Handle<Code> KeyedIC::ComputeMonomorphicStub(Handle<JSObject> receiver, | 1648 Handle<Code> KeyedIC::ComputeMonomorphicStub(Handle<JSObject> receiver, |
| 1650 StubKind stub_kind, | 1649 StubKind stub_kind, |
| 1651 StrictModeFlag strict_mode, | 1650 StrictModeFlag strict_mode, |
| 1652 Handle<Code> generic_stub) { | 1651 Handle<Code> generic_stub) { |
| 1653 if (receiver->HasFastElements() || | 1652 if (receiver->HasFastSmiOrObjectElements() || |
| 1654 receiver->HasFastSmiOnlyElements() || | |
| 1655 receiver->HasExternalArrayElements() || | 1653 receiver->HasExternalArrayElements() || |
| 1656 receiver->HasFastDoubleElements() || | 1654 receiver->HasFastDoubleElements() || |
| 1657 receiver->HasDictionaryElements()) { | 1655 receiver->HasDictionaryElements()) { |
| 1658 return isolate()->stub_cache()->ComputeKeyedLoadOrStoreElement( | 1656 return isolate()->stub_cache()->ComputeKeyedLoadOrStoreElement( |
| 1659 receiver, stub_kind, strict_mode); | 1657 receiver, stub_kind, strict_mode); |
| 1660 } else { | 1658 } else { |
| 1661 return generic_stub; | 1659 return generic_stub; |
| 1662 } | 1660 } |
| 1663 } | 1661 } |
| 1664 | 1662 |
| 1665 | 1663 |
| 1666 Handle<Map> KeyedIC::ComputeTransitionedMap(Handle<JSObject> receiver, | 1664 Handle<Map> KeyedIC::ComputeTransitionedMap(Handle<JSObject> receiver, |
| 1667 StubKind stub_kind) { | 1665 StubKind stub_kind) { |
| 1668 switch (stub_kind) { | 1666 switch (stub_kind) { |
| 1669 case KeyedIC::STORE_TRANSITION_SMI_TO_OBJECT: | 1667 case KeyedIC::STORE_TRANSITION_SMI_TO_OBJECT: |
| 1670 case KeyedIC::STORE_TRANSITION_DOUBLE_TO_OBJECT: | 1668 case KeyedIC::STORE_TRANSITION_DOUBLE_TO_OBJECT: |
| 1671 case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT: | 1669 case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT: |
| 1672 case KeyedIC::STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT: | 1670 case KeyedIC::STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT: |
| 1673 return JSObject::GetElementsTransitionMap(receiver, FAST_ELEMENTS); | 1671 return JSObject::GetElementsTransitionMap(receiver, FAST_ELEMENTS); |
| 1674 break; | |
| 1675 case KeyedIC::STORE_TRANSITION_SMI_TO_DOUBLE: | 1672 case KeyedIC::STORE_TRANSITION_SMI_TO_DOUBLE: |
| 1676 case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE: | 1673 case KeyedIC::STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE: |
| 1677 return JSObject::GetElementsTransitionMap(receiver, FAST_DOUBLE_ELEMENTS); | 1674 return JSObject::GetElementsTransitionMap(receiver, FAST_DOUBLE_ELEMENTS); |
| 1675 case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_OBJECT: |
| 1676 case KeyedIC::STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: |
| 1677 case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT: |
| 1678 case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT: |
| 1679 return JSObject::GetElementsTransitionMap(receiver, |
| 1680 FAST_HOLEY_ELEMENTS); |
| 1681 case KeyedIC::STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE: |
| 1682 case KeyedIC::STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE: |
| 1683 return JSObject::GetElementsTransitionMap(receiver, |
| 1684 FAST_HOLEY_DOUBLE_ELEMENTS); |
| 1685 case KeyedIC::LOAD: |
| 1686 case KeyedIC::STORE_NO_TRANSITION: |
| 1687 case KeyedIC::STORE_AND_GROW_NO_TRANSITION: |
| 1688 UNREACHABLE(); |
| 1678 break; | 1689 break; |
| 1679 default: | |
| 1680 UNREACHABLE(); | |
| 1681 return Handle<Map>::null(); | |
| 1682 } | 1690 } |
| 1691 return Handle<Map>::null(); |
| 1683 } | 1692 } |
| 1684 | 1693 |
| 1685 | 1694 |
| 1686 Handle<Code> KeyedStoreIC::GetElementStubWithoutMapCheck( | 1695 Handle<Code> KeyedStoreIC::GetElementStubWithoutMapCheck( |
| 1687 bool is_js_array, | 1696 bool is_js_array, |
| 1688 ElementsKind elements_kind, | 1697 ElementsKind elements_kind, |
| 1689 KeyedAccessGrowMode grow_mode) { | 1698 KeyedAccessGrowMode grow_mode) { |
| 1690 return KeyedStoreElementStub(is_js_array, elements_kind, grow_mode).GetCode(); | 1699 return KeyedStoreElementStub(is_js_array, elements_kind, grow_mode).GetCode(); |
| 1691 } | 1700 } |
| 1692 | 1701 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1732 Handle<Object> key, | 1741 Handle<Object> key, |
| 1733 Handle<Object> value) { | 1742 Handle<Object> value) { |
| 1734 ASSERT(key->IsSmi()); | 1743 ASSERT(key->IsSmi()); |
| 1735 int index = Smi::cast(*key)->value(); | 1744 int index = Smi::cast(*key)->value(); |
| 1736 bool allow_growth = receiver->IsJSArray() && | 1745 bool allow_growth = receiver->IsJSArray() && |
| 1737 JSArray::cast(*receiver)->length()->IsSmi() && | 1746 JSArray::cast(*receiver)->length()->IsSmi() && |
| 1738 index >= Smi::cast(JSArray::cast(*receiver)->length())->value(); | 1747 index >= Smi::cast(JSArray::cast(*receiver)->length())->value(); |
| 1739 | 1748 |
| 1740 if (allow_growth) { | 1749 if (allow_growth) { |
| 1741 // Handle growing array in stub if necessary. | 1750 // Handle growing array in stub if necessary. |
| 1742 if (receiver->HasFastSmiOnlyElements()) { | 1751 if (receiver->HasFastSmiElements()) { |
| 1743 if (value->IsHeapNumber()) { | 1752 if (value->IsHeapNumber()) { |
| 1744 return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE; | 1753 if (receiver->HasFastHoleyElements()) { |
| 1754 return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_DOUBLE; |
| 1755 } else { |
| 1756 return STORE_AND_GROW_TRANSITION_SMI_TO_DOUBLE; |
| 1757 } |
| 1745 } | 1758 } |
| 1746 if (value->IsHeapObject()) { | 1759 if (value->IsHeapObject()) { |
| 1747 return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT; | 1760 if (receiver->HasFastHoleyElements()) { |
| 1761 return STORE_AND_GROW_TRANSITION_HOLEY_SMI_TO_OBJECT; |
| 1762 } else { |
| 1763 return STORE_AND_GROW_TRANSITION_SMI_TO_OBJECT; |
| 1764 } |
| 1748 } | 1765 } |
| 1749 } else if (receiver->HasFastDoubleElements()) { | 1766 } else if (receiver->HasFastDoubleElements()) { |
| 1750 if (!value->IsSmi() && !value->IsHeapNumber()) { | 1767 if (!value->IsSmi() && !value->IsHeapNumber()) { |
| 1751 return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT; | 1768 if (receiver->HasFastHoleyElements()) { |
| 1769 return STORE_AND_GROW_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; |
| 1770 } else { |
| 1771 return STORE_AND_GROW_TRANSITION_DOUBLE_TO_OBJECT; |
| 1772 } |
| 1752 } | 1773 } |
| 1753 } | 1774 } |
| 1754 return STORE_AND_GROW_NO_TRANSITION; | 1775 return STORE_AND_GROW_NO_TRANSITION; |
| 1755 } else { | 1776 } else { |
| 1756 // Handle only in-bounds elements accesses. | 1777 // Handle only in-bounds elements accesses. |
| 1757 if (receiver->HasFastSmiOnlyElements()) { | 1778 if (receiver->HasFastSmiElements()) { |
| 1758 if (value->IsHeapNumber()) { | 1779 if (value->IsHeapNumber()) { |
| 1759 return STORE_TRANSITION_SMI_TO_DOUBLE; | 1780 if (receiver->HasFastHoleyElements()) { |
| 1781 return STORE_TRANSITION_HOLEY_SMI_TO_DOUBLE; |
| 1782 } else { |
| 1783 return STORE_TRANSITION_SMI_TO_DOUBLE; |
| 1784 } |
| 1760 } else if (value->IsHeapObject()) { | 1785 } else if (value->IsHeapObject()) { |
| 1761 return STORE_TRANSITION_SMI_TO_OBJECT; | 1786 if (receiver->HasFastHoleyElements()) { |
| 1787 return STORE_TRANSITION_HOLEY_SMI_TO_OBJECT; |
| 1788 } else { |
| 1789 return STORE_TRANSITION_SMI_TO_OBJECT; |
| 1790 } |
| 1762 } | 1791 } |
| 1763 } else if (receiver->HasFastDoubleElements()) { | 1792 } else if (receiver->HasFastDoubleElements()) { |
| 1764 if (!value->IsSmi() && !value->IsHeapNumber()) { | 1793 if (!value->IsSmi() && !value->IsHeapNumber()) { |
| 1765 return STORE_TRANSITION_DOUBLE_TO_OBJECT; | 1794 if (receiver->HasFastHoleyElements()) { |
| 1795 return STORE_TRANSITION_HOLEY_DOUBLE_TO_OBJECT; |
| 1796 } else { |
| 1797 return STORE_TRANSITION_DOUBLE_TO_OBJECT; |
| 1798 } |
| 1766 } | 1799 } |
| 1767 } | 1800 } |
| 1768 return STORE_NO_TRANSITION; | 1801 return STORE_NO_TRANSITION; |
| 1769 } | 1802 } |
| 1770 } | 1803 } |
| 1771 | 1804 |
| 1772 | 1805 |
| 1773 MaybeObject* KeyedStoreIC::Store(State state, | 1806 MaybeObject* KeyedStoreIC::Store(State state, |
| 1774 StrictModeFlag strict_mode, | 1807 StrictModeFlag strict_mode, |
| 1775 Handle<Object> object, | 1808 Handle<Object> object, |
| (...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2582 #undef ADDR | 2615 #undef ADDR |
| 2583 }; | 2616 }; |
| 2584 | 2617 |
| 2585 | 2618 |
| 2586 Address IC::AddressFromUtilityId(IC::UtilityId id) { | 2619 Address IC::AddressFromUtilityId(IC::UtilityId id) { |
| 2587 return IC_utilities[id]; | 2620 return IC_utilities[id]; |
| 2588 } | 2621 } |
| 2589 | 2622 |
| 2590 | 2623 |
| 2591 } } // namespace v8::internal | 2624 } } // namespace v8::internal |
| OLD | NEW |