Swift REPL 模式随反射随机崩溃
Swift REPL mode random crash with reflect
了解 reflect()
动态学习类型后,我开始使用它并遇到了这个奇怪的崩溃:
# swift -version
Swift version 1.1 (swift-600.0.56.1)
Target: x86_64-apple-darwin14.1.0
# swift
Welcome to Swift! Type :help for assistance.
1> println(reflect({1}))
Swift._OpaqueMirror
2> reflect({1})
Segmentation fault: 11
但是:
1> reflect({1}).dynamicType
$R0: MirrorType.Type = Swift._OpaqueMirror
此行为是可重复的,硬件/OS (10.10.2) 在其他方面运行良好。在评估期间还有一个明显的停顿,就好像堆栈或缓冲区溢出一样。诸如使用分配给闭包的变量并反映变量的变体也会崩溃。最后:lldb 中的 运行 swift 使其可以正常输出!!
[...]
(lldb) c
Process 3322 resuming
Welcome to Swift! Type :help for assistance.
1> reflect({"a"})
reflect({"a"})
$R0: _OpaqueMirror = {
data = {
owner = {}
ptr = {}
metadata = 0x07fad7e8ffffff40
}
}
有什么见解吗?
看起来这已在 Swift 1.2 测试版中修复:
% swift -v
Apple Swift version 1.2 (swiftlang-602.0.37.3 clang-602.0.37)
Target: x86_64-apple-darwin14.1.0
Welcome to Swift version 1.2. Type :help for assistance.
1> println(reflect({1}))
Swift._OpaqueMirror
2> reflect({1})
$R0: _OpaqueMirror = {
data = {
owner = {}
ptr = {}
metadata = 0x0000000100700068
}
}
3>
了解 reflect()
动态学习类型后,我开始使用它并遇到了这个奇怪的崩溃:
# swift -version
Swift version 1.1 (swift-600.0.56.1)
Target: x86_64-apple-darwin14.1.0
# swift
Welcome to Swift! Type :help for assistance.
1> println(reflect({1}))
Swift._OpaqueMirror
2> reflect({1})
Segmentation fault: 11
但是:
1> reflect({1}).dynamicType
$R0: MirrorType.Type = Swift._OpaqueMirror
此行为是可重复的,硬件/OS (10.10.2) 在其他方面运行良好。在评估期间还有一个明显的停顿,就好像堆栈或缓冲区溢出一样。诸如使用分配给闭包的变量并反映变量的变体也会崩溃。最后:lldb 中的 运行 swift 使其可以正常输出!!
[...]
(lldb) c
Process 3322 resuming
Welcome to Swift! Type :help for assistance.
1> reflect({"a"})
reflect({"a"})
$R0: _OpaqueMirror = {
data = {
owner = {}
ptr = {}
metadata = 0x07fad7e8ffffff40
}
}
有什么见解吗?
看起来这已在 Swift 1.2 测试版中修复:
% swift -v
Apple Swift version 1.2 (swiftlang-602.0.37.3 clang-602.0.37)
Target: x86_64-apple-darwin14.1.0
Welcome to Swift version 1.2. Type :help for assistance.
1> println(reflect({1}))
Swift._OpaqueMirror
2> reflect({1})
$R0: _OpaqueMirror = {
data = {
owner = {}
ptr = {}
metadata = 0x0000000100700068
}
}
3>