Loading...
libkern/c++/OSSerialize.cpp xnu-3789.31.2 xnu-4903.231.4
--- xnu/xnu-3789.31.2/libkern/c++/OSSerialize.cpp
+++ xnu/xnu-4903.231.4/libkern/c++/OSSerialize.cpp
@@ -37,6 +37,7 @@
 #include <libkern/c++/OSLib.h>
 #include <libkern/c++/OSDictionary.h>
 #include <libkern/OSSerializeBinary.h>
+#include <libkern/Block.h>
 #include <IOKit/IOLib.h>
 
 #define super OSObject
@@ -290,6 +291,35 @@
     return( thing );
 }
 
+bool OSSerializer::callbackToBlock(void * target __unused, void * ref,
+                                     OSSerialize * serializer)
+{
+    return ((OSSerializerBlock)ref)(serializer);
+}
+
+OSSerializer * OSSerializer::withBlock(
+        OSSerializerBlock callback)
+{
+    OSSerializer * serializer;
+    OSSerializerBlock block;
+
+    block = Block_copy(callback);
+    if (!block) return (0);
+
+    serializer = (OSSerializer::forTarget(NULL, &OSSerializer::callbackToBlock, block));
+
+    if (!serializer) Block_release(block);
+
+    return (serializer);
+}
+
+void OSSerializer::free(void)
+{
+    if (callback == &callbackToBlock) Block_release(ref);
+
+    super::free();
+}
+
 bool OSSerializer::serialize( OSSerialize * s ) const
 {
     return( (*callback)(target, ref, s) );