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

Side by Side Diff: src/objects.h

Issue 7464032: Improve fast to slow elements conversion: (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review fixes and tweaks Created 9 years, 5 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 | « no previous file | src/objects.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 1636 matching lines...) Expand 10 before | Expand all | Expand 10 after
1647 // Do we want to keep the elements in fast case when increasing the 1647 // Do we want to keep the elements in fast case when increasing the
1648 // capacity? 1648 // capacity?
1649 bool ShouldConvertToSlowElements(int new_capacity); 1649 bool ShouldConvertToSlowElements(int new_capacity);
1650 // Returns true if the backing storage for the slow-case elements of 1650 // Returns true if the backing storage for the slow-case elements of
1651 // this object takes up nearly as much space as a fast-case backing 1651 // this object takes up nearly as much space as a fast-case backing
1652 // storage would. In that case the JSObject should have fast 1652 // storage would. In that case the JSObject should have fast
1653 // elements. 1653 // elements.
1654 bool ShouldConvertToFastElements(); 1654 bool ShouldConvertToFastElements();
1655 // Returns true if the elements of JSObject contains only values that can be 1655 // Returns true if the elements of JSObject contains only values that can be
1656 // represented in a FixedDoubleArray. 1656 // represented in a FixedDoubleArray.
1657 bool ShouldConvertToFastDoubleElements(); 1657 bool CanConvertToFastDoubleElements();
1658 1658
1659 // Tells whether the index'th element is present. 1659 // Tells whether the index'th element is present.
1660 inline bool HasElement(uint32_t index); 1660 inline bool HasElement(uint32_t index);
1661 bool HasElementWithReceiver(JSReceiver* receiver, uint32_t index); 1661 bool HasElementWithReceiver(JSReceiver* receiver, uint32_t index);
1662 1662
1663 // Computes the new capacity when expanding the elements of a JSObject. 1663 // Computes the new capacity when expanding the elements of a JSObject.
1664 static int NewElementsCapacity(int old_capacity) { 1664 static int NewElementsCapacity(int old_capacity) {
1665 // (old_capacity + 50%) + 16 1665 // (old_capacity + 50%) + 16
1666 return old_capacity + (old_capacity >> 1) + 16; 1666 return old_capacity + (old_capacity >> 1) + 16;
1667 } 1667 }
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
1941 1941
1942 // Maximal number of fast properties for the JSObject. Used to 1942 // Maximal number of fast properties for the JSObject. Used to
1943 // restrict the number of map transitions to avoid an explosion in 1943 // restrict the number of map transitions to avoid an explosion in
1944 // the number of maps for objects used as dictionaries. 1944 // the number of maps for objects used as dictionaries.
1945 inline int MaxFastProperties(); 1945 inline int MaxFastProperties();
1946 1946
1947 // Maximal number of elements (numbered 0 .. kMaxElementCount - 1). 1947 // Maximal number of elements (numbered 0 .. kMaxElementCount - 1).
1948 // Also maximal value of JSArray's length property. 1948 // Also maximal value of JSArray's length property.
1949 static const uint32_t kMaxElementCount = 0xffffffffu; 1949 static const uint32_t kMaxElementCount = 0xffffffffu;
1950 1950
1951 // Constants for heuristics controlling conversion of fast elements
1952 // to slow elements.
1953
1954 // Maximal gap that can be introduced by adding an element beyond
1955 // the current elements length.
1951 static const uint32_t kMaxGap = 1024; 1956 static const uint32_t kMaxGap = 1024;
1952 static const int kMaxFastElementsLength = 5000; 1957
1958 // Maximal length of fast elements array that won't be checked for
1959 // being dense enough on expansion.
1960 static const int kMaxUncheckedFastElementsLength = 5000;
1961
1962 // Same as above but for old arrays. This limit is more strict. We
1963 // don't want to be wasteful with long lived objects.
1964 static const int kMaxUncheckedOldFastElementsLength = 500;
1965
1953 static const int kInitialMaxFastElementArray = 100000; 1966 static const int kInitialMaxFastElementArray = 100000;
1954 static const int kMaxFastProperties = 12; 1967 static const int kMaxFastProperties = 12;
1955 static const int kMaxInstanceSize = 255 * kPointerSize; 1968 static const int kMaxInstanceSize = 255 * kPointerSize;
1956 // When extending the backing storage for property values, we increase 1969 // When extending the backing storage for property values, we increase
1957 // its size by more than the 1 entry necessary, so sequentially adding fields 1970 // its size by more than the 1 entry necessary, so sequentially adding fields
1958 // to the same object requires fewer allocations and copies. 1971 // to the same object requires fewer allocations and copies.
1959 static const int kFieldsAdded = 3; 1972 static const int kFieldsAdded = 3;
1960 1973
1961 // Layout description. 1974 // Layout description.
1962 static const int kPropertiesOffset = HeapObject::kHeaderSize; 1975 static const int kPropertiesOffset = HeapObject::kHeaderSize;
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2008 bool ReferencesObjectFromElements(FixedArray* elements, 2021 bool ReferencesObjectFromElements(FixedArray* elements,
2009 ElementsKind kind, 2022 ElementsKind kind,
2010 Object* object); 2023 Object* object);
2011 bool HasElementInElements(FixedArray* elements, 2024 bool HasElementInElements(FixedArray* elements,
2012 ElementsKind kind, 2025 ElementsKind kind,
2013 uint32_t index); 2026 uint32_t index);
2014 2027
2015 // Returns true if most of the elements backing storage is used. 2028 // Returns true if most of the elements backing storage is used.
2016 bool HasDenseElements(); 2029 bool HasDenseElements();
2017 2030
2031 // Gets the current elements capacity and the number of used elements.
2032 void GetElementsCapacityAndUsage(int* capacity, int* used);
2033
2018 bool CanSetCallback(String* name); 2034 bool CanSetCallback(String* name);
2019 MUST_USE_RESULT MaybeObject* SetElementCallback( 2035 MUST_USE_RESULT MaybeObject* SetElementCallback(
2020 uint32_t index, 2036 uint32_t index,
2021 Object* structure, 2037 Object* structure,
2022 PropertyAttributes attributes); 2038 PropertyAttributes attributes);
2023 MUST_USE_RESULT MaybeObject* SetPropertyCallback( 2039 MUST_USE_RESULT MaybeObject* SetPropertyCallback(
2024 String* name, 2040 String* name,
2025 Object* structure, 2041 Object* structure,
2026 PropertyAttributes attributes); 2042 PropertyAttributes attributes);
2027 MUST_USE_RESULT MaybeObject* DefineGetterSetter( 2043 MUST_USE_RESULT MaybeObject* DefineGetterSetter(
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
2484 void ElementsRemoved(int n) { 2500 void ElementsRemoved(int n) {
2485 SetNumberOfElements(NumberOfElements() - n); 2501 SetNumberOfElements(NumberOfElements() - n);
2486 SetNumberOfDeletedElements(NumberOfDeletedElements() + n); 2502 SetNumberOfDeletedElements(NumberOfDeletedElements() + n);
2487 } 2503 }
2488 2504
2489 // Returns a new HashTable object. Might return Failure. 2505 // Returns a new HashTable object. Might return Failure.
2490 MUST_USE_RESULT static MaybeObject* Allocate( 2506 MUST_USE_RESULT static MaybeObject* Allocate(
2491 int at_least_space_for, 2507 int at_least_space_for,
2492 PretenureFlag pretenure = NOT_TENURED); 2508 PretenureFlag pretenure = NOT_TENURED);
2493 2509
2510 // Computes the required capacity for a table holding the given
2511 // number of elements. May be more than HashTable::kMaxCapacity.
2512 static int ComputeCapacity(int at_least_space_for);
2513
2494 // Returns the key at entry. 2514 // Returns the key at entry.
2495 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); } 2515 Object* KeyAt(int entry) { return get(EntryToIndex(entry)); }
2496 2516
2497 // Tells whether k is a real key. Null and undefined are not allowed 2517 // Tells whether k is a real key. Null and undefined are not allowed
2498 // as keys and can be used to indicate missing or deleted elements. 2518 // as keys and can be used to indicate missing or deleted elements.
2499 bool IsKey(Object* k) { 2519 bool IsKey(Object* k) {
2500 return !k->IsNull() && !k->IsUndefined(); 2520 return !k->IsNull() && !k->IsUndefined();
2501 } 2521 }
2502 2522
2503 // Garbage collection support. 2523 // Garbage collection support.
(...skipping 4679 matching lines...) Expand 10 before | Expand all | Expand 10 after
7183 } else { 7203 } else {
7184 value &= ~(1 << bit_position); 7204 value &= ~(1 << bit_position);
7185 } 7205 }
7186 return value; 7206 return value;
7187 } 7207 }
7188 }; 7208 };
7189 7209
7190 } } // namespace v8::internal 7210 } } // namespace v8::internal
7191 7211
7192 #endif // V8_OBJECTS_H_ 7212 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « no previous file | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698