static uObject* uInitObject(uType* type, void* ptr, size_t size) { U_ASSERT(type && type->IsClosed() && type->ObjectSize && type->ValueSize && !(type->Flags & uTypeFlagsAbstract)); if (type->State < uTypeStateInitializing && strcmp(type->FullName, "Uno.String") != 0 && strcmp(type->FullName, "Uno.Type") != 0) type->Init(); uObject* object = (uObject*)ptr; object->__type = type; object->__retains = 1; #ifdef DEBUG_ARC object->__size = size; object->__id = type->Definition->ObjectCount++; #endif #if DEBUG_ARC >= 2 Xli::Error->WriteFormat("alloc %s #%d (%d bytes)%s\n", type->FullName, object->__id, size, uGetCaller().Ptr()); #endif #ifdef DEBUG_DUMPS uEnterCritical(); (*_HeapObjects)[object] = true; uExitCritical(); #endif uAutoRelease(object); return object; }
void uAutoReleaseStruct(uType* type, void* address) { #if DEBUG_ARC >= 4 Xli::Error->WriteFormat("autorelease %s [struct] (%d bytes)%s\n", type->FullName, type->ValueSize, uGetCaller().Ptr()); #endif for (size_t i = 0; i < type->Refs.StrongCount; i++) uAutoRelease(*(uObject**)((uint8_t*)address + type->Refs.Strong[i].Value)); }
uObject* uLoadWeak(uWeakObject* weak) { if (!weak) return NULL; uObject* object = uCallWithWeakRefLock(&uLoadWeak_inner, weak); uAutoRelease(object); return object; }
void uArray::Copy(const uArray* srcArray, int srcIndex, uArray* dstArray, int dstIndex, int length) { if (!srcArray || !dstArray) U_THROW_NRE(); if (srcArray->GetType() != dstArray->GetType()) U_THROW_ICE(); if (length < 0 || srcIndex < 0 || srcIndex + length > srcArray->Length() || dstIndex < 0 || dstIndex + length > dstArray->Length()) U_THROW_IOORE(); uType* type = ((uArrayType*)srcArray->GetType())->ElementType; size_t size = type->ValueSize; uint8_t* dst = (uint8_t*)dstArray->Ptr() + size * dstIndex; const uint8_t* src = (const uint8_t*)srcArray->Ptr() + size * srcIndex; switch (type->Type) { case uTypeTypeEnum: memcpy(dst, src, size * length); break; case uTypeTypeStruct: if (type->Flags & uTypeFlagsRetainStruct) { for (int i = 0; i < length; i++) uAutoReleaseStruct(type, dst + i * size); memcpy(dst, src, size * length); for (int i = 0; i < length; i++) uRetainStruct(type, dst + i * size); } else memcpy(dst, src, size * length); break; default: for (int i = 0; i < length; i++) uAutoRelease((uObject*)dst + i); memcpy(dst, src, size * length); for (int i = 0; i < length; i++) uRetain((uObject*)dst + i); break; } }
void uStoreStrong(uObject** address, uObject* object) { uAutoRelease(*address); uRetain(*address = object); }