スコープの管理

AVM2のスコープ管理についてメモ。相当賢く管理してて、簡単にクロージャを実装できるようになっている。

まずは基本。

  • スコープはスコープスタックという専用のスタックで管理されている
  • スコープ・スタックには任意のオブジェクトを積める。そして、ECMAScriptではオブジェクトとハッシュテーブルは同義なので、これで変数名と値の対応付けが可能
  • 変数名を文字列で持つのがムダなので、slotという機構が存在している?要調査

次に関数呼び出し関連の仕様。

  • メソッドが起動されたときはスコープ・スタックは空
  • newfunctionで関数を実体化すると、そのときのスコープが保存される。そして、その関数を呼んだときにスコープが復元される(!)
  • 復元されるのは、スコープスタックのみでレジスタは復活しない
  • 関数の引数はレジスタに格納されるので、引数が復活しない
  • 引数などをスコープに積むためにnewactivationで登録用オブジェクトを作ることが奨励されている
  • newactivationはメソッドに専用のフラグを埋めこんでおく必要がある

だいたいこんな感じ。自動でスコープが保存されるとか、がんばりすぎだろ。