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);
+    });
   });
 }