ユーザ用ツール

サイト用ツール


Sidebar

言語処理系:mruby:コンテキスト取得関数

コンテキスト取得関数

だいたいこれを定義しておくと便利。

Initializedでコンテキストをインスタンス変数として生成しといて、それを呼び出してうんぬんかんぬんという処理を書くことが多いので、以下のような関数を定義しておく。

static mt_state *mrb_mt_get_context(mrb_state *mrb,  mrb_value self)
{
  mt_state *t;
  mrb_value context;
 
  context = mrb_iv_get(mrb, self, mrb_intern(mrb, "コンテキストを表す変数名"));
  t = (mt_state*)mrb_data_get_ptr(mrb, context, &"コンテキストを表す構造体名"_type);
  if (!t)
    mrb_raise(mrb, E_RUNTIME_ERROR, "context get from mrb_iv_get failed");
 
  return t;
}

で、例えばmruby-randomとかだったら、コンテキストを以下のように呼び出して、コンテキスト弄ったらまたインスタンス変数にセットし直す。

static mrb_value mrb_random_rand(mrb_state *mrb, mrb_value self)
{
  mrb_value max;
  mrb_value seed;
  mt_state *t = mrb_mt_get_context(mrb, self);
 
  max = get_opt(mrb);
  seed = mrb_iv_get(mrb, self, mrb_intern(mrb, INSTANCE_RAND_SEED_KEY));
  if (mrb_nil_p(seed)) {
    mrb_random_mt_srand(mrb, t, mrb_nil_value());
  }
  mrb_iv_set(mrb, self, mrb_intern(mrb, MT_STATE_KEY),
    mrb_obj_value(Data_Wrap_Struct(mrb, mrb->object_class, &mt_state_type, (void*) t)));
  return mrb_random_mt_rand(mrb, t, max);
}

便利。

言語処理系/mruby/コンテキスト取得関数.txt · 最終更新: 2013/04/28 22:20 by matsumoto_r