55
66namespace BinaryNinja
77{
8- public class TypeBuilder : AbstractSafeHandle < TypeBuilder >
8+ public partial class TypeBuilder : AbstractSafeHandle < TypeBuilder >
99 {
1010 internal TypeBuilder ( IntPtr handle , bool owner )
1111 : base ( handle , owner )
@@ -81,6 +81,7 @@ public static TypeBuilder CreateStructureType(Structure structure)
8181 /// </summary>
8282 /// <param name="builder">The structure builder to create a type builder from.</param>
8383 /// <returns>A new owned TypeBuilder for the structure type.</returns>
84+ /// <remarks>The core takes ownership and invalidates <paramref name="builder"/>.</remarks>
8485 public static TypeBuilder CreateStructureTypeWithBuilder ( StructureBuilder builder )
8586 {
8687 // 1. Validate the required builder parameter.
@@ -90,9 +91,13 @@ public static TypeBuilder CreateStructureTypeWithBuilder(StructureBuilder builde
9091 }
9192
9293 // 2. Create a structure type builder from the builder; the returned handle is owned.
93- return TypeBuilder . MustTakeHandle (
94- NativeMethods . BNCreateStructureTypeBuilderWithBuilder ( builder . DangerousGetHandle ( ) )
95- ) ;
94+ IntPtr handle = NativeMethods . BNCreateStructureTypeBuilderWithBuilder (
95+ builder . DangerousGetHandle ( )
96+ ) ;
97+ TypeBuilder result = TypeBuilder . MustTakeHandle ( handle ) ;
98+ builder . TransferOwnershipToCore ( ) ;
99+
100+ return result ;
96101 }
97102
98103 /// <summary>
@@ -713,6 +718,7 @@ public void SetIntegerTypeDisplayType(IntegerDisplayType displayType)
713718 /// <param name="width">The width of the enumeration type in bytes.</param>
714719 /// <param name="isSigned">The signedness with confidence.</param>
715720 /// <returns>A new owned TypeBuilder for the enumeration type.</returns>
721+ /// <remarks>The core takes ownership and invalidates <paramref name="builder"/>.</remarks>
716722 public static unsafe TypeBuilder CreateEnumerationTypeWithBuilder (
717723 Architecture arch ,
718724 EnumerationBuilder builder ,
@@ -735,14 +741,16 @@ BoolWithConfidence isSigned
735741 BNBoolWithConfidence nativeSigned = isSigned . ToNative ( ) ;
736742
737743 // 3. Create an enumeration type builder from the builder; the returned handle is owned.
738- return TypeBuilder . MustTakeHandle (
739- NativeMethods . BNCreateEnumerationTypeBuilderWithBuilder (
744+ IntPtr handle = NativeMethods . BNCreateEnumerationTypeBuilderWithBuilder (
740745 arch . DangerousGetHandle ( ) ,
741746 builder . DangerousGetHandle ( ) ,
742747 width ,
743748 ( IntPtr ) ( & nativeSigned )
744- )
745- ) ;
749+ ) ;
750+ TypeBuilder result = TypeBuilder . MustTakeHandle ( handle ) ;
751+ builder . TransferOwnershipToCore ( ) ;
752+
753+ return result ;
746754 }
747755
748756 /// <summary>
@@ -815,6 +823,7 @@ BinaryNinja.Type type
815823 /// <param name="cnst">The const qualifier with confidence.</param>
816824 /// <param name="vltl">The volatile qualifier with confidence.</param>
817825 /// <returns>A new owned TypeBuilder for the named type reference.</returns>
826+ /// <remarks>The core takes ownership and invalidates <paramref name="builder"/>.</remarks>
818827 public static unsafe TypeBuilder CreateNamedTypeReferenceBuilderWithBuilder (
819828 NamedTypeReferenceBuilder builder ,
820829 ulong width ,
@@ -834,15 +843,18 @@ BoolWithConfidence vltl
834843 BNBoolWithConfidence nativeVltl = vltl . ToNative ( ) ;
835844
836845 // 3. Create the builder; the returned handle is owned.
837- return TypeBuilder . MustTakeHandle (
846+ IntPtr handle =
838847 NativeMethods . BNCreateNamedTypeReferenceBuilderWithBuilder (
839848 builder . DangerousGetHandle ( ) ,
840849 width ,
841850 align ,
842851 ( IntPtr ) ( & nativeCnst ) ,
843852 ( IntPtr ) ( & nativeVltl )
844- )
845- ) ;
853+ ) ;
854+ TypeBuilder result = TypeBuilder . MustTakeHandle ( handle ) ;
855+ builder . TransferOwnershipToCore ( ) ;
856+
857+ return result ;
846858 }
847859
848860 /// <summary>
0 commit comments