PassRefPtr<MetaAllocatorHandle> MetaAllocator::allocate(size_t sizeInBytes, void* ownerUID) { SpinLockHolder locker(&m_lock); if (!sizeInBytes) return 0; sizeInBytes = roundUp(sizeInBytes); void* start = findAndRemoveFreeSpace(sizeInBytes); if (!start) { size_t requestedNumberOfPages = (sizeInBytes + m_pageSize - 1) >> m_logPageSize; size_t numberOfPages = requestedNumberOfPages; start = allocateNewSpace(numberOfPages); if (!start) return 0; ASSERT(numberOfPages >= requestedNumberOfPages); size_t roundedUpSize = numberOfPages << m_logPageSize; ASSERT(roundedUpSize >= sizeInBytes); m_bytesReserved += roundedUpSize; if (roundedUpSize > sizeInBytes) { void* freeSpaceStart = reinterpret_cast<void*>(reinterpret_cast<uintptr_t>(start) + sizeInBytes); size_t freeSpaceSize = roundedUpSize - sizeInBytes; addFreeSpace(freeSpaceStart, freeSpaceSize); } }
void* SlotVisitor::allocateNewSpaceOrPin(void* ptr, size_t bytes) { if (!checkIfShouldCopyAndPinOtherwise(ptr, bytes)) return 0; return allocateNewSpace(bytes); }
void SlotVisitor::copy(void** ptr, size_t bytes) { void* newPtr = 0; if (!(newPtr = allocateNewSpace(*ptr, bytes))) return; memcpy(newPtr, *ptr, bytes); *ptr = newPtr; }
void SlotVisitor::copyAndAppend(void** ptr, size_t bytes, JSValue* values, unsigned length) { void* oldPtr = *ptr; void* newPtr = allocateNewSpace(oldPtr, bytes); if (newPtr) { size_t jsValuesOffset = static_cast<size_t>(reinterpret_cast<char*>(values) - static_cast<char*>(oldPtr)); JSValue* newValues = reinterpret_cast<JSValue*>(static_cast<char*>(newPtr) + jsValuesOffset); for (unsigned i = 0; i < length; i++) { JSValue& value = values[i]; newValues[i] = value; if (!value) continue; internalAppend(value); } memcpy(newPtr, oldPtr, jsValuesOffset); *ptr = newPtr; } else append(values, length); }