N7においてFileStream>>nextPutAll:がSqueak3.7と挙動が異なる。N7ではFileStreamはMultiByteFileStreamが実際の処理を行う、一方Squeak3.7ではStandardFileStreamが実際の処理を行うようになっている。
次の検証コードを実行するとその違いがわかる。このコードをN7で実行すると、できたファイルのサイズが異なる。ダンプをとるとMultiByteFileStreamでは'C2'が挿入されていた。
で、なんでこんな話をするかというとSqueakのHTTPサーバKomHttpServerをインストールしようとすると,次のようなエラーとなる(SqueakDebug.logの内容)。発生場所はKomHttpServer-6.2.sarのプレアンブルである。もちろんSqueak3.7ではエラーは起きない。
エラー発生場所(プレアンブル):
SARInstaller class>>installSARFromUrl:の実装は上記プレアンブルにありファイルインされて実行される。下記コードのtempFileNameで新規作成されるファイルのサイズがSqueak3.7と異なる。デバッガでみると、contentsの値はSqueak3.7/N7ともに12,866である。作成されるファイルサイズはN7が19,029バイト,Squeak3.7は12,866バイトとなる。
この原因を追跡した結果上記の実装の違いによるものとわかった。で実際KomHttpServer-6.2.sarのプレアンブルを次のように(strm binaryを追加)すると正しく上記部分ではエラーが起きなかった.
とりあえずどうしましょうかね。ここはやはり、地道にプレアンブル部を手作業で実行するほかないような…うまい方法教えて頂戴な。
次の検証コードを実行するとその違いがわかる。このコードをN7で実行すると、できたファイルのサイズが異なる。ダンプをとるとMultiByteFileStreamでは'C2'が挿入されていた。
| b strmStd strmMulti | b := ByteArray newFrom: {16r50. 16r4B. 16r03. 16r04. 16r14. 16r00. 16r00. 16r00. 16r08. 16r00. 16r2D. 16r12. 16r37. 16r2F. 16rB1.}. strmStd := StandardFileStream newFileNamed: 'std.bin'. strmMulti := MultiByteFileStream newFileNamed: 'multi.bin'. strmStd nextPutAll: b asString. strmMulti nextPutAll: b asString. strmStd close. strmMulti close.
で、なんでこんな話をするかというとSqueakのHTTPサーバKomHttpServerをインストールしようとすると,次のようなエラーとなる(SqueakDebug.logの内容)。発生場所はKomHttpServer-6.2.sarのプレアンブルである。もちろんSqueak3.7ではエラーは起きない。
ZipArchive(Object)>>error: Receiver: a ZipArchive Arguments and temporary variables: aString: 'bad signature 07000017 at position 18686' Receiver's instance variables: members: an OrderedCollection() centralDirectorySize: 320 centralDirectoryOffsetWRTStartingDiskNumber: 3189955 zipFileComment: a ByteArray() writeCentralDirectoryOffset: 0 writeEOCDOffset: 0
エラー発生場所(プレアンブル):
SARInstaller installSARFromUrl: 'http://people.advantive.com/(省略)/KomPackaging-1.0.sar'
SARInstaller class>>installSARFromUrl:の実装は上記プレアンブルにありファイルインされて実行される。下記コードのtempFileNameで新規作成されるファイルのサイズがSqueak3.7と異なる。デバッガでみると、contentsの値はSqueak3.7/N7ともに12,866である。作成されるファイルサイズはN7が19,029バイト,Squeak3.7は12,866バイトとなる。
!SARInstaller class methodsFor: '*KomPackaging' stamp: 'svp 5/6/2003 01:10'! installSARFromUrl: aUrlOrString | url num tempFileName strm pkgName contents | url := aUrlOrString asUrl. contents := url retrieveContents contents. pkgName := url path last sansPeriodSuffix. num := 1. [FileDirectory default isAFileNamed: (tempFileName := pkgName, '.', num asString, '.temp')] whileTrue: [num := num + 1]. [strm := FileStream newFileNamed: tempFileName. [strm nextPutAll: contents] ensure: [strm close]. self installSAR: (FileDirectory default fullNameFor: tempFileName)] ensure: [FileDirectory default deleteFileNamed: tempFileName] ! !
この原因を追跡した結果上記の実装の違いによるものとわかった。で実際KomHttpServer-6.2.sarのプレアンブルを次のように(strm binaryを追加)すると正しく上記部分ではエラーが起きなかった.
[strm := FileStream newFileNamed: tempFileName. strm binary.
とりあえずどうしましょうかね。ここはやはり、地道にプレアンブル部を手作業で実行するほかないような…うまい方法教えて頂戴な。