プロジェクトの書き出しの流れ
自分用のメモです。
CProjectShell>>saveProjectOn:
- プロジェクトのサムネイルをPNGで作成
- プロジェクトの killFrame=Trueとし、現在のステッピングをやり過ごす
- プロジェクトに #shutDownProjectイベントを送る
- CProjectWriter>>checkpoint: でプロジェクトのチェックポイントをとる
- CProjectWriter>>saveProjectOn: で、とったチェックポイントを書き出す
CIslandWriter>>checkpoint:
- CIslandWriter>>storeSegmentFor:into:outPointers: で、ルートオブジェクトを指定して、イメージセグメントに変換する。(イメージセグメントへの変換は、Squeakのイメージと同じ処理で、VMのプリミティブで行う)
- CheckPointTracerで、イメージセグメントへの変換処理をシミュレートし、おかしい動作をしているところがないかチェックする。
CProjectWriter>>saveProjectOn:
- メモリ上のバッファへのIslandStreamを作成
- (CPorjectWriter>>projectVersionID)をストリームに書き出す。※コンテンツのバージョンではなく、テクノロジを示すものと思われる
- CIslandWriter>>export: により、Island外部をさすポインタ配列(=他のIslandからインポートしているもの)をストリームに書き出す
- CIslandWriter>>exportImageSegument: により、チェックポイントで作成したイメージセグメントをストリームに書き出す。
- ZipArchive>>addDeflateString:as: で、プロジェクトアーカイブ中に、ストリームにたまったデータを project.isg という名前のファイルとして埋め込む。
- プロジェクトアーカイブをファイルに書き出す。その際、ファイルの先頭に CIslandWriter>>(class)archiveVersionID を埋め込む。。※コンテンツのバージョンではなく、テクノロジやファイル形式を示すものと思われる