OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
236 // | 236 // |
237 // | HeapHeaderObject (4 byte) | object payload (8 * n byte) | padding (4 by
te) | | 237 // | HeapHeaderObject (4 byte) | object payload (8 * n byte) | padding (4 by
te) | |
238 // ^4 byte aligned ^8 byte aligned ^4 byte aligned | 238 // ^4 byte aligned ^8 byte aligned ^4 byte aligned |
239 // | 239 // |
240 // since the former layout aligns both header and payload to 8 byte. | 240 // since the former layout aligns both header and payload to 8 byte. |
241 #if !ENABLE(ASSERT) && !ENABLE(GC_PROFILING) && CPU(64BIT) | 241 #if !ENABLE(ASSERT) && !ENABLE(GC_PROFILING) && CPU(64BIT) |
242 uint32_t m_padding; | 242 uint32_t m_padding; |
243 #endif | 243 #endif |
244 }; | 244 }; |
245 | 245 |
246 inline HeapObjectHeader* HeapObjectHeader::fromPayload(const void* payload) | |
247 { | |
248 Address addr = reinterpret_cast<Address>(const_cast<void*>(payload)); | |
249 HeapObjectHeader* header = reinterpret_cast<HeapObjectHeader*>(addr - sizeof
(HeapObjectHeader)); | |
250 return header; | |
251 } | |
252 | |
253 class FreeListEntry final : public HeapObjectHeader { | 246 class FreeListEntry final : public HeapObjectHeader { |
254 public: | 247 public: |
255 NO_SANITIZE_ADDRESS | 248 NO_SANITIZE_ADDRESS |
256 explicit FreeListEntry(size_t size) | 249 explicit FreeListEntry(size_t size) |
257 : HeapObjectHeader(size, gcInfoIndexForFreeListHeader) | 250 : HeapObjectHeader(size, gcInfoIndexForFreeListHeader) |
258 , m_next(nullptr) | 251 , m_next(nullptr) |
259 { | 252 { |
260 #if ENABLE(ASSERT) && !defined(ADDRESS_SANITIZER) | 253 #if ENABLE(ASSERT) && !defined(ADDRESS_SANITIZER) |
261 // Zap free area with asterisks, aka 0x2a2a2a2a. | 254 // Zap free area with asterisks, aka 0x2a2a2a2a. |
262 // For ASan don't zap since we keep accounting in the freelist entry. | 255 // For ASan don't zap since we keep accounting in the freelist entry. |
(...skipping 919 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1182 { | 1175 { |
1183 size_t size = m_encoded & headerSizeMask; | 1176 size_t size = m_encoded & headerSizeMask; |
1184 if (UNLIKELY(size == largeObjectSizeInHeader)) { | 1177 if (UNLIKELY(size == largeObjectSizeInHeader)) { |
1185 ASSERT(pageFromObject(this)->isLargeObjectPage()); | 1178 ASSERT(pageFromObject(this)->isLargeObjectPage()); |
1186 return static_cast<LargeObjectPage*>(pageFromObject(this))->payloadSize(
); | 1179 return static_cast<LargeObjectPage*>(pageFromObject(this))->payloadSize(
); |
1187 } | 1180 } |
1188 ASSERT(!pageFromObject(this)->isLargeObjectPage()); | 1181 ASSERT(!pageFromObject(this)->isLargeObjectPage()); |
1189 return size - sizeof(HeapObjectHeader); | 1182 return size - sizeof(HeapObjectHeader); |
1190 } | 1183 } |
1191 | 1184 |
| 1185 inline HeapObjectHeader* HeapObjectHeader::fromPayload(const void* payload) |
| 1186 { |
| 1187 Address addr = reinterpret_cast<Address>(const_cast<void*>(payload)); |
| 1188 HeapObjectHeader* header = reinterpret_cast<HeapObjectHeader*>(addr - sizeof
(HeapObjectHeader)); |
| 1189 header->checkHeader(); |
| 1190 return header; |
| 1191 } |
| 1192 |
1192 NO_SANITIZE_ADDRESS inline | 1193 NO_SANITIZE_ADDRESS inline |
1193 bool HeapObjectHeader::isMarked() const | 1194 bool HeapObjectHeader::isMarked() const |
1194 { | 1195 { |
1195 checkHeader(); | 1196 checkHeader(); |
1196 return m_encoded & headerMarkBitMask; | 1197 return m_encoded & headerMarkBitMask; |
1197 } | 1198 } |
1198 | 1199 |
1199 NO_SANITIZE_ADDRESS inline | 1200 NO_SANITIZE_ADDRESS inline |
1200 void HeapObjectHeader::mark() | 1201 void HeapObjectHeader::mark() |
1201 { | 1202 { |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1293 size_t copySize = previousHeader->payloadSize(); | 1294 size_t copySize = previousHeader->payloadSize(); |
1294 if (copySize > size) | 1295 if (copySize > size) |
1295 copySize = size; | 1296 copySize = size; |
1296 memcpy(address, previous, copySize); | 1297 memcpy(address, previous, copySize); |
1297 return address; | 1298 return address; |
1298 } | 1299 } |
1299 | 1300 |
1300 } // namespace blink | 1301 } // namespace blink |
1301 | 1302 |
1302 #endif // Heap_h | 1303 #endif // Heap_h |
OLD | NEW |