ABCのバイトコード生成

ABC(ActionScript3 ByteCode)をどうやって生成しているか気になったので、Tamarinのソースツリーに含まれているECMAScript4のコード生成部分を追ってみた。
とりあえず、何もせず終了するだけのプログラムを生成するときのことを想定している。要するに空のコードをコンパイルすると得られるプログラム。

  • cogen.esのcg()から開始
  • ABCEmitter、Script、AVM2Assemblerが作られる
    • ABCEmitter(emitter.es): ABCファイル全体に対応
    • Script(emitter.es): 最初に実行されるコード。トップレレベル
    • AVM2Assembler(asm.es): Script内部のコード。スタックの最大深さなどを追跡する
  • cgProgram()でasmやABCEmitterに対して色々出力する。今回は、何もしない
  • ABCEmitterをfinalize()
    • Scriptをfinalize()
      • MethodInfoを作って、ABCEmitterに追加
      • MethodBodyを作って、ABCEmitterに追加。このときasmをserialize()する。バックパッチングもここで行なわれる
  • ABCEmitter#getBytes()でバイトコードが取得できる