ひとり勉強会

ひとり楽しく勉強会

set_optargs_table @ compile.c

あれれ、コンパイルのところで見落としてました。メソッドのデフォルト引数は、こういう風にコンパイルされるみたいです。

/*
 * set optional argument table
 *   def foo(a, b=expr1, c=expr2)
 *   =>
 *    b:
 *      expr1
 *    c:
 *      expr2
 */

該当コードはiseq_compile→NODE_ARGS→set_argumentsあたり。このラベルを位置情報に変換するのがset_optargs_table関数。ループ回して変換するだけです。

static int
set_optargs_table(yarv_iseq_t *iseq)
{
  int i;

  if (iseq->arg_opts != 0) {
    for (i = 0; i < iseq->arg_opts; i++) {
      iseq->arg_opt_tbl[i] =
        label_get_position((LABEL *)iseq->arg_opt_tbl[i]);
    }
  }
  return COMPILE_OK;
}