]> git.saurik.com Git - apple/xnu.git/blobdiff - libkdd/tests/Tests.swift
xnu-4570.20.62.tar.gz
[apple/xnu.git] / libkdd / tests / Tests.swift
index ec88ed21f97bd1b656c45988ee8b533a54039eea..cd7f46ea060194439d7bcb3edfc1ce9f34c3a95b 100644 (file)
@@ -20,61 +20,60 @@ import Foundation
 
 // Swift's bridging to uuid_t is awkward.
 
-func nsuuid2uuid_t(nsuuid : NSUUID) -> uuid_t {
+func nsuuid2uuid_t(nsuuid : NSUUID) -> uuid_t {
     let dat = nsuuid2array(nsuuid)
     return nsarray2uuid(dat)
 }
 
-func nsarray2uuid(x : AnyObject) -> uuid_t {
-    let a = x as! NSArray
-    return uuid_t(UInt8(a[0] as! Int),
-                  UInt8(a[1] as! Int),
-                  UInt8(a[2] as! Int),
-                  UInt8(a[3] as! Int),
-                  UInt8(a[4] as! Int),
-                  UInt8(a[5] as! Int),
-                  UInt8(a[6] as! Int),
-                  UInt8(a[7] as! Int),
-                  UInt8(a[8] as! Int),
-                  UInt8(a[9] as! Int),
-                  UInt8(a[10] as! Int),
-                  UInt8(a[11] as! Int),
-                  UInt8(a[12] as! Int),
-                  UInt8(a[13] as! Int),
-                  UInt8(a[14] as! Int),
-                  UInt8(a[15] as! Int))
+func nsarray2uuid(_ a : [Int]) -> uuid_t {
+    return uuid_t(UInt8(a[0]),
+                  UInt8(a[1]),
+                  UInt8(a[2]),
+                  UInt8(a[3]),
+                  UInt8(a[4]),
+                  UInt8(a[5]),
+                  UInt8(a[6]),
+                  UInt8(a[7]),
+                  UInt8(a[8]),
+                  UInt8(a[9]),
+                  UInt8(a[10]),
+                  UInt8(a[11]),
+                  UInt8(a[12]),
+                  UInt8(a[13]),
+                  UInt8(a[14]),
+                  UInt8(a[15]))
 }
 
-func nsuuid2array(uuid : NSUUID) -> [Int] {
+func nsuuid2array(_ uuid: NSUUID) -> [Int] {
     var ret = [Int]()
-    let ptr = UnsafeMutablePointer<UInt8>.alloc(16)
+    let ptr = UnsafeMutablePointer<UInt8>.allocate(capacity: 16)
     
-    defer { ptr.dealloc(16) }
+    defer { ptr.deallocate(capacity:16) }
 
-    uuid.getUUIDBytes(ptr)
+    uuid.getBytes(ptr)
     for i in 0..<16 {
         ret.append(Int(ptr[i]))
     }
     return ret
 }
 
-func decompress(data:NSData) throws -> NSData {
+func decompress(data:NSData) throws -> NSData {
     var stream = z_stream(next_in: nil, avail_in: 0, total_in: 0, next_out: nil, avail_out: 0, total_out: 0, msg: nil, state: nil, zalloc: nil, zfree: nil, opaque: nil, data_type: 0, adler: 0, reserved: 0)
 
     let bufsize : Int = 1000
-    let buffer = UnsafeMutablePointer<UInt8>.alloc(bufsize)
-    defer { buffer.dealloc(bufsize) }
+    let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: bufsize)
+    defer { buffer.deallocate(capacity:bufsize) }
     let output = NSMutableData()
     stream.next_out = buffer
     stream.avail_out = UInt32(bufsize)
-    stream.next_in = UnsafeMutablePointer(data.bytes)
+    stream.next_in = UnsafeMutablePointer(mutating:data.bytes.assumingMemoryBound(to:Bytef.self))
     stream.avail_in = UInt32(data.length)
-    inflateInit2_(&stream, 16+MAX_WBITS, ZLIB_VERSION, Int32(sizeof(z_stream)))
+    inflateInit2_(&stream, 16+MAX_WBITS, ZLIB_VERSION, Int32(MemoryLayout<z_stream>.size))
 
     while (true) {
         let z = inflate(&stream, Z_NO_FLUSH);
         if (z == Z_OK || z == Z_STREAM_END) {
-            output.appendBytes(buffer, length: bufsize - Int(stream.avail_out))
+            output.append(buffer, length: bufsize - Int(stream.avail_out))
             stream.avail_out = UInt32(bufsize)
             stream.next_out = buffer
             if (z == Z_STREAM_END) {
@@ -87,6 +86,12 @@ func decompress(data:NSData) throws -> NSData {
 }
 
 
+extension Dictionary {
+    func value(forKeyPath s:String) -> Any? {
+        return (self as NSDictionary).value(forKeyPath:s)
+    }
+}
+
 
 class Tests: XCTestCase {
     
@@ -100,9 +105,9 @@ class Tests: XCTestCase {
         super.tearDown()
     }
     
-    func parseBuffer(buffer:NSData) throws -> NSDictionary {
+    func parseBuffer(_ buffer:NSData) throws -> [AnyHashable:Any] {
         var error : NSError?
-        guard let dict = parseKCDataBuffer(UnsafeMutablePointer(buffer.bytes), UInt32(buffer.length), &error)
+        guard let dict = parseKCDataBuffer(UnsafeMutablePointer(mutating:buffer.bytes.assumingMemoryBound(to:UInt8.self)), UInt32(buffer.length), &error)
         else {
                 XCTAssert(error != nil)
                 throw error!
@@ -110,7 +115,7 @@ class Tests: XCTestCase {
         return dict
     }
 
-    func testPaddingFlags(pad : Int) {
+    func testPaddingFlags(pad : Int) {
         let buffer = NSMutableData(capacity:1000)!
 
         var item = kcdata_item()
@@ -118,22 +123,22 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_LIBRARY_LOADINFO)
         item.flags = UInt64(pad)
-        item.size = UInt32(sizeof(dyld_uuid_info_32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<dyld_uuid_info_32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
-        let uuid = NSUUID(UUIDString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
+        let uuid = NSUUID(uuidString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
 
         var payload = dyld_uuid_info_32(imageLoadAddress: 42, imageUUID: nsuuid2uuid_t(uuid))
-        buffer.appendBytes(&payload, length:sizeof(dyld_uuid_info_32))
+        buffer.append(&payload, length:MemoryLayout<dyld_uuid_info_32>.size)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
             else { XCTFail(); return; }
@@ -143,8 +148,8 @@ class Tests: XCTestCase {
             uuidarray.removeLast()
         }
 
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageLoadAddress"] == 42)
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageUUID"] == uuidarray)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageLoadAddress") as? Int == 42)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageUUID") as! [Int] == uuidarray)
     }
 
     func testPaddingFlags() {
@@ -152,7 +157,6 @@ class Tests: XCTestCase {
             testPaddingFlags(i)
         }
     }
-
     func testBootArgs() {
         let s = "hello, I am some boot args"
 
@@ -163,23 +167,22 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(STACKSHOT_KCTYPE_BOOTARGS)
         item.flags = 0
         item.size = UInt32(s.utf8.count + 1)
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-        s.nulTerminatedUTF8.withUnsafeBufferPointer({
-            buffer.appendBytes($0.baseAddress, length:s.utf8.count + 1)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+        s.utf8CString.withUnsafeBufferPointer({
+            buffer.append($0.baseAddress!, length:s.utf8.count + 1)
         })
-
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer) else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["boot_args"] == s)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.boot_args") as? String == s)
     }
 
     func testBootArgsMissingNul() {
@@ -192,20 +195,20 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(STACKSHOT_KCTYPE_BOOTARGS)
         item.flags = 0
         item.size = UInt32(s.utf8.count)
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-        s.nulTerminatedUTF8.withUnsafeBufferPointer({
-            buffer.appendBytes($0.baseAddress, length:s.utf8.count)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+        s.utf8CString.withUnsafeBufferPointer({
+            buffer.append($0.baseAddress!, length:s.utf8.count)
         })
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
@@ -218,28 +221,28 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_LIBRARY_LOADINFO)
         item.flags = 0
-        item.size = UInt32(sizeof(dyld_uuid_info_32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<dyld_uuid_info_32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
-        let uuid = NSUUID(UUIDString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
+        let uuid = NSUUID(uuidString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
 
         var payload = dyld_uuid_info_32(imageLoadAddress: 42, imageUUID: nsuuid2uuid_t(uuid))
-        buffer.appendBytes(&payload, length:sizeof(dyld_uuid_info_32))
+        buffer.append(&payload, length:MemoryLayout<dyld_uuid_info_32>.size)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
 
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageLoadAddress"] == 42)
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageUUID"] == nsuuid2array(uuid))
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageLoadAddress") as? Int == 42)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageUUID") as! [Int] == nsuuid2array(uuid))
     }
 
     func testLoadInfoWrongSize() {
@@ -252,29 +255,29 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_LIBRARY_LOADINFO)
         item.flags = 0
-        item.size = UInt32(sizeof(dyld_uuid_info_32)) - 1
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<dyld_uuid_info_32>.size) - 1
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
-        let uuid = NSUUID(UUIDString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
+        let uuid = NSUUID(uuidString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
 
         var payload = dyld_uuid_info_32(imageLoadAddress: 42, imageUUID: nsuuid2uuid_t(uuid))
-        buffer.appendBytes(&payload, length:sizeof(dyld_uuid_info_32) - 1)
+        buffer.append(&payload, length:MemoryLayout<dyld_uuid_info_32>.size - 1)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageLoadAddress"] == 42)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageLoadAddress") as? Int == 42)
         var uuidarray = nsuuid2array(uuid)
         uuidarray.removeLast()
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageUUID"] == uuidarray)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageUUID") as! [Int] == uuidarray)
     }
 
     func testLoadInfoWayWrongSize() {
@@ -287,27 +290,26 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_LIBRARY_LOADINFO)
         item.flags = 0
-        item.size = UInt32(sizeof(dyld_uuid_info_32)) - 16
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<dyld_uuid_info_32>.size) - 16
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
-        let uuid = NSUUID(UUIDString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
+        let uuid = NSUUID(uuidString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
 
         var payload = dyld_uuid_info_32(imageLoadAddress: 42, imageUUID: nsuuid2uuid_t(uuid))
-        buffer.appendBytes(&payload, length:sizeof(dyld_uuid_info_32) - 16)
+        buffer.append(&payload, length:MemoryLayout<dyld_uuid_info_32>.size - 16)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageLoadAddress"] == 42)
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageUUID"] == nil)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageLoadAddress") as? Int == 42)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageUUID") == nil)
     }
 
     func testLoadInfoPreposterousWrongSize() {
@@ -320,25 +322,25 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_LIBRARY_LOADINFO)
         item.flags = 0
         item.size = UInt32(1)
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         var payload = UInt8(42)
-        buffer.appendBytes(&payload, length:1)
+        buffer.append(&payload, length:1)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageLoadAddress"] == nil)
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??["imageUUID"] == nil)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageLoadAddress") == nil)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info.imageUUID") == nil)
     }
 
 
@@ -349,43 +351,43 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_ARRAY_PAD0) + UInt32(pad)
         item.flags = UInt64(STACKSHOT_KCTYPE_DONATING_PIDS) << 32 | UInt64(n)
-        item.size = UInt32(n * sizeof(UInt32) + pad)
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * MemoryLayout<UInt32>.size + pad)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         for i in 0..<n {
             var payload = UInt32(42 * i)
-            buffer.appendBytes(&payload, length:sizeof(UInt32))
+            buffer.append(&payload, length:MemoryLayout<UInt32>.size)
         }
 
         for i in 0..<pad {
             var payload = UInt8(42-i)
-            buffer.appendBytes(&payload, length:sizeof(UInt8))
+            buffer.append(&payload, length:MemoryLayout<UInt8>.size)
         }
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["donating_pids"]??.count == n)
+        XCTAssert((dict.value(forKeyPath:"kcdata_crashinfo.donating_pids") as! [Any]).count == n)
         for i in 0..<n {
             let x = dict["kcdata_crashinfo"] as? NSDictionary
             let y = x?["donating_pids"] as? NSArray
-            XCTAssert((y?[i]) as? NSObject == 42 * i)
+            XCTAssert((y?[i]) as? Int == 42 * i)
         }
     }
 
     func testNewArrays() {
-        self.testNewArray(0,pad:0)
+        self.testNewArray(n:0,pad:0)
         for i in 1..<20 {
             for pad in 0..<16 {
-                self.testNewArray(i, pad:pad)
+                self.testNewArray(n:i, pad:pad)
             }
         }
     }
@@ -398,39 +400,43 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_ARRAY_PAD0)
         item.flags = UInt64(KCDATA_TYPE_LIBRARY_LOADINFO) << 32 | UInt64(n)
-        item.size = UInt32(n * sizeof(dyld_uuid_info_32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * MemoryLayout<dyld_uuid_info_32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
-        let uuid = NSUUID(UUIDString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
+        let uuid = NSUUID(uuidString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
 
 
         for i in 0..<n {
             var payload = dyld_uuid_info_32(imageLoadAddress:UInt32(i+42), imageUUID: nsuuid2uuid_t(uuid))
 
-            buffer.appendBytes(&payload, length:sizeof(dyld_uuid_info_32))
+            buffer.append(&payload, length:MemoryLayout<dyld_uuid_info_32>.size)
         }
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??.count == n)
+        XCTAssert((dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info") as! [Any]).count == n)
         for i in 0..<n {
-            XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??[i]?["imageLoadAddress"] == 42+i)
-            XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??[i]?["imageUUID"] == nsuuid2array(uuid))
+            guard let loadinfo = dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info") as? [Any]
+                else { XCTFail(); return; }
+            guard let loadinfo_i = loadinfo[i] as? [AnyHashable:Any]
+                else { XCTFail(); return; }
+            XCTAssert(loadinfo_i["imageLoadAddress"] as? Int == 42 + i)
+            XCTAssert(loadinfo_i["imageUUID"] as! [Int] == nsuuid2array(uuid))
         }
     }
 
     func testArrayLoadInfo() {
         for n in 0..<20 {
-            testArrayLoadInfo(n)
+            testArrayLoadInfo(n: n)
         }
     }
 
@@ -445,35 +451,39 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_ARRAY_PAD0)
         item.flags = UInt64(KCDATA_TYPE_LIBRARY_LOADINFO) << 32 | UInt64(n)
-        item.size = UInt32(n * (sizeof(dyld_uuid_info_32) - wrong))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * (MemoryLayout<dyld_uuid_info_32>.size - wrong))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
-        let uuid = NSUUID(UUIDString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
+        let uuid = NSUUID(uuidString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
 
         for i in 0..<n {
             var payload = dyld_uuid_info_32(imageLoadAddress:UInt32(i+42), imageUUID: nsuuid2uuid_t(uuid))
-            buffer.appendBytes(&payload, length:sizeof(dyld_uuid_info_32)-wrong)
+            buffer.append(&payload, length:MemoryLayout<dyld_uuid_info_32>.size-wrong)
         }
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         var uuidarray = nsuuid2array(uuid)
         uuidarray.removeLast()
 
         guard let dict = try? self.parseBuffer(buffer)
-        else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??.count == n)
+            else { XCTFail(); return; }
+        XCTAssert((dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info") as! [Any]).count == n)
         for i in 0..<n {
-            XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??[i]?["imageLoadAddress"] == 42+i)
-            XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??[i]?["imageUUID"] == uuidarray)
+            guard let loadinfo = dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info") as? [Any]
+                else { XCTFail(); return; }
+            guard let loadinfo_i = loadinfo[i] as? [AnyHashable:Any]
+                else { XCTFail(); return; }
+            XCTAssert(loadinfo_i["imageLoadAddress"] as? Int == 42 + i)
+            XCTAssert(loadinfo_i["imageUUID"] as! [Int] == uuidarray)
         }
+
     }
 
 
@@ -488,31 +498,36 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_ARRAY_PAD0)
         item.flags = UInt64(KCDATA_TYPE_LIBRARY_LOADINFO) << 32 | UInt64(n)
-        item.size = UInt32(n * (sizeof(dyld_uuid_info_32) - wrong))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * (MemoryLayout<dyld_uuid_info_32>.size - wrong))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
-        let uuid = NSUUID(UUIDString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
+        let uuid = NSUUID(uuidString: "de305d54-75b4-431b-adb2-eb6b9e546014")!
 
         for i in 0..<n {
             var payload = dyld_uuid_info_32(imageLoadAddress:UInt32(i+42), imageUUID: nsuuid2uuid_t(uuid))
-            buffer.appendBytes(&payload, length:sizeof(dyld_uuid_info_32)-wrong)
+            buffer.append(&payload, length:MemoryLayout<dyld_uuid_info_32>.size-wrong)
         }
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+
 
         guard let dict = try? self.parseBuffer(buffer)
-        else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??.count == n)
+            else { XCTFail(); return; }
+        XCTAssert((dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info") as! [Any]).count == n)
         for i in 0..<n {
-            XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??[i]?["imageLoadAddress"] == 42+i)
-            XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??[i]?["imageUUID"] == nil)
+            guard let loadinfo = dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info") as? [Any]
+                else { XCTFail(); return; }
+            guard let loadinfo_i = loadinfo[i] as? [AnyHashable:Any]
+                else { XCTFail(); return; }
+            XCTAssert(loadinfo_i["imageLoadAddress"] as? Int == 42 + i)
+            XCTAssert(loadinfo_i["imageUUID"] == nil)
         }
     }
 
