Zero initialize unused Block fields (#475)
* Zero init unused Block fields
* fmt
* Fix bug
diff --git a/lib/src/code_generator/objc_built_in_functions.dart b/lib/src/code_generator/objc_built_in_functions.dart
index 270cd18..d796763 100644
--- a/lib/src/code_generator/objc_built_in_functions.dart
+++ b/lib/src/code_generator/objc_built_in_functions.dart
@@ -156,7 +156,11 @@
$descPtr $name() {
final d = ${w.ffiPkgLibraryPrefix}.calloc.allocate<$descType>(
${w.ffiLibraryPrefix}.sizeOf<$descType>());
+ d.ref.reserved = 0;
d.ref.size = ${w.ffiLibraryPrefix}.sizeOf<$blockType>();
+ d.ref.copy_helper = ${w.ffiLibraryPrefix}.nullptr;
+ d.ref.dispose_helper = ${w.ffiLibraryPrefix}.nullptr;
+ d.ref.signature = ${w.ffiLibraryPrefix}.nullptr;
return d;
}
''';
@@ -181,6 +185,8 @@
final b = ${w.ffiPkgLibraryPrefix}.calloc.allocate<$blockType>(
${w.ffiLibraryPrefix}.sizeOf<$blockType>());
b.ref.isa = ${concreteGlobalBlock.name};
+ b.ref.flags = 0;
+ b.ref.reserved = 0;
b.ref.invoke = invoke;
b.ref.target = target;
b.ref.descriptor = ${blockDescSingleton.name};
diff --git a/test/native_objc_test/block_test.dart b/test/native_objc_test/block_test.dart
index 92e6fe7..76f7a93 100644
--- a/test/native_objc_test/block_test.dart
+++ b/test/native_objc_test/block_test.dart
@@ -95,6 +95,22 @@
doGC();
expect(BlockTester.getBlockRetainCount_(lib, rawBlock.cast()), 0);
});
+
+ test('Block fields have sensible values', () {
+ final block = ObjCBlock.fromFunction(lib, makeAdder(4000));
+ final blockPtr = block.pointer;
+ expect(blockPtr.ref.isa, isNot(0));
+ expect(blockPtr.ref.flags, isNot(0)); // Set by Block_copy.
+ expect(blockPtr.ref.reserved, 0);
+ expect(blockPtr.ref.invoke, isNot(0));
+ expect(blockPtr.ref.target, isNot(0));
+ final descPtr = blockPtr.ref.descriptor;
+ expect(descPtr.ref.reserved, 0);
+ expect(descPtr.ref.size, isNot(0));
+ expect(descPtr.ref.copy_helper, nullptr);
+ expect(descPtr.ref.dispose_helper, nullptr);
+ expect(descPtr.ref.signature, nullptr);
+ });
});
}