スコープの管理
AVM2のスコープ管理についてメモ。相当賢く管理してて、簡単にクロージャを実装できるようになっている。
まずは基本。
- スコープはスコープスタックという専用のスタックで管理されている
- スコープ・スタックには任意のオブジェクトを積める。そして、ECMAScriptではオブジェクトとハッシュテーブルは同義なので、これで変数名と値の対応付けが可能
- 変数名を文字列で持つのがムダなので、slotという機構が存在している?要調査
次に関数呼び出し関連の仕様。
- メソッドが起動されたときはスコープ・スタックは空
- newfunctionで関数を実体化すると、そのときのスコープが保存される。そして、その関数を呼んだときにスコープが復元される(!)
- 復元されるのは、スコープスタックのみでレジスタは復活しない
- 関数の引数はレジスタに格納されるので、引数が復活しない
- 引数などをスコープに積むためにnewactivationで登録用オブジェクトを作ることが奨励されている
- newactivationはメソッドに専用のフラグを埋めこんでおく必要がある
だいたいこんな感じ。自動でスコープが保存されるとか、がんばりすぎだろ。