@@ -527,29 +542,34 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_ARRAY_PAD0)
         item.flags = UInt64(KCDATA_TYPE_LIBRARY_LOADINFO) << 32 | UInt64(n)
-        item.size = UInt32(n * (sizeof(dyld_uuid_info_32) - wrong))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * (MemoryLayout<dyld_uuid_info_32>.size - wrong))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         for i in 0..<n {
             var payload = UInt8(42*i)
-            buffer.appendBytes(&payload, length:1)
+            buffer.append(&payload, length:1)
         }
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+
 
         guard let dict = try? self.parseBuffer(buffer)
-        else { XCTFail(); return; }
-        XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??.count == n)
+            else { XCTFail(); return; }
+        XCTAssert((dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info") as! [Any]).count == n)
         for i in 0..<n {
-            XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??[i]?["imageLoadAddress"] == nil)
-            XCTAssert(dict["kcdata_crashinfo"]?["dyld_load_info"]??[i]?["imageUUID"] == nil)
+            guard let loadinfo = dict.value(forKeyPath:"kcdata_crashinfo.dyld_load_info") as? [Any]
+                else { XCTFail(); return; }
+            guard let loadinfo_i = loadinfo[i] as? [AnyHashable:Any]
+                else { XCTFail(); return; }
+            XCTAssert(loadinfo_i["imageLoadAddress"] == nil)
+            XCTAssert(loadinfo_i["imageUUID"] == nil)
         }
     }
 
@@ -562,43 +582,43 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         var payload : UInt64 = 42
-        buffer.appendBytes(&payload, length:sizeof(UInt64))
+        buffer.append(&payload, length:MemoryLayout<UInt64>.size)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         let buffer2 = NSMutableData(capacity:1000)!
 
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer2.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer2.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_NESTED_KCDATA)
         item.flags = 0
         item.size = UInt32(buffer.length)
-        buffer2.appendBytes(&item, length: sizeof(kcdata_item))
-        buffer2.appendData(buffer)
+        buffer2.append(&item, length: MemoryLayout<kcdata_item>.size)
+        buffer2.append(buffer as Data)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer2.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer2.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict2 = try? self.parseBuffer(buffer2)
             else { XCTFail(); return; }
 
-        XCTAssert(dict2["kcdata_crashinfo"]?["kcdata_crashinfo"]??["crashed_threadid"] == 42)
+        XCTAssert(dict2.value(forKeyPath:"kcdata_crashinfo.kcdata_crashinfo.crashed_threadid") as? Int == 42)
     }
 
 
@@ -610,27 +630,27 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         var payload : UInt64 = 42
-        buffer.appendBytes(&payload, length:sizeof(UInt64))
+        buffer.append(&payload, length:MemoryLayout<UInt64>.size)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
 
-        XCTAssert(dict["kcdata_crashinfo"]!["crashed_threadid"] == 42)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.crashed_threadid") as? Int == 42)
     }
-    
+
 
     func testRepeatedKey() {
         // test a repeated item of the same key causes error
@@ -642,28 +662,28 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         var payload : UInt64 = 42
-        buffer.appendBytes(&payload, length:sizeof(UInt64))
+        buffer.append(&payload, length:MemoryLayout<UInt64>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         payload = 42
-        buffer.appendBytes(&payload, length:sizeof(UInt64))
+        buffer.append(&payload, length:MemoryLayout<UInt64>.size)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
@@ -679,40 +699,39 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_CONTAINER_BEGIN)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload32 = UInt32(STACKSHOT_KCCONTAINER_TASK)
-        buffer.appendBytes(&payload32, length:sizeof(UInt32))
+        buffer.append(&payload32, length:MemoryLayout<UInt32>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload64 = 42
-        buffer.appendBytes(&payload64, length:sizeof(UInt64))
+        buffer.append(&payload64, length:MemoryLayout<UInt64>.size)
 
         item.type = UInt32(KCDATA_TYPE_CONTAINER_END)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload32 = UInt32(STACKSHOT_KCCONTAINER_TASK)
-        buffer.appendBytes(&payload32, length:sizeof(UInt32))
+        buffer.append(&payload32, length:MemoryLayout<UInt32>.size)
 
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
-        else { XCTFail(); return; }
-
-        XCTAssert(dict["kcdata_crashinfo"]?["task_snapshots"]??["0"]??["crashed_threadid"] == 42)
+            else { XCTFail(); return; }
 
+        XCTAssert(dict.value(forKeyPath: "kcdata_crashinfo.task_snapshots.0.crashed_threadid")  as? Int == 42)
     }
 
     func testRepeatedContainer() {
@@ -727,55 +746,55 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_CONTAINER_BEGIN)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload32 = UInt32(STACKSHOT_KCCONTAINER_TASK)
-        buffer.appendBytes(&payload32, length:sizeof(UInt32))
+        buffer.append(&payload32, length:MemoryLayout<UInt32>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload64 = 42
-        buffer.appendBytes(&payload64, length:sizeof(UInt64))
+        buffer.append(&payload64, length:MemoryLayout<UInt64>.size)
 
         item.type = UInt32(KCDATA_TYPE_CONTAINER_END)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload32 = UInt32(STACKSHOT_KCCONTAINER_TASK)
-        buffer.appendBytes(&payload32, length:sizeof(UInt32))
+        buffer.append(&payload32, length:MemoryLayout<UInt32>.size)
 
 
         item.type = UInt32(KCDATA_TYPE_CONTAINER_BEGIN)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload32 = UInt32(STACKSHOT_KCCONTAINER_TASK)
-        buffer.appendBytes(&payload32, length:sizeof(UInt32))
+        buffer.append(&payload32, length:MemoryLayout<UInt32>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload64 = 42
-        buffer.appendBytes(&payload64, length:sizeof(UInt64))
+        buffer.append(&payload64, length:MemoryLayout<UInt64>.size)
 
         item.type = UInt32(KCDATA_TYPE_CONTAINER_END)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload32 = UInt32(STACKSHOT_KCCONTAINER_TASK)
-        buffer.appendBytes(&payload32, length:sizeof(UInt32))
+        buffer.append(&payload32, length:MemoryLayout<UInt32>.size)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
@@ -791,26 +810,26 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_CONTAINER_BEGIN)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload32 = UInt32(STACKSHOT_KCCONTAINER_TASK)
-        buffer.appendBytes(&payload32, length:sizeof(UInt32))
+        buffer.append(&payload32, length:MemoryLayout<UInt32>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload64 = 42
-        buffer.appendBytes(&payload64, length:sizeof(UInt64))
+        buffer.append(&payload64, length:MemoryLayout<UInt64>.size)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
@@ -825,21 +844,21 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_CONTAINER_BEGIN)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt32))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt32>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload32 = UInt32(STACKSHOT_KCCONTAINER_TASK)
-        buffer.appendBytes(&payload32, length:sizeof(UInt32))
+        buffer.append(&payload32, length:MemoryLayout<UInt32>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
         payload64 = 42
-        buffer.appendBytes(&payload64, length:sizeof(UInt64))
+        buffer.append(&payload64, length:MemoryLayout<UInt64>.size)
 
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
@@ -854,15 +873,15 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
-        item.size = UInt32(sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         var payload : UInt64 = 42
-        buffer.appendBytes(&payload, length:sizeof(UInt64))
+        buffer.append(&payload, length:MemoryLayout<UInt64>.size)
 
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
@@ -876,20 +895,20 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
         item.size = 99999
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         var payload : UInt64 = 42
-        buffer.appendBytes(&payload, length:sizeof(UInt64))
+        buffer.append(&payload, length:MemoryLayout<UInt64>.size)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
@@ -905,41 +924,41 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_ARRAY)
         item.flags = UInt64(TASK_CRASHINFO_CRASHED_THREADID) << 32 | UInt64(n)
-        item.size = UInt32(n * sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         for i in 0..<n {
             var payload : UInt64 = UInt64(i)
-            buffer.appendBytes(&payload, length:sizeof(UInt64))
+            buffer.append(&payload, length:MemoryLayout<UInt64>.size)
         }
 
         item.type = UInt32(KCDATA_TYPE_ARRAY)
         item.flags = UInt64(TASK_CRASHINFO_CRASHED_THREADID) << 32 | UInt64(n)
-        item.size = UInt32(n * sizeof(UInt64))
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * MemoryLayout<UInt64>.size)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         for i in 0..<n {
             var payload : UInt64 = UInt64(i)
-            buffer.appendBytes(&payload, length:sizeof(UInt64))
+            buffer.append(&payload, length:MemoryLayout<UInt64>.size)
         }
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
             else { XCTFail(); return }
 
-        XCTAssert( 2*n == dict["kcdata_crashinfo"]!["crashed_threadid"]!!.count)
+        XCTAssert( 2*n == (dict.value(forKeyPath:"kcdata_crashinfo.crashed_threadid") as! [Any]).count)
         for i in 0..<2*n {
             let x = dict["kcdata_crashinfo"] as? NSDictionary
             let y = x?["crashed_threadid"] as? NSArray
-            XCTAssert((y?[i]) as? NSObject == i % n)
+            XCTAssert((y?[i]) as? Int == i % n)
         }
     }
 
@@ -951,46 +970,47 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-        
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+
         item.type = UInt32(KCDATA_TYPE_ARRAY)
         item.flags = UInt64(TASK_CRASHINFO_CRASHED_THREADID) << 32 | UInt64(n)
-        item.size = UInt32(n * sizeof(UInt64) + pad)
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * MemoryLayout<UInt64>.size + pad)
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         for i in 0..<n {
             var payload : UInt64 = UInt64(i)
-            buffer.appendBytes(&payload, length:sizeof(UInt64))
+            buffer.append(&payload, length:MemoryLayout<UInt64>.size)
         }
 
         for _ in 0..<pad {
             var payload : UInt8 = 0
-            buffer.appendBytes(&payload, length:1)
+            buffer.append(&payload, length:1)
         }
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
-        
-        XCTAssert( n == dict["kcdata_crashinfo"]?["crashed_threadid"]??.count)
+
+        XCTAssert( n == (dict.value(forKeyPath:"kcdata_crashinfo.crashed_threadid") as! [Any]).count)
+
         for i in 0..<n {
             let x = dict["kcdata_crashinfo"] as? NSDictionary
             let y = x?["crashed_threadid"] as? NSArray
-            XCTAssert((y?[i]) as? NSObject == i)
+            XCTAssert((y?[i]) as? Int == i)
         }
 
     }
-    
+
     func testReadThreadidArray() {
         // test that we can correctly read old arrays with a variety of sizes and paddings
-        self.testReadThreadidArray(0, pad:0)
+        self.testReadThreadidArray(n: 0, pad:0)
         for n in 1..<100 {
             for pad in 0..<16 {
-                self.testReadThreadidArray(n, pad:pad)
+                self.testReadThreadidArray(n: n, pad:pad)
             }
         }
     }
