Flash: 複数要素のPush
Flashでは、スタックに値を入れるとき、複数の値を一度にPushすることができます。
たとえば、"1"と"2"を一度にPushする場合は次のようなアクションを書きます。
次の06 00は、Pushするデータの長さです。
青い00の部分はデータ型になっていて、この場合は文字列です。文字列は最後の00が区切りになっているので、この場合は、"1"と"2"という二つの文字列をPushすることになります。
ここで、上のようなPush命令を
さて、複数要素を一度にpushした場合、スタック上にはどのようにデータが配置されるのでしょう。push "1", "2"は、
と、
のどちらと等価なのでしょうか。
これを調べるために、次のようなプログラムを書いてみました。
実行してみると、変数aの値は-1になり、[1]のほうと等価であることがわかります。SWFのスタックはメモリ中のアドレスの小さい方から大きい方へと伸びている(そういう実装の方が素直である)と考えることができそうです。
ちなみに、スタックの伸びる方向がわかったので、上のテストプログラムは、以下のようにさらに短く書くこともできます。
96 06 00 00 31 00 00 32 00最初の96はアクション"Push"を表しています。
次の06 00は、Pushするデータの長さです。
青い00の部分はデータ型になっていて、この場合は文字列です。文字列は最後の00が区切りになっているので、この場合は、"1"と"2"という二つの文字列をPushすることになります。
ここで、上のようなPush命令を
push "1", "2"のように書くこととします。
さて、複数要素を一度にpushした場合、スタック上にはどのようにデータが配置されるのでしょう。push "1", "2"は、
[1] | push "1" |
[2] | push "2" |
これを調べるために、次のようなプログラムを書いてみました。
push "a" push "1", "2" subtract setvar [96 03 00 00 61 00 96 06 00 00 31 00 00 32 00 0B 1D]これで、変数aの値が-1ならば[1]、1ならば[2]が正しいということになります。
実行してみると、変数aの値は-1になり、[1]のほうと等価であることがわかります。SWFのスタックはメモリ中のアドレスの小さい方から大きい方へと伸びている(そういう実装の方が素直である)と考えることができそうです。
ちなみに、スタックの伸びる方向がわかったので、上のテストプログラムは、以下のようにさらに短く書くこともできます。
push "a", "1", "2" subtract setvar [96 09 00 00 61 00 00 31 00 00 32 00 0B 1D]