有谁知道这会导致什么?我无法将任何内容保存到我的班级,因为我抛出了一个调试异常:Collection is empty

链接源: https ://dl.dropboxusercontent.com/u/1817765/Pharo%20Crash%20Files.rar
重建步骤:
- 启动 Pharo 1.1
- 选择
.image文件,没有.changes同目录下的文件 - 尝试选择
NumberWithUnits>>=- 碰撞
- 尝试将几乎所有内容保存到
NumberWithUnits- 碰撞
有谁知道这会导致什么?我无法将任何内容保存到我的班级,因为我抛出了一个调试异常:Collection is empty

链接源: https ://dl.dropboxusercontent.com/u/1817765/Pharo%20Crash%20Files.rar
重建步骤:
.image文件,没有.changes同目录下的文件NumberWithUnits>>=
NumberWithUnits
问题是我没有.changes与我的项目关联的正确文件。由于我和我的队友正在合作,所以这些在翻译中丢失了。一旦我将正确的.changes文件放在我的.image文件目录中,一切都解决了。
Squeak/Pharo 在缺少源代码的情况下有特殊处理:它们尝试从适当的 MethodDictionary 反编译 CompiledMethod。
您在这里看到的是 Decompiler 无法正确反编译某些方法。
没有代码,IDE 将无法运行,并且您会被卡住(您无法保存代码、浏览代码、调试代码......)
这个 Pharo 1.1 版本已经很老了,你不会得到任何支持。
但有趣的是,您遇到的 Decompiler 的 bug 在当前的 Squeak trunk 开发(4.5)中仍然存在,
并且使 Decompiler 变得松散的方法是:
< aNumberWithUnits
(self compareUnits: aNumberWithUnits)
ifTrue: [self value: ((aNumberWithUnits value) < (self value) ifTrue: [^true] ifFalse: [^false]).]
ifFalse: [^Error new signal: 'Incompatible unit types.'].
这是一个非常规的代码,因为消息[self value: ...]永远不会被发送。
原因是参数将首先被评估,条件的两个分支都将返回ifTrue: [^true] ifFalse: [^false]。
由于您探索了一些只有新手才能探索的黑暗角落,并且我们未能测试,所以我只想说谢谢。
如果您愿意,可以在http://bugs.squeak.org上打开报告