Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/ic.cc

Issue 10442015: Rollback of r11638, r11636 on trunk branch. (Closed) Base URL: https://v8.googlecode.com/svn/trunk
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/ic.h ('k') | src/jsregexp.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « src/ic.h ('k') | src/jsregexp.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698