virtual void OnDraw(Xli::Window* wnd) { { uAutoReleasePool pool; if (::app::Uno::Application__get_Current(NULL) && ::app::Uno::Application__get_Current(NULL)->DrawNextFrame()) { ::app::Uno::Runtime::Implementation::Internal::Bootstrapper__OnDraw(NULL); _gl->SwapBuffers(); } } #if U_DEBUG_MEM >= 3 static int frame = 0; char path[32]; sprintf(path, "draw%d.dot", frame++); uDumpAllStrongRefs(path); #endif }
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(); } }