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

Side by Side Diff: src/ic.cc

Issue 10209027: Implement tracking and optimizations of packed arrays. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: New upload 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') | src/objects.cc » ('J')
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 1616 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW
« no previous file with comments | « src/ic.h ('k') | src/jsregexp.cc » ('j') | src/objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698