Squeakあれこれ

Squeak関連情報など

[Squeak][N7]FileStream>>nextPutAll:の挙動

2005-03-30 | squeakあれこれ
N7においてFileStream>>nextPutAll:がSqueak3.7と挙動が異なる。N7ではFileStreamはMultiByteFileStreamが実際の処理を行う、一方Squeak3.7ではStandardFileStreamが実際の処理を行うようになっている。

次の検証コードを実行するとその違いがわかる。このコードを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.

とりあえずどうしましょうかね。ここはやはり、地道にプレアンブル部を手作業で実行するほかないような…うまい方法教えて頂戴な。

最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
Unknown (よしき)
2005-04-02 03:03:29
率直に言って、プリアンブルを直したものを3.8用だと言ってアップロードしてもらうのが筋だと思います。ウェブからダウンロードしたバイナリファイルをテキストだと思って操作できると思っている時点でStephen負けています。
返信する
Unknown (hkawa90)
2005-04-02 13:02:11
インストールにばかり目が行ってしまって(^^;)
返信する