コード例 #1
0
ファイル: Memory.cpp プロジェクト: blyk/BlackCode-Fuse
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;
}
コード例 #2
0
ファイル: Memory.cpp プロジェクト: blyk/BlackCode-Fuse
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));
}
コード例 #3
0
ファイル: Memory.cpp プロジェクト: blyk/BlackCode-Fuse
uObject* uLoadWeak(uWeakObject* weak)
{
    if (!weak)
        return NULL;

    uObject* object = uCallWithWeakRefLock(&uLoadWeak_inner, weak);
    uAutoRelease(object);
    return object;
}
コード例 #4
0
ファイル: ObjectModel.cpp プロジェクト: brapastor/Fuse_Pract
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;
    }
}
コード例 #5
0
ファイル: Memory.cpp プロジェクト: blyk/BlackCode-Fuse
void uStoreStrong(uObject** address, uObject* object)
{
    uAutoRelease(*address);
    uRetain(*address = object);
}