예제 #1
0
static void uDumpObjectAndStrongRefs(FILE *fp, uObject *obj)
{
    uType *type = obj->GetType();

    uDumpObject(fp, obj, type->TypeName);

    switch (type->TypeType)
    {
    case uTypeTypeClass:
        do
        {
	    uDumpStrongRefs(fp, obj, obj, type);
            type = type->BaseType;
        } while (type);
	    break;

    case uTypeTypeEnum:
        break;

    case uTypeTypeStruct:
    {
        uByte* valueAddr = (uByte*)obj + sizeof(uObject);
        uDumpStrongRefs(fp, obj, valueAddr, type);
	    break;
    }

    case uTypeTypeDelegate:
    {
        uDelegate *delegate = (uDelegate*)obj;
        uDumpStrongRef(fp, obj, delegate->_obj);
        uDumpStrongRef(fp, obj, delegate->_prev);
        break;
    }

    case uTypeTypeArray:
    {
        uArray *array = (uArray *)obj;
        uArrayType *arrayType = (uArrayType *)type;
        uType *elmType = arrayType->ElementType;

        switch (elmType->TypeType)
        {
            case uTypeTypeClass:
            case uTypeTypeInterface:
            case uTypeTypeDelegate:
            case uTypeTypeArray:
            {
	        for (int i = 0; i < array->_len; ++i)
		{
		    uObject *target = ((uObject **)array->_ptr)[i];
                    uDumpStrongRef(fp, obj, target);
		}
            }
            break;

            case uTypeTypeEnum:
                break;
            case uTypeTypeStruct:
            {
                for (int i = 0; i < array->_len; ++i)
                {
                    uByte *valueAddr = (uByte *)array->_ptr + i * elmType->ValueSize;
                    uDumpStrongRefs(fp, obj, valueAddr, elmType);
                }
            }
            break;

            default:
                uFatalError(XLI_FUNCTION);
            }
        }
        break;

    default:
        uFatalError(XLI_FUNCTION);
    }
}
예제 #2
0
static void uDumpObjectAndStrongRefs(FILE* fp, uObject* object)
{
    uType* type = object->GetType();
    uDumpObject(fp, object, type->FullName);

    switch (type->Type)
    {
    case uTypeTypeClass:
        do
            uDumpAllStrongRefs(fp, object, object, type);
        while ((type = type->Base));
        break;

    case uTypeTypeEnum:
        break;

    case uTypeTypeStruct:
    {
        uint8_t* address = (uint8_t*)object + sizeof(uObject);
        uDumpAllStrongRefs(fp, object, address, type);
        break;
    }
    case uTypeTypeDelegate:
    {
        uDelegate* delegate = (uDelegate*)object;
        uDumpStrongRef(fp, object, delegate->_object);
        uDumpStrongRef(fp, object, delegate->_prev);
        break;
    }
    case uTypeTypeArray:
    {
        uArray* array = (uArray*)object;
        uArrayType* arrayType = (uArrayType*)type;
        uType* elmType = arrayType->ElementType;

        switch (elmType->Type)
        {
        case uTypeTypeClass:
        case uTypeTypeInterface:
        case uTypeTypeDelegate:
        case uTypeTypeArray:
            for (int i = 0; i < array->Length(); ++i)
            {
                uObject* target = ((uObject**)array->Ptr())[i];
                uDumpStrongRef(fp, object, target);
            }
            break;

        case uTypeTypeEnum:
            break;

        case uTypeTypeStruct:
            for (int i = 0; i < array->Length(); ++i)
            {
                uint8_t* address = (uint8_t*)array->Ptr() + i * elmType->ValueSize;
                uDumpAllStrongRefs(fp, object, address, elmType);
            }
            break;

        default:
            U_FATAL();
        }
        break;
    }

    default:
        U_FATAL();
    }
}