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

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

Issue 10575032: In-place shrinking of descriptor arrays with non-live transitions. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressing comments Created 8 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
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 1845 matching lines...) Expand 10 before | Expand all | Expand 10 after
1856 Object* value, 1856 Object* value,
1857 WriteBarrierMode mode) { 1857 WriteBarrierMode mode) {
1858 int offset = kHeaderSize + index * kPointerSize; 1858 int offset = kHeaderSize + index * kPointerSize;
1859 WRITE_FIELD(this, offset, value); 1859 WRITE_FIELD(this, offset, value);
1860 CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode); 1860 CONDITIONAL_WRITE_BARRIER(heap, this, offset, value, mode);
1861 } 1861 }
1862 1862
1863 1863
1864 void FixedArray::set_null_unchecked(Heap* heap, int index) { 1864 void FixedArray::set_null_unchecked(Heap* heap, int index) {
1865 ASSERT(index >= 0 && index < this->length()); 1865 ASSERT(index >= 0 && index < this->length());
1866 ASSERT(!HEAP->InNewSpace(heap->null_value())); 1866 ASSERT(!heap->InNewSpace(heap->null_value()));
1867 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value()); 1867 WRITE_FIELD(this, kHeaderSize + index * kPointerSize, heap->null_value());
1868 } 1868 }
1869 1869
1870 1870
1871 Object** FixedArray::data_start() { 1871 Object** FixedArray::data_start() {
1872 return HeapObject::RawField(this, kHeaderSize); 1872 return HeapObject::RawField(this, kHeaderSize);
1873 } 1873 }
1874 1874
1875 1875
1876 bool DescriptorArray::IsEmpty() { 1876 bool DescriptorArray::IsEmpty() {
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1969 OffsetOfElementAt(ToKeyIndex(descriptor_number))); 1969 OffsetOfElementAt(ToKeyIndex(descriptor_number)));
1970 } 1970 }
1971 1971
1972 1972
1973 String* DescriptorArray::GetKey(int descriptor_number) { 1973 String* DescriptorArray::GetKey(int descriptor_number) {
1974 ASSERT(descriptor_number < number_of_descriptors()); 1974 ASSERT(descriptor_number < number_of_descriptors());
1975 return String::cast(get(ToKeyIndex(descriptor_number))); 1975 return String::cast(get(ToKeyIndex(descriptor_number)));
1976 } 1976 }
1977 1977
1978 1978
1979 void DescriptorArray::SetKeyUnchecked(Heap* heap,
1980 int descriptor_number,
1981 String* key) {
1982 ASSERT(descriptor_number < number_of_descriptors());
1983 set_unchecked(heap,
1984 ToKeyIndex(descriptor_number),
1985 key,
1986 UPDATE_WRITE_BARRIER);
1987 }
1988
1989
1979 Object** DescriptorArray::GetValueSlot(int descriptor_number) { 1990 Object** DescriptorArray::GetValueSlot(int descriptor_number) {
1980 ASSERT(descriptor_number < number_of_descriptors()); 1991 ASSERT(descriptor_number < number_of_descriptors());
1981 return HeapObject::RawField( 1992 return HeapObject::RawField(
1982 reinterpret_cast<HeapObject*>(this), 1993 reinterpret_cast<HeapObject*>(this),
1983 OffsetOfElementAt(ToValueIndex(descriptor_number))); 1994 OffsetOfElementAt(ToValueIndex(descriptor_number)));
1984 } 1995 }
1985 1996
1986 1997
1987 Object* DescriptorArray::GetValue(int descriptor_number) { 1998 Object* DescriptorArray::GetValue(int descriptor_number) {
1988 ASSERT(descriptor_number < number_of_descriptors()); 1999 ASSERT(descriptor_number < number_of_descriptors());
1989 return get(ToValueIndex(descriptor_number)); 2000 return get(ToValueIndex(descriptor_number));
1990 } 2001 }
1991 2002
1992 2003
1993 void DescriptorArray::SetNullValueUnchecked(int descriptor_number, Heap* heap) { 2004 void DescriptorArray::SetNullValueUnchecked(Heap* heap, int descriptor_number) {
1994 ASSERT(descriptor_number < number_of_descriptors()); 2005 ASSERT(descriptor_number < number_of_descriptors());
1995 set_null_unchecked(heap, ToValueIndex(descriptor_number)); 2006 set_null_unchecked(heap, ToValueIndex(descriptor_number));
1996 } 2007 }
1997 2008
1998 2009
2010
2011 void DescriptorArray::SetValueUnchecked(Heap* heap,
2012 int descriptor_number,
2013 Object* value) {
2014 ASSERT(descriptor_number < number_of_descriptors());
2015 set_unchecked(heap,
2016 ToValueIndex(descriptor_number),
2017 value,
2018 UPDATE_WRITE_BARRIER);
2019 }
2020
2021
1999 PropertyDetails DescriptorArray::GetDetails(int descriptor_number) { 2022 PropertyDetails DescriptorArray::GetDetails(int descriptor_number) {
2000 ASSERT(descriptor_number < number_of_descriptors()); 2023 ASSERT(descriptor_number < number_of_descriptors());
2001 Object* details = get(ToDetailsIndex(descriptor_number)); 2024 Object* details = get(ToDetailsIndex(descriptor_number));
2002 return PropertyDetails(Smi::cast(details)); 2025 return PropertyDetails(Smi::cast(details));
2003 } 2026 }
2004 2027
2005 2028
2006 void DescriptorArray::SetDetailsUnchecked(int descriptor_number, Smi* value) { 2029 void DescriptorArray::SetDetailsUnchecked(int descriptor_number, Smi* value) {
2007 ASSERT(descriptor_number < number_of_descriptors()); 2030 ASSERT(descriptor_number < number_of_descriptors());
2008 set_unchecked(ToDetailsIndex(descriptor_number), value); 2031 set_unchecked(ToDetailsIndex(descriptor_number), value);
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2052 Object* value = GetValue(descriptor_number); 2075 Object* value = GetValue(descriptor_number);
2053 if (!value->IsAccessorPair()) return false; 2076 if (!value->IsAccessorPair()) return false;
2054 AccessorPair* accessors = AccessorPair::cast(value); 2077 AccessorPair* accessors = AccessorPair::cast(value);
2055 return accessors->getter()->IsMap() && accessors->setter()->IsMap(); 2078 return accessors->getter()->IsMap() && accessors->setter()->IsMap();
2056 } 2079 }
2057 case NORMAL: 2080 case NORMAL:
2058 case FIELD: 2081 case FIELD:
2059 case CONSTANT_FUNCTION: 2082 case CONSTANT_FUNCTION:
2060 case HANDLER: 2083 case HANDLER:
2061 case INTERCEPTOR: 2084 case INTERCEPTOR:
2062 case NULL_DESCRIPTOR:
2063 return false; 2085 return false;
2086 case NONEXISTENT:
2087 UNREACHABLE();
2088 break;
2064 } 2089 }
2065 UNREACHABLE(); // Keep the compiler happy. 2090 UNREACHABLE(); // Keep the compiler happy.
2066 return false; 2091 return false;
2067 } 2092 }
2068 2093
2069 2094
2070 bool DescriptorArray::IsNullDescriptor(int descriptor_number) {
2071 return GetType(descriptor_number) == NULL_DESCRIPTOR;
2072 }
2073
2074
2075 void DescriptorArray::Get(int descriptor_number, Descriptor* desc) { 2095 void DescriptorArray::Get(int descriptor_number, Descriptor* desc) {
2076 desc->Init(GetKey(descriptor_number), 2096 desc->Init(GetKey(descriptor_number),
2077 GetValue(descriptor_number), 2097 GetValue(descriptor_number),
2078 GetDetails(descriptor_number)); 2098 GetDetails(descriptor_number));
2079 } 2099 }
2080 2100
2081 2101
2082 void DescriptorArray::Set(int descriptor_number, 2102 void DescriptorArray::Set(int descriptor_number,
2083 Descriptor* desc, 2103 Descriptor* desc,
2084 const WhitenessWitness&) { 2104 const WhitenessWitness&) {
(...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after
3457 Object* object = READ_FIELD(this, 3477 Object* object = READ_FIELD(this,
3458 kInstanceDescriptorsOrBitField3Offset); 3478 kInstanceDescriptorsOrBitField3Offset);
3459 if (object->IsSmi()) { 3479 if (object->IsSmi()) {
3460 return Smi::cast(object)->value(); 3480 return Smi::cast(object)->value();
3461 } else { 3481 } else {
3462 return DescriptorArray::cast(object)->bit_field3_storage(); 3482 return DescriptorArray::cast(object)->bit_field3_storage();
3463 } 3483 }
3464 } 3484 }
3465 3485
3466 3486
3487 void Map::ClearDescriptorArray() {
3488 int bitfield3 = bit_field3();
3489 #ifdef DEBUG
3490 Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
3491 if (!object->IsSmi()) {
3492 ZapInstanceDescriptors();
3493 }
3494 #endif
3495 WRITE_FIELD(this,
3496 kInstanceDescriptorsOrBitField3Offset,
3497 Smi::FromInt(bitfield3));
3498 }
3499
3500
3467 void Map::set_bit_field3(int value) { 3501 void Map::set_bit_field3(int value) {
3468 ASSERT(Smi::IsValid(value)); 3502 ASSERT(Smi::IsValid(value));
3469 Object* object = READ_FIELD(this, 3503 Object* object = READ_FIELD(this, kInstanceDescriptorsOrBitField3Offset);
3470 kInstanceDescriptorsOrBitField3Offset);
3471 if (object->IsSmi()) { 3504 if (object->IsSmi()) {
3472 WRITE_FIELD(this, 3505 WRITE_FIELD(this,
3473 kInstanceDescriptorsOrBitField3Offset, 3506 kInstanceDescriptorsOrBitField3Offset,
3474 Smi::FromInt(value)); 3507 Smi::FromInt(value));
3475 } else { 3508 } else {
3476 DescriptorArray::cast(object)->set_bit_field3_storage(value); 3509 DescriptorArray::cast(object)->set_bit_field3_storage(value);
3477 } 3510 }
3478 } 3511 }
3479 3512
3480 3513
(...skipping 1704 matching lines...) Expand 10 before | Expand all | Expand 10 after
5185 #undef WRITE_UINT32_FIELD 5218 #undef WRITE_UINT32_FIELD
5186 #undef READ_SHORT_FIELD 5219 #undef READ_SHORT_FIELD
5187 #undef WRITE_SHORT_FIELD 5220 #undef WRITE_SHORT_FIELD
5188 #undef READ_BYTE_FIELD 5221 #undef READ_BYTE_FIELD
5189 #undef WRITE_BYTE_FIELD 5222 #undef WRITE_BYTE_FIELD
5190 5223
5191 5224
5192 } } // namespace v8::internal 5225 } } // namespace v8::internal
5193 5226
5194 #endif // V8_OBJECTS_INL_H_ 5227 #endif // V8_OBJECTS_INL_H_
OLDNEW
« src/objects.cc ('K') | « src/objects-debug.cc ('k') | src/objects-printer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698