Mini vMac for iPhone で Apple Smalltalk 起動時のエラーを回避する


これは“for iPhone”に限らない話なのですが、Mini vMac で動かすとき Apple Smalltalk は起動時に「OffLinErr returned from File Manager call」というエラーを表示して止まってしまいます。

http://squab.no-ip.com/collab/uploads/61/ast01.png


以前からてっきりプリミティブが失敗しているのだろうと思い込み、端から解決を諦めていたのですが(ちなみに Win でなら WORM という別のエミュを使うことでこの問題は回避可能です。なにより、Mini vMac と違って Ctrl クリックを第二ボタンに使えるのがグッド)、調べてみたところさにあらず。正常動作の範疇であり、ちょっとした修正をすることで回避できることが分かりました。安易な思いこみは禁物ですね。^^;


この問題は起動シーケンスで #mountQuiet をコールしてボリュームをマウントする作業中、使用不可ボリュームをイジェクトするために改めて #pbEject: をコールするところで起こります。その際、ボリュームによっては OffLinErr(-65) が返され、それが #checkError:okErrs: コール時に第二引数として渡される想定されるエラーに含まれないことによりノーティファイアが表示される…というカラクリでした。

self
    checkError: (Mac pbEject: pbRec)
    okErrs: (Array with: ControlErr with: NsDrvErr with: VTypErr with: ExtFSErr)


ソースを読んでいてわかったのですが、実のところこれは想定外のエラーが起こることを知らせるだけの続行可能なエラー表示なので、スクロールバー右端付近でマウスボタンをクリックして proceed を選べば先を続けられるのでした。なんと、まあ。


http://squab.no-ip.com/collab/uploads/61/ast02.png


OffLinErr を発するボリュームは複数あるため同じノーティファイアが繰り返し二度現われますが同様に proceed を繰り返す(計三回)と Apple Smalltalk は正常に起動します。


http://squab.no-ip.com/collab/uploads/61/ast03.png



初回のノーティファイアをただ閉じて中断してしまったときと違い、起動シーケンスも完了するため、ソースやチェンジファイルもきちんと読み込まれます。よって、ソースをブラウズしたときもテンポラリ変数など正しく表示されます。めでたしめでたし。


起動のたびに同じ作業をしてもいいのですが、少々面倒です。そこで、ちょっと #mountQuiet をいじっておくことにしましょう。システムブラウザ(デスクトップクリック → open browser)で Files-Macintosh → HFSMacVolume → volume access → mountQuiet とたどってソースコードを呼び出しておきます。

ここで #checkError:okErrs をコールしている箇所を探し、第二引数の無視するエラーを収めた配列に OffLinErr を追加すればよいわけですが、あいにく Array のコンストラクタには #with:with:with:with: と要素4つ用までしかないので、with: OffLinErr を追記するだけでは駄目です。そこで、#copyWith: で OffLinErr を無視するエラー群に追加します。

(Array with: ControlErr with: NsDrvErr with: VTypErr with: ExtFSErr) copyWith: OffLinErr

追記後、コード編集枠(ブラウザ下段枠)のスクロールバー右端付近をクリック → accept することで #mountQuiet をコンパイルして変更を適用できます。

http://squab.no-ip.com/collab/uploads/61/ast04.png



この変更を次回起動時にも有効にするには、さらにイメージ(環境の状態)を保存しておくこともお忘れなく。イメージを保存するには(必要であれば、作業をしたブラウザを閉じるなどして画面を整えてから)デスクトップクリック → snapshot を選択します。(注意: 上書きされるので、あらかじめ .image、.changes ファイルは Finder 上でバックアップをとっておきましょう)