@@ -999,63 +1019,63 @@ class Tests: XCTestCase {
         /// for old style arrays, if the element size is determined by the type.   If the array of that size element at the given count doesn't fit, then parsing should fail
 
         let n = 1
-        
+
         let buffer = NSMutableData(capacity:1000)!
-        
+
         var item = kcdata_item()
-        
+
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-        
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+
         item.type = UInt32(KCDATA_TYPE_ARRAY)
         item.flags = UInt64(TASK_CRASHINFO_CRASHED_THREADID) << 32 | UInt64(n)
         item.size = UInt32(4)
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-        
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+
         var payload : UInt32 = UInt32(42)
-        buffer.appendBytes(&payload, length:sizeof(UInt32))
-        
+        buffer.append(&payload, length:MemoryLayout<UInt32>.size)
+
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
-    
+
     func testReadThreadidArrayWrongSize5() {
         /// if the count is bigger than the buffer, parsing will just fail
-        
+
         let n = 5
-        
+
         let buffer = NSMutableData(capacity:1000)!
-        
+
         var item = kcdata_item()
-        
+
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-        
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+
         item.type = UInt32(KCDATA_TYPE_ARRAY)
         item.flags = UInt64(TASK_CRASHINFO_CRASHED_THREADID) << 32 | UInt64(n)
         item.size = UInt32(4)
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-        
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+
         var payload : UInt32 = UInt32(42)
-        buffer.appendBytes(&payload, length:sizeof(UInt32))
-        
+        buffer.append(&payload, length:MemoryLayout<UInt32>.size)
+
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
-        
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
+
         XCTAssert( (try? self.parseBuffer(buffer)) == nil )
     }
 
-    
+
     func testReadThreadidArrayPaddedSize() {
         // test that we can tolerate a little padding at the end of an array
         let n = 5
@@ -1067,33 +1087,33 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_ARRAY)
         item.flags = UInt64(TASK_CRASHINFO_CRASHED_THREADID) << 32 | UInt64(n)
-        item.size = UInt32(n * sizeof(UInt64)) + 1
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * MemoryLayout<UInt64>.size) + 1
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         for i in 0..<n {
             var payload : UInt64 = UInt64(i)
-            buffer.appendBytes(&payload, length:sizeof(UInt64))
+            buffer.append(&payload, length:MemoryLayout<UInt64>.size)
         }
         var payload : UInt8 = 0
-        buffer.appendBytes(&payload, length:1)
+        buffer.append(&payload, length:1)
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
 
-        XCTAssert( n == dict["kcdata_crashinfo"]?["crashed_threadid"]??.count)
+        XCTAssert( n == (dict.value(forKeyPath:"kcdata_crashinfo.crashed_threadid") as! [Any]).count)
         for i in 0..<n {
             let x = dict["kcdata_crashinfo"] as? NSDictionary
             let y = x?["crashed_threadid"] as? NSArray
-            XCTAssert((y?[i]) as? NSObject == i)
+            XCTAssert((y?[i]) as? Int == i)
         }
     }
 
@@ -1108,36 +1128,35 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(KCDATA_TYPE_ARRAY)
         item.flags = UInt64(TASK_CRASHINFO_CRASHED_THREADID) << 32 | UInt64(n)
-        item.size = UInt32(n * sizeof(UInt64)) + 15
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        item.size = UInt32(n * MemoryLayout<UInt64>.size) + 15
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         for i in 0..<n {
             var payload : UInt64 = UInt64(i)
-            buffer.appendBytes(&payload, length:sizeof(UInt64))
+            buffer.append(&payload, length:MemoryLayout<UInt64>.size)
         }
-        for i in 0..<15 {
-            i;
+        for _ in 0..<15 {
             var payload : UInt8 = 0
-            buffer.appendBytes(&payload, length:1)
+            buffer.append(&payload, length:1)
         }
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
 
-        XCTAssert( n == dict["kcdata_crashinfo"]?["crashed_threadid"]??.count)
+        XCTAssert( n == (dict.value(forKeyPath:"kcdata_crashinfo.crashed_threadid") as! [Any]).count)
         for i in 0..<n {
             let x = dict["kcdata_crashinfo"] as? NSDictionary
             let y = x?["crashed_threadid"] as? NSArray
-            XCTAssert((y?[i]) as? NSObject == i)
+            XCTAssert((y?[i]) as? Int == i)
         }
     }
 
@@ -1150,59 +1169,59 @@ class Tests: XCTestCase {
         item.type = KCDATA_BUFFER_BEGIN_CRASHINFO
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         item.type = UInt32(TASK_CRASHINFO_CRASHED_THREADID)
         item.flags = 0
         item.size = size
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         var payload : UInt64 = 42
-        buffer.appendBytes(&payload, length:Int(size))
+        buffer.append(&payload, length:Int(size))
 
         item.type = KCDATA_TYPE_BUFFER_END
         item.flags = 0
         item.size = 0
-        buffer.appendBytes(&item, length: sizeof(kcdata_item))
+        buffer.append(&item, length: MemoryLayout<kcdata_item>.size)
 
         guard let dict = try? self.parseBuffer(buffer)
         else { XCTFail(); return; }
 
-        XCTAssert(dict["kcdata_crashinfo"]?["crashed_threadid"] == nil)
+        XCTAssert(dict.value(forKeyPath:"kcdata_crashinfo.crashed_threadid") == nil)
     }
 
     func testReadThreadidWrongSize0() {
-        self.testReadThreadidWrongSize(0)
+        self.testReadThreadidWrongSize(size: 0)
     }
 
     func testReadThreadidWrongSize7() {
-        self.testReadThreadidWrongSize(7)
+        self.testReadThreadidWrongSize(size: 7)
     }
 
