Created
January 21, 2017 13:44
-
-
Save omochi/b67262b8682015e925ac7ce0f267c18f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
func dumpMemory(_ p: UnsafeRawPointer, _ size: Int) { | |
let addr = unsafeBitCast(p, to: UInt64.self) | |
var p = p.bindMemory(to: UInt8.self, capacity: size) | |
for i in 0..<size { | |
if i % 8 == 0 { | |
if i != 0 { | |
print() | |
} | |
print(String(format: "[0x%016lx]", addr + UInt64(i)), terminator: "") | |
} | |
print(String(format: " %02x", p[i]), terminator: "") | |
} | |
print() | |
} | |
struct SA { | |
var v1: UInt32 = 0xA1B1C1D1 | |
var v2: UInt32 = 0xA2B2C2D2 | |
var v3: UInt32 = 0xA3B3C3D3 | |
var v4: UInt32 = 0xA4B4C4D4 | |
} | |
class CA { | |
var v1: UInt32 = 0xA1B1C1D1 | |
var v2: UInt32 = 0xA2B2C2D2 | |
var v3: UInt32 = 0xA3B3C3D3 | |
var v4: UInt32 = 0xA4B4C4D4 | |
} | |
func test1() { | |
print("--test1 enter") | |
var x = SA() | |
let p = UnsafeRawPointer(UnsafeMutablePointer<SA>(&x)) | |
dumpMemory(p, MemoryLayout<SA>.size) | |
print("--test1 exit") | |
} | |
func test2() { | |
print("--test2 enter") | |
var x = CA() | |
let p = UnsafeRawPointer(UnsafeMutablePointer<CA>(&x)) | |
dumpMemory(p, MemoryLayout<CA>.size) | |
print("--") | |
let p2 = p.bindMemory(to: UnsafeRawPointer.self, capacity: 1).pointee | |
dumpMemory(p2, 32) | |
print("--") | |
var x2 = x | |
dumpMemory(p2, 32) | |
print("--") | |
weak var x3 = x | |
dumpMemory(p2, 32) | |
print("--test2 exit") | |
} | |
func test3() { | |
print("--test3 enter") | |
var x1: SA? = .some(SA()) | |
let px1 = UnsafeRawPointer(UnsafeMutablePointer<SA?>(&x1)) | |
dumpMemory(px1, MemoryLayout<SA?>.size) | |
var x2: SA? = .none | |
let px2 = UnsafeRawPointer(UnsafeMutablePointer<SA?>(&x2)) | |
dumpMemory(px2, MemoryLayout<SA?>.size) | |
print("--test3 exit") | |
} | |
func test4() { | |
print("--test4 enter") | |
var x1: SA?? = .some(.some(SA())) | |
let px1 = UnsafeRawPointer(UnsafeMutablePointer<SA??>(&x1)) | |
dumpMemory(px1, MemoryLayout<SA??>.size) | |
var x2: SA?? = .some(.none) | |
let px2 = UnsafeRawPointer(UnsafeMutablePointer<SA??>(&x2)) | |
dumpMemory(px2, MemoryLayout<SA??>.size) | |
var x3: SA?? = .none | |
let px3 = UnsafeRawPointer(UnsafeMutablePointer<SA??>(&x3)) | |
dumpMemory(px3, MemoryLayout<SA??>.size) | |
print("--test4 exit") | |
} | |
func test5() { | |
print("--test5 enter") | |
var x1: CA? = .some(CA()) | |
let px1 = UnsafeRawPointer(UnsafeMutablePointer<CA?>(&x1)) | |
dumpMemory(px1, MemoryLayout<CA?>.size) | |
let ppx1 = px1.bindMemory(to: UnsafeRawPointer.self, capacity: 1).pointee | |
dumpMemory(ppx1, 32) | |
var x2: CA? = .none | |
let px2 = UnsafeRawPointer(UnsafeMutablePointer<CA?>(&x2)) | |
dumpMemory(px2, MemoryLayout<CA?>.size) | |
print("--test5 exit") | |
} | |
func test6() { | |
print("--test6 enter") | |
var x1: CA?? = .some(.some(CA())) | |
let px1 = UnsafeRawPointer(UnsafeMutablePointer<CA??>(&x1)) | |
dumpMemory(px1, MemoryLayout<CA??>.size) | |
let ppx1 = px1.bindMemory(to: UnsafeRawPointer.self, capacity: 1).pointee | |
dumpMemory(ppx1, 32) | |
var x2: CA?? = .some(.none) | |
let px2 = UnsafeRawPointer(UnsafeMutablePointer<CA??>(&x2)) | |
dumpMemory(px2, MemoryLayout<CA??>.size) | |
var x3: CA?? = .none | |
let px3 = UnsafeRawPointer(UnsafeMutablePointer<CA??>(&x3)) | |
dumpMemory(px3, MemoryLayout<CA??>.size) | |
print("--test6 exit") | |
} | |
func test7() { | |
print("--test7 enter") | |
var x1: CA????? = .some(.some(.some(.some(.some(CA()))))) | |
let px1 = UnsafeRawPointer(UnsafeMutablePointer<CA?????>(&x1)) | |
dumpMemory(px1, MemoryLayout<CA?????>.size) | |
let ppx1 = px1.bindMemory(to: UnsafeRawPointer.self, capacity: 1).pointee | |
dumpMemory(ppx1, 32) | |
var x2: CA????? = .some(.some(.some(.some(.none)))) | |
let px2 = UnsafeRawPointer(UnsafeMutablePointer<CA?????>(&x2)) | |
dumpMemory(px2, MemoryLayout<CA?????>.size) | |
var x3: CA????? = .some(.some(.some(.none))) | |
let px3 = UnsafeRawPointer(UnsafeMutablePointer<CA?????>(&x3)) | |
dumpMemory(px3, MemoryLayout<CA?????>.size) | |
var x4: CA????? = .some(.some(.none)) | |
let px4 = UnsafeRawPointer(UnsafeMutablePointer<CA?????>(&x4)) | |
dumpMemory(px4, MemoryLayout<CA?????>.size) | |
var x5: CA????? = .some(.none) | |
let px5 = UnsafeRawPointer(UnsafeMutablePointer<CA?????>(&x5)) | |
dumpMemory(px5, MemoryLayout<CA?????>.size) | |
var x6: CA????? = .none | |
let px6 = UnsafeRawPointer(UnsafeMutablePointer<CA?????>(&x6)) | |
dumpMemory(px6, MemoryLayout<CA?????>.size) | |
print("--test7 exit") | |
} | |
test1() | |
test2() | |
test3() | |
test4() | |
test5() | |
test6() | |
test7() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment