Skip to content

Instantly share code, notes, and snippets.

@kjunichi
Last active April 23, 2018 01:50
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kjunichi/6e397ecb00645241aa55 to your computer and use it in GitHub Desktop.
Save kjunichi/6e397ecb00645241aa55 to your computer and use it in GitHub Desktop.
mrubyのメモ

エラーを発生させるには

selfをmrb_stateから取得できるか

mrb_str_new_cstr

内部の実装

  • str_new
  • mrb_obj_value

mrb_str_newで確保した領域の解放

内部的に

  • str_new(mrb, p, len)
  • mrb_obj_value

を使っていた

str_new

static struct RString*
str_new(mrb_state *mrb, const char *p, size_t len)
{
  struct RString *s;

  if (p && mrb_ro_data_p(p)) {
    return str_new_static(mrb, p, len);
  }
  s = mrb_obj_alloc_string(mrb);
  if (len < RSTRING_EMBED_LEN_MAX) {
    RSTR_SET_EMBED_FLAG(s);
    RSTR_SET_EMBED_LEN(s, len);
    if (p) {
      memcpy(s->as.ary, p, len);
    }
  } else {
    if (len >= MRB_INT_MAX) {
      mrb_raise(mrb, E_ARGUMENT_ERROR, "string size too big");
    }
    s->as.heap.len = len;
    s->as.heap.aux.capa = len;
    s->as.heap.ptr = (char *)mrb_malloc(mrb, len+1);
    if (p) {
      memcpy(s->as.heap.ptr, p, len);
    }
  }
  RSTR_PTR(s)[len] = '\0';
  return s;
}

メモリの扱いに関しての記録

C言語でForkを扱う

C言語でmrubyのブロックを扱うには

細切れにmrubyとC実装を動かすには

mrb_load_string_cxt

別のmrbgemsにメソッドを追加するには

実際やってみると、難しい。

結局マルマルコードをコピーするはめになりがちな気がしてきた。

mrb_malloc

mrb_funcall

拡張

一部をrubyのコードで書いて、必要な個所をCで書くことも出来るっぽい。

mrbgems

関連投稿

関連記事

Github

関連

アクセス解析タグ

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment