吱吱声的字面数限制

时间:2013-10-16 11:35:19

标签: smalltalk literals squeak

我现在第三次遇到这个问题,有些人吱吱作响者可能会从屏幕截图中认出来最好:

enter image description here

以下是重现问题的示例代码:

d:=Dictionary new.
(1 to: 257) do: [:each|
    d at: each put: each
].
f:=FileStream fileNamed: 'asdf.txt'.
d storeOn: f.
f reset.
d2:=Dictionary readFrom: f.
f close.

我知道为什么它会发生(编译器用于反序列化,它通过将整个文件放在一个方法中来实现)。

在过去,我总是将我的代码更改为使用数据库或使用其他形式的序列化。 但我想知道是否有某种方法可以修复Squeak以使其工作

2 个答案:

答案 0 :(得分:6)

目前,没有正确的方法。

问题是,CompiledMethod具有VM已知的格式,以及VM的预期。这包括256个文字限制。 对方法格式的更改需要更改虚拟机。这就是为什么人们犹豫是否要改变字面上的限制直到现在。

最近,人们花费精力创造了一种不仅用于方法的新格式 完全改变Object格式:the SPUR object format旨在增加方法中的文字数量等。

答案 1 :(得分:4)

如图所示,#storeOn:API不是强化的序列化API。但是如果你打算使用它们(而不是每年左右出现的一个序列化项目),你可以打“聪明”(这是256字面的限制,它是一个优化的东西),有些你自己的“聪明”。

一个诀窍是利用我们可能认为的“嵌套”文字没有限制。

a := #(1 2 3 4 5 6 7 8 9)

不包含10个文字。它只包含一个,数组本身。它可以根据需要在其中包含尽可能多的文字。因此,我们可以将您的示例改为:{/ p>

Dictionary

基本上我们将你的字典变成一个阵列数组。所以这只是你要存储的一个字面值。然后我们正在使用方便的d := Dictionary new. (1 to: 257) do: [:each | d at: each put: each]. f := FileStream fileNamed: 'asdf.txt'. pairs := d associations collect: [:kv | Array with: kv key with: kv value ]. pairs storeOn: f. f reset. d2 := Dictionary newFromPairs: (Array readFrom: f). f close. d2 ,这恰好采取了...鼓声......阵列数组。