プロジェクトの書き出しの流れ

自分用のメモです。
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 を埋め込む。。※コンテンツのバージョンではなく、テクノロジやファイル形式を示すものと思われる