-    func dataWithResource(name:String) -> NSData? {
-        guard let filename =  NSBundle(forClass: self.classForCoder).pathForResource(name, ofType: nil)
+    func dataWithResource(name:String) -> NSData? {
+        guard let filename =  Bundle(for: self.classForCoder).path(forResource: name, ofType: nil)
         else { return nil }
         return NSData(contentsOfFile:filename)!
     }
-    
-    func testSampleStackshot(name : String) {
+
+    func testSampleStackshot(name : String) {
         // check that we agree with sample file
 
         guard let sampledata = self.dataWithResource(name)
             else { XCTFail(); return }
         var dict : NSDictionary?
 
-        dict = try? self.parseBuffer(sampledata)
+        dict = try? self.parseBuffer(sampledata) as NSDictionary
 
         if (dict == nil) {
-            if let decoded = NSData(base64EncodedData: sampledata, options:.IgnoreUnknownCharacters) {
-                dict = try? self.parseBuffer(decoded)
+            if let decoded = NSData(base64Encoded: sampledata as Data, options:.ignoreUnknownCharacters) {
+                dict = try? self.parseBuffer(decoded) as NSDictionary
             }
         }
 
         if (dict == nil) {
             if let decompressed = try? decompress(sampledata) {
-                dict = try? self.parseBuffer(decompressed)
+                dict = try? self.parseBuffer(decompressed) as NSDictionary
             }
         }
 
@@ -1214,9 +1233,9 @@ class Tests: XCTestCase {
                               self.dataWithResource(name + ".plist")
             else {XCTFail(); return}
 
-        var dict2 = try? NSPropertyListSerialization.propertyListWithData(plistdata, options: NSPropertyListReadOptions.Immutable, format: nil)
+        var dict2 = try? PropertyListSerialization.propertyList(from: plistdata as Data, options: [], format: nil)
         if dict2 == nil {
-            dict2 = try? NSPropertyListSerialization.propertyListWithData(decompress(plistdata), options: .Immutable, format: nil)
+            dict2 = try? PropertyListSerialization.propertyList(from:decompress(plistdata) as Data, options:[], format: nil)
         }
 
         XCTAssert(dict2 != nil)
@@ -1227,19 +1246,19 @@ class Tests: XCTestCase {
 
         #if os(OSX)
 
-            let kcdatapy = NSBundle(forClass: self.classForCoder).pathForResource("kcdata.py", ofType: nil)
+            let kcdatapy = Bundle(for: self.classForCoder).path(forResource: "kcdata.py", ofType: nil)
 
-        let task = NSTask()
+        let task = Process()
         task.launchPath = kcdatapy
         task.arguments = ["-p",
-                          NSBundle(forClass:self.classForCoder).pathForResource(name, ofType: nil)!]
-        let pipe = NSPipe()
+                          Bundle(for:self.classForCoder).path(forResource: name, ofType: nil)!]
+        let pipe = Pipe()
         task.standardOutput = pipe
         task.launch()
 
         let data = pipe.fileHandleForReading.readDataToEndOfFile()
 
-            guard let dict3 = try? NSPropertyListSerialization.propertyListWithData(data, options: .Immutable, format: nil) as? NSDictionary
+            guard let dict3 = try? PropertyListSerialization.propertyList(from:data, options:[], format: nil) as? NSDictionary
             else { XCTFail(); return }
 
         XCTAssert(dict == dict3)
@@ -1282,7 +1301,7 @@ class Tests: XCTestCase {
     func testSampleExitReason() {
         self.testSampleStackshot("exitreason-sample")
     }
-    
+
     func testSampleThreadT() {
         self.testSampleStackshot("stackshot-sample-ths-thread-t")
     }
@@ -1315,6 +1334,14 @@ class Tests: XCTestCase {
         self.testSampleStackshot("exitreason-codesigning")
     }
 
+    func testSampleThreadGroups() {
+        self.testSampleStackshot("stackshot-sample-thread-groups")
+    }
+
+    func testSampleCoalitions() {
+        self.testSampleStackshot("stackshot-sample-coalitions")
+    }
+
     func testStackshotSharedcacheV2() {
         self.testSampleStackshot("stackshot-sample-sharedcachev2")
     }
@@ -1331,6 +1358,18 @@ class Tests: XCTestCase {
         self.testSampleStackshot("xnupost_testconfig-sample")
     }
 
+    func testStackshotWithWaitinfo() {
+        self.testSampleStackshot("stackshot-with-waitinfo")
+    }
+
+    func testStackshotWithThreadPolicy() {
+        self.testSampleStackshot("stackshot-sample-thread-policy")
+    }
+
+    func testStackshotWithInstrsCycles() {
+        self.testSampleStackshot("stackshot-sample-instrs-cycles")
+    }
+
     func testTrivial() {
     }
 }