この関数はvm_eval関数を実行します。この関数がYARV命令実行の肝です。詳しいからくりはvm.hを眺めてください。YARVでは以下の6つのレジスタが使われています。:lfp|ローカル変数領域へのVALUEポインタです。この命令は名が示すようにクラスを定義します。その後、cref_stackからベースクラスを取得しています。クラス定義をコンパイルするときは0です。クラスを定義するとクラスを表すVALUEが決定されます。getinlinecacheの処理ルーチンは以下のようになっています。次にsetinlinecacheの処理ルーチンです。この命令はメソッドを呼び出します。sendを呼び出す前はこうです。sendを呼び出した後はこうです。メソッドにブロックを渡す場合を考えましょう。次にブロックが呼び出される部分を見てみましょう。スタックがどうなるか見てみましょう。今まで見てきたのと異なり、lfpとdfpが同じではありません。いうことをしています。展開するとこんな感じになります。add_opt_method関数。次にメソッド定義時の動作です。いった感じにruby_vm_redefined_flagが変更されています。今回はYARVコードへの実行を見てきました。この関数はvm_eval関数を実行します。この関数がYARV命令実行の肝です。詳しいからくりはvm.hを眺めてください。YARVでは以下の6つのレジスタが使われています。:lfp|ローカル変数領域へのVALUEポインタです。この命令は名が示すようにクラスを定義します。その後、cref_stackからベースクラスを取得しています。クラス定義をコンパイルするときは0です。クラスを定義するとクラスを表すVALUEが決定されます。getinlinecacheの処理ルーチンは以下のようになっています。次にsetinlinecacheの処理ルーチンです。この命令はメソッドを呼び出します。sendを呼び出す前はこうです。sendを呼び出した後はこうです。メソッドにブロックを渡す場合を考えましょう。次にブロックが呼び出される部分を見てみましょう。スタックがどうなるか見てみましょう。今まで見てきたのと異なり、lfpとdfpが同じではありません。いうことをしています。展開するとこんな感じになります。add_opt_method関数。次にメソッド定義時の動作です。いった感じにruby_vm_redefined_flagが変更されています。今回はYARVコードへの実行を見てきました。