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

Side by Side Diff: src/objects-inl.h

Issue 228333003: Handlefy Descriptor and other code in objects.cc (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 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
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 1710 matching lines...) Expand 10 before | Expand all | Expand 10 after
1721 if (double_array->is_the_hole(i)) { 1721 if (double_array->is_the_hole(i)) {
1722 TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS); 1722 TransitionElementsKind(object, FAST_HOLEY_DOUBLE_ELEMENTS);
1723 return; 1723 return;
1724 } 1724 }
1725 } 1725 }
1726 TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS); 1726 TransitionElementsKind(object, FAST_DOUBLE_ELEMENTS);
1727 } 1727 }
1728 } 1728 }
1729 1729
1730 1730
1731 MaybeObject* JSObject::GetElementsTransitionMap(Isolate* isolate,
1732 ElementsKind to_kind) {
1733 Map* current_map = map();
1734 ElementsKind from_kind = current_map->elements_kind();
1735 if (from_kind == to_kind) return current_map;
1736
1737 Context* native_context = isolate->context()->native_context();
1738 Object* maybe_array_maps = native_context->js_array_maps();
1739 if (maybe_array_maps->IsFixedArray()) {
1740 FixedArray* array_maps = FixedArray::cast(maybe_array_maps);
1741 if (array_maps->get(from_kind) == current_map) {
1742 Object* maybe_transitioned_map = array_maps->get(to_kind);
1743 if (maybe_transitioned_map->IsMap()) {
1744 return Map::cast(maybe_transitioned_map);
1745 }
1746 }
1747 }
1748
1749 return GetElementsTransitionMapSlow(to_kind);
1750 }
1751
1752
1753 void JSObject::SetMapAndElements(Handle<JSObject> object, 1731 void JSObject::SetMapAndElements(Handle<JSObject> object,
1754 Handle<Map> new_map, 1732 Handle<Map> new_map,
1755 Handle<FixedArrayBase> value) { 1733 Handle<FixedArrayBase> value) {
1756 JSObject::MigrateToMap(object, new_map); 1734 JSObject::MigrateToMap(object, new_map);
1757 ASSERT((object->map()->has_fast_smi_or_object_elements() || 1735 ASSERT((object->map()->has_fast_smi_or_object_elements() ||
1758 (*value == object->GetHeap()->empty_fixed_array())) == 1736 (*value == object->GetHeap()->empty_fixed_array())) ==
1759 (value->map() == object->GetHeap()->fixed_array_map() || 1737 (value->map() == object->GetHeap()->fixed_array_map() ||
1760 value->map() == object->GetHeap()->fixed_cow_array_map())); 1738 value->map() == object->GetHeap()->fixed_cow_array_map()));
1761 ASSERT((*value == object->GetHeap()->empty_fixed_array()) || 1739 ASSERT((*value == object->GetHeap()->empty_fixed_array()) ||
1762 (object->map()->has_fast_double_elements() == 1740 (object->map()->has_fast_double_elements() ==
(...skipping 27 matching lines...) Expand all
1790 FixedTypedArrayBase* empty_array = 1768 FixedTypedArrayBase* empty_array =
1791 GetHeap()->EmptyFixedTypedArrayForMap(map()); 1769 GetHeap()->EmptyFixedTypedArrayForMap(map());
1792 ASSERT(!GetHeap()->InNewSpace(empty_array)); 1770 ASSERT(!GetHeap()->InNewSpace(empty_array));
1793 WRITE_FIELD(this, kElementsOffset, empty_array); 1771 WRITE_FIELD(this, kElementsOffset, empty_array);
1794 } else { 1772 } else {
1795 UNREACHABLE(); 1773 UNREACHABLE();
1796 } 1774 }
1797 } 1775 }
1798 1776
1799 1777
1800 MaybeObject* JSObject::ResetElements() {
1801 if (map()->is_observed()) {
1802 // Maintain invariant that observed elements are always in dictionary mode.
1803 SeededNumberDictionary* dictionary;
1804 MaybeObject* maybe = SeededNumberDictionary::Allocate(GetHeap(), 0);
1805 if (!maybe->To(&dictionary)) return maybe;
1806 if (map() == GetHeap()->sloppy_arguments_elements_map()) {
1807 FixedArray::cast(elements())->set(1, dictionary);
1808 } else {
1809 set_elements(dictionary);
1810 }
1811 return this;
1812 }
1813
1814 ElementsKind elements_kind = GetInitialFastElementsKind();
1815 if (!FLAG_smi_only_arrays) {
1816 elements_kind = FastSmiToObjectElementsKind(elements_kind);
1817 }
1818 MaybeObject* maybe = GetElementsTransitionMap(GetIsolate(), elements_kind);
1819 Map* map;
1820 if (!maybe->To(&map)) return maybe;
1821 set_map(map);
1822 initialize_elements();
1823
1824 return this;
1825 }
1826
1827
1828 Handle<String> JSObject::ExpectedTransitionKey(Handle<Map> map) { 1778 Handle<String> JSObject::ExpectedTransitionKey(Handle<Map> map) {
1829 DisallowHeapAllocation no_gc; 1779 DisallowHeapAllocation no_gc;
1830 if (!map->HasTransitionArray()) return Handle<String>::null(); 1780 if (!map->HasTransitionArray()) return Handle<String>::null();
1831 TransitionArray* transitions = map->transitions(); 1781 TransitionArray* transitions = map->transitions();
1832 if (!transitions->IsSimpleTransition()) return Handle<String>::null(); 1782 if (!transitions->IsSimpleTransition()) return Handle<String>::null();
1833 int transition = TransitionArray::kSimpleTransitionIndex; 1783 int transition = TransitionArray::kSimpleTransitionIndex;
1834 PropertyDetails details = transitions->GetTargetDetails(transition); 1784 PropertyDetails details = transitions->GetTargetDetails(transition);
1835 Name* name = transitions->GetKey(transition); 1785 Name* name = transitions->GetKey(transition);
1836 if (details.type() != FIELD) return Handle<String>::null(); 1786 if (details.type() != FIELD) return Handle<String>::null();
1837 if (details.attributes() != NONE) return Handle<String>::null(); 1787 if (details.attributes() != NONE) return Handle<String>::null();
(...skipping 894 matching lines...) Expand 10 before | Expand all | Expand 10 after
2732 2682
2733 2683
2734 AccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) { 2684 AccessorDescriptor* DescriptorArray::GetCallbacks(int descriptor_number) {
2735 ASSERT(GetType(descriptor_number) == CALLBACKS); 2685 ASSERT(GetType(descriptor_number) == CALLBACKS);
2736 Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number)); 2686 Foreign* p = Foreign::cast(GetCallbacksObject(descriptor_number));
2737 return reinterpret_cast<AccessorDescriptor*>(p->foreign_address()); 2687 return reinterpret_cast<AccessorDescriptor*>(p->foreign_address());
2738 } 2688 }
2739 2689
2740 2690
2741 void DescriptorArray::Get(int descriptor_number, Descriptor* desc) { 2691 void DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
2742 desc->Init(GetKey(descriptor_number), 2692 desc->Init(handle(GetKey(descriptor_number), GetIsolate()),
2743 GetValue(descriptor_number), 2693 handle(GetValue(descriptor_number), GetIsolate()),
2744 GetDetails(descriptor_number)); 2694 GetDetails(descriptor_number));
2745 } 2695 }
2746 2696
2747 2697
2748 void DescriptorArray::Set(int descriptor_number, 2698 void DescriptorArray::Set(int descriptor_number,
2749 Descriptor* desc, 2699 Descriptor* desc,
2750 const WhitenessWitness&) { 2700 const WhitenessWitness&) {
2751 // Range check. 2701 // Range check.
2752 ASSERT(descriptor_number < number_of_descriptors()); 2702 ASSERT(descriptor_number < number_of_descriptors());
2753 2703
2754 NoIncrementalWriteBarrierSet(this, 2704 NoIncrementalWriteBarrierSet(this,
2755 ToKeyIndex(descriptor_number), 2705 ToKeyIndex(descriptor_number),
2756 desc->GetKey()); 2706 *desc->GetKey());
2757 NoIncrementalWriteBarrierSet(this, 2707 NoIncrementalWriteBarrierSet(this,
2758 ToValueIndex(descriptor_number), 2708 ToValueIndex(descriptor_number),
2759 desc->GetValue()); 2709 *desc->GetValue());
2760 NoIncrementalWriteBarrierSet(this, 2710 NoIncrementalWriteBarrierSet(this,
2761 ToDetailsIndex(descriptor_number), 2711 ToDetailsIndex(descriptor_number),
2762 desc->GetDetails().AsSmi()); 2712 desc->GetDetails().AsSmi());
2763 } 2713 }
2764 2714
2765 2715
2766 void DescriptorArray::Set(int descriptor_number, Descriptor* desc) { 2716 void DescriptorArray::Set(int descriptor_number, Descriptor* desc) {
2767 // Range check. 2717 // Range check.
2768 ASSERT(descriptor_number < number_of_descriptors()); 2718 ASSERT(descriptor_number < number_of_descriptors());
2769 2719
2770 set(ToKeyIndex(descriptor_number), desc->GetKey()); 2720 set(ToKeyIndex(descriptor_number), *desc->GetKey());
2771 set(ToValueIndex(descriptor_number), desc->GetValue()); 2721 set(ToValueIndex(descriptor_number), *desc->GetValue());
2772 set(ToDetailsIndex(descriptor_number), desc->GetDetails().AsSmi()); 2722 set(ToDetailsIndex(descriptor_number), desc->GetDetails().AsSmi());
2773 } 2723 }
2774 2724
2775 2725
2776 void DescriptorArray::Append(Descriptor* desc, 2726 void DescriptorArray::Append(Descriptor* desc,
2777 const WhitenessWitness& witness) { 2727 const WhitenessWitness& witness) {
2778 int descriptor_number = number_of_descriptors(); 2728 int descriptor_number = number_of_descriptors();
2779 SetNumberOfDescriptors(descriptor_number + 1); 2729 SetNumberOfDescriptors(descriptor_number + 1);
2780 Set(descriptor_number, desc, witness); 2730 Set(descriptor_number, desc, witness);
2781 2731
(...skipping 2115 matching lines...) Expand 10 before | Expand all | Expand 10 after
4897 return transitions()->GetTarget(transition_index); 4847 return transitions()->GetTarget(transition_index);
4898 } 4848 }
4899 4849
4900 4850
4901 int Map::SearchTransition(Name* name) { 4851 int Map::SearchTransition(Name* name) {
4902 if (HasTransitionArray()) return transitions()->Search(name); 4852 if (HasTransitionArray()) return transitions()->Search(name);
4903 return TransitionArray::kNotFound; 4853 return TransitionArray::kNotFound;
4904 } 4854 }
4905 4855
4906 4856
4907 MaybeObject* Map::set_elements_transition_map(Map* transitioned_map) {
4908 TransitionArray* transitions;
4909 MaybeObject* maybe_transitions = AddTransition(
4910 GetHeap()->elements_transition_symbol(),
4911 transitioned_map,
4912 FULL_TRANSITION);
4913 if (!maybe_transitions->To(&transitions)) return maybe_transitions;
4914 set_transitions(transitions);
4915 return transitions;
4916 }
4917
4918
4919 FixedArray* Map::GetPrototypeTransitions() { 4857 FixedArray* Map::GetPrototypeTransitions() {
4920 if (!HasTransitionArray()) return GetHeap()->empty_fixed_array(); 4858 if (!HasTransitionArray()) return GetHeap()->empty_fixed_array();
4921 if (!transitions()->HasPrototypeTransitions()) { 4859 if (!transitions()->HasPrototypeTransitions()) {
4922 return GetHeap()->empty_fixed_array(); 4860 return GetHeap()->empty_fixed_array();
4923 } 4861 }
4924 return transitions()->GetPrototypeTransitions(); 4862 return transitions()->GetPrototypeTransitions();
4925 } 4863 }
4926 4864
4927 4865
4928 MaybeObject* Map::SetPrototypeTransitions(FixedArray* proto_transitions) { 4866 MaybeObject* Map::SetPrototypeTransitions(FixedArray* proto_transitions) {
(...skipping 1995 matching lines...) Expand 10 before | Expand all | Expand 10 after
6924 #undef READ_UINT32_FIELD 6862 #undef READ_UINT32_FIELD
6925 #undef WRITE_UINT32_FIELD 6863 #undef WRITE_UINT32_FIELD
6926 #undef READ_SHORT_FIELD 6864 #undef READ_SHORT_FIELD
6927 #undef WRITE_SHORT_FIELD 6865 #undef WRITE_SHORT_FIELD
6928 #undef READ_BYTE_FIELD 6866 #undef READ_BYTE_FIELD
6929 #undef WRITE_BYTE_FIELD 6867 #undef WRITE_BYTE_FIELD
6930 6868
6931 } } // namespace v8::internal 6869 } } // namespace v8::internal
6932 6870
6933 #endif // V8_OBJECTS_INL_H_ 6871 #endif // V8_OBJECTS_INL_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698