diff --git a/docs/docs/hybrid-objects.md b/docs/docs/hybrid-objects.md index 16c2123e6..a99fa2e31 100644 --- a/docs/docs/hybrid-objects.md +++ b/docs/docs/hybrid-objects.md @@ -325,7 +325,7 @@ class HybridImage : HybridImageSpec { private var cgImage: CGImage public var memorySize: Int { let imageSize = cgImage.width * cgImage.height * cgImage.bytesPerPixel - return getSizeOf(self) + imageSize + return imageSize } } ``` diff --git a/docs/docs/performance-tips.md b/docs/docs/performance-tips.md index 174dae08f..454b07405 100644 --- a/docs/docs/performance-tips.md +++ b/docs/docs/performance-tips.md @@ -224,7 +224,7 @@ class HybridImage : HybridImageSpec { private var cgImage: CGImage public var memorySize: Int { let imageSize = cgImage.width * cgImage.height * cgImage.bytesPerPixel - return getSizeOf(self) + imageSize + return imageSize } } ``` diff --git a/packages/nitrogen/src/syntax/swift/SwiftHybridObject.ts b/packages/nitrogen/src/syntax/swift/SwiftHybridObject.ts index f23a565a4..303ff5580 100644 --- a/packages/nitrogen/src/syntax/swift/SwiftHybridObject.ts +++ b/packages/nitrogen/src/syntax/swift/SwiftHybridObject.ts @@ -42,7 +42,7 @@ public ${hasBaseClass ? 'override func' : 'func'} getCxxWrapper() -> ${name.Hybr if (!hasBaseClass) { // It doesn't have a base class - implement the `HybridObjectSpec` base protocol classBaseClasses.push('HybridObjectSpec') - baseMembers.push(`public var memorySize: Int { return getSizeOf(self) }`) + baseMembers.push(`public var memorySize: Int { return 0 }`) } const protocolCode = ` diff --git a/packages/nitrogen/src/syntax/swift/SwiftHybridObjectBridge.ts b/packages/nitrogen/src/syntax/swift/SwiftHybridObjectBridge.ts index f40fa7244..2e6380d04 100644 --- a/packages/nitrogen/src/syntax/swift/SwiftHybridObjectBridge.ts +++ b/packages/nitrogen/src/syntax/swift/SwiftHybridObjectBridge.ts @@ -177,7 +177,7 @@ ${hasBase ? `public class ${name.HybridTSpecCxx} : ${baseClasses.join(', ')}` : */ @inline(__always) public ${hasBase ? 'override var' : 'var'} memorySize: Int { - return self.__implementation.memorySize + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize } // Properties diff --git a/packages/react-native-nitro-image/ios/HybridImage.swift b/packages/react-native-nitro-image/ios/HybridImage.swift index 06d0d376b..4307de5b7 100644 --- a/packages/react-native-nitro-image/ios/HybridImage.swift +++ b/packages/react-native-nitro-image/ios/HybridImage.swift @@ -26,7 +26,7 @@ class HybridImage : HybridImageSpec { * can efficiently garbage collect it when needed. */ public override var memorySize: Int { - return getSizeOf(self) + uiImage.memorySize + return uiImage.memorySize } /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridBaseSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridBaseSpec.swift index a31ceb66f..175893d76 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridBaseSpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridBaseSpec.swift @@ -34,7 +34,7 @@ public class HybridBaseSpec_base: HybridObjectSpec { return cxxWrapper } } - public var memorySize: Int { return getSizeOf(self) } + public var memorySize: Int { return 0 } } /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridBaseSpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridBaseSpec_cxx.swift index 949f6a9dd..a20f0abbd 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridBaseSpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridBaseSpec_cxx.swift @@ -93,7 +93,7 @@ public class HybridBaseSpec_cxx { */ @inline(__always) public var memorySize: Int { - return self.__implementation.memorySize + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize } // Properties diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridChildSpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridChildSpec_cxx.swift index fe29c2bdb..9bca86f23 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridChildSpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridChildSpec_cxx.swift @@ -96,7 +96,7 @@ public class HybridChildSpec_cxx : HybridBaseSpec_cxx { */ @inline(__always) public override var memorySize: Int { - return self.__implementation.memorySize + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize } // Properties diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec.swift index 554d16f1f..b1cc51340 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec.swift @@ -37,7 +37,7 @@ public class HybridImageFactorySpec_base: HybridObjectSpec { return cxxWrapper } } - public var memorySize: Int { return getSizeOf(self) } + public var memorySize: Int { return 0 } } /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec_cxx.swift index b79114189..88d081ad9 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageFactorySpec_cxx.swift @@ -93,7 +93,7 @@ public class HybridImageFactorySpec_cxx { */ @inline(__always) public var memorySize: Int { - return self.__implementation.memorySize + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize } // Properties diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec.swift index 978ba1b50..19861448a 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec.swift @@ -37,7 +37,7 @@ public class HybridImageSpec_base: HybridObjectSpec { return cxxWrapper } } - public var memorySize: Int { return getSizeOf(self) } + public var memorySize: Int { return 0 } } /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec_cxx.swift index aa33c6bb9..83d122d8d 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridImageSpec_cxx.swift @@ -93,7 +93,7 @@ public class HybridImageSpec_cxx { */ @inline(__always) public var memorySize: Int { - return self.__implementation.memorySize + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize } // Properties diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift index 0b086eef2..786b2d89c 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec.swift @@ -88,7 +88,7 @@ public class HybridTestObjectSwiftKotlinSpec_base: HybridObjectSpec { return cxxWrapper } } - public var memorySize: Int { return getSizeOf(self) } + public var memorySize: Int { return 0 } } /** diff --git a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift index 7f2a597bb..6155ce89c 100644 --- a/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift +++ b/packages/react-native-nitro-image/nitrogen/generated/ios/swift/HybridTestObjectSwiftKotlinSpec_cxx.swift @@ -93,7 +93,7 @@ public class HybridTestObjectSwiftKotlinSpec_cxx { */ @inline(__always) public var memorySize: Int { - return self.__implementation.memorySize + return MemoryHelper.getSizeOf(self.__implementation) + self.__implementation.memorySize } // Properties diff --git a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/HybridObject.kt b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/HybridObject.kt index 178fce47b..c2ed42131 100644 --- a/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/HybridObject.kt +++ b/packages/react-native-nitro-modules/android/src/main/java/com/margelo/nitro/core/HybridObject.kt @@ -26,7 +26,7 @@ abstract class HybridObject: ExtendableHybridClass { * val memorySize: ULong * get() { * val imageSize = this.bitmap.bytesPerRow * this.bitmap.height - * return getSizeOf(this) + imageSize + * return imageSize * } * ``` */ diff --git a/packages/react-native-nitro-modules/ios/core/HybridObjectSpec.swift b/packages/react-native-nitro-modules/ios/core/HybridObjectSpec.swift index f0f2f5af3..5f3b3a75a 100644 --- a/packages/react-native-nitro-modules/ios/core/HybridObjectSpec.swift +++ b/packages/react-native-nitro-modules/ios/core/HybridObjectSpec.swift @@ -22,7 +22,7 @@ public protocol HybridObjectSpec: AnyObject { * ```swift * var memorySize: Int { * let imageSize = self.uiImage.bytesPerRow * self.uiImage.height - * return getSizeOf(self) + imageSize + * return imageSize * } * ``` */ @@ -30,12 +30,8 @@ public protocol HybridObjectSpec: AnyObject { } public extension HybridObjectSpec { - /** - * Get the memory size of the given instance. - * This only accounts for stack allocated member variables, - * not for externally allocated heap allocations like images or buffers. - */ + @available(*, deprecated, message: "getSizeOf(...) will now be default-computed. Please remove getSizeOf() from your code.") func getSizeOf(_ instance: T) -> Int { - return malloc_size(Unmanaged.passUnretained(instance).toOpaque()) + return 0 } } diff --git a/packages/react-native-nitro-modules/ios/utils/MemoryHelper.swift b/packages/react-native-nitro-modules/ios/utils/MemoryHelper.swift new file mode 100644 index 000000000..6013b529a --- /dev/null +++ b/packages/react-native-nitro-modules/ios/utils/MemoryHelper.swift @@ -0,0 +1,21 @@ +// +// MemoryHelper.swift +// NitroModules +// +// Created by Marc Rousavy on 17.12.2024. +// + +import Foundation + +public final class MemoryHelper { + /** + * Get the amount of memory that was allocated using a `malloc`-like allocator + * for the given instance, in bytes. + * When allocating resources differently (e.g. GPU buffers, or `UIImage`) you + * should add their byte sizes to the result of this function to get an object's + * total memory footprint. + */ + public static func getSizeOf(_ instance: AnyObject) -> Int { + return malloc_size(Unmanaged.passUnretained(instance).toOpaque()) + } +}