4 |
FSMのダイレクトリターン |
さて、非リーフFSMコールの後、リーフコールがある場合は、単純に前記シーケンスの組み合わせとなります。図で示すと図95.1のようになります。

ここで結構見られるのが、リーフを呼んで戻った後、何もせずにさらにcallerに戻るパターンです。これを実現するより効率的な方法として、ダイレクトリターン手法があります。これを図95.2に示すと、リーフをコールする前にスタックから戻り番地を取り出しreturnに入れ、リーフへジャンプします。リーフからは知らずにリターンすると、ダイレクトリターンが行われます。

特殊な場合として、上記のようにパラメータ設定だけしてリーフにジャンプするような場合は、そもそもリーフであるため、以下の図のような呼び出しとなります。

例として、残機表示サブFSMは、(リーフである)copyAreaを呼び出すので、returnを破壊するため非リーフですが、その後のシーケンスでcopyAreaを呼び出しダイレクトリターンを行います。その際には図95.3のダイレクトリターン手法は取れないため、図95.2のダイレクトリターン手法を取っています。