# API設計書

## 概要

本ドキュメントは、mruby（組み込み向け軽量Ruby実装）が提供するC言語APIの設計書です。mrubyはHTTP APIではなく、C言語から呼び出すネイティブAPIを提供します。ホストアプリケーションからRubyスクリプトを実行し、Ruby/C間のデータ交換やクラス定義を行うための関数群を定義しています。

## 共通仕様

### ベースインクルード

```c
#include <mruby.h>
```

必要に応じてサブヘッダーを追加:

```c
#include <mruby/string.h>
#include <mruby/array.h>
#include <mruby/hash.h>
#include <mruby/data.h>
#include <mruby/compile.h>
#include <mruby/class.h>
#include <mruby/variable.h>
#include <mruby/error.h>
#include <mruby/numeric.h>
#include <mruby/range.h>
#include <mruby/proc.h>
#include <mruby/dump.h>
```

### 共通型定義

| 型名 | 定義 | 説明 |
| --- | --- | --- |
| `mrb_state` | `struct mrb_state` | mrubyの仮想マシン状態 |
| `mrb_value` | Boxing依存 | mrubyの値（全てのRubyオブジェクトを表現） |
| `mrb_sym` | `uint32_t` | シンボルID |
| `mrb_int` | `int32_t` / `int64_t` | 整数値（設定依存） |
| `mrb_float` | `float` / `double` | 浮動小数点値（設定依存） |
| `mrb_bool` | `bool` / `uint8_t` | 真偽値 |
| `mrb_func_t` | `mrb_value (*)(mrb_state*, mrb_value)` | C関数ポインタ型 |
| `mrb_aspec` | `uint32_t` | メソッド引数仕様 |
| `mrb_args_format` | `const char*` | `mrb_get_args` 用フォーマット文字列 |

### API公開マーカー

| マーカー | 説明 |
| --- | --- |
| `MRB_API` | 公開API関数 |
| `MRB_INLINE` | インライン関数 |

### 共通エラーハンドリング

mrubyのC APIは例外をC言語レベルで`longjmp`により伝播します。エラー発生時は`mrb->exc`にエラーオブジェクトが設定されます。

| エラー種別 | マクロ | 説明 |
| --- | --- | --- |
| RuntimeError | `E_RUNTIME_ERROR` | 実行時エラー |
| TypeError | `E_TYPE_ERROR` | 型エラー |
| ArgumentError | `E_ARGUMENT_ERROR` | 引数エラー |
| NameError | `E_NAME_ERROR` | 名前エラー |
| NoMethodError | `E_NOMETHOD_ERROR` | メソッド未定義エラー |
| IndexError | `E_INDEX_ERROR` | インデックスエラー |
| RangeError | `E_RANGE_ERROR` | 範囲エラー |
| ZeroDivisionError | `E_ZERODIV_ERROR` | ゼロ除算エラー |
| FrozenError | `E_FROZEN_ERROR` | 凍結オブジェクト変更エラー |
| NotImplementedError | `E_NOTIMP_ERROR` | 未実装エラー |
| SyntaxError | `E_SYNTAX_ERROR` | 構文エラー |

## API一覧

| カテゴリ | 関数名 | 説明 |
| --- | --- | --- |
| VM管理 | `mrb_open` | mruby VMの新規作成 |
| VM管理 | `mrb_open_core` | コアのみのmruby VMの新規作成 |
| VM管理 | `mrb_close` | mruby VMの終了・解放 |
| VM管理 | `mrb_top_self` | トップレベルselfの取得 |
| VM管理 | `mrb_top_run` | プロシージャの実行 |
| VM管理 | `mrb_vm_run` | VM上でプロシージャを実行 |
| VM管理 | `mrb_vm_exec` | VM上で命令列を実行 |
| クラス定義 | `mrb_define_class` | 新しいクラスの定義 |
| クラス定義 | `mrb_define_module` | 新しいモジュールの定義 |
| クラス定義 | `mrb_define_class_under` | モジュール配下にクラスを定義 |
| クラス定義 | `mrb_define_module_under` | モジュール配下にモジュールを定義 |
| クラス定義 | `mrb_class_new` | 無名クラスの作成 |
| クラス定義 | `mrb_module_new` | 無名モジュールの作成 |
| クラス定義 | `mrb_include_module` | モジュールのインクルード |
| クラス定義 | `mrb_prepend_module` | モジュールのプリペンド |
| クラス定義 | `mrb_singleton_class` | 特異クラスの取得 |
| クラス参照 | `mrb_class_get` | 名前でクラスを取得 |
| クラス参照 | `mrb_class_get_under` | モジュール配下のクラスを取得 |
| クラス参照 | `mrb_module_get` | 名前でモジュールを取得 |
| クラス参照 | `mrb_module_get_under` | モジュール配下のモジュールを取得 |
| クラス参照 | `mrb_class_defined` | クラスの定義有無を確認 |
| クラス参照 | `mrb_class_defined_under` | モジュール配下のクラス定義有無を確認 |
| クラス参照 | `mrb_obj_class` | オブジェクトのクラスを取得 |
| メソッド定義 | `mrb_define_method` | インスタンスメソッドの定義 |
| メソッド定義 | `mrb_define_class_method` | クラスメソッドの定義 |
| メソッド定義 | `mrb_define_module_function` | モジュール関数の定義 |
| メソッド定義 | `mrb_define_singleton_method` | 特異メソッドの定義 |
| メソッド定義 | `mrb_define_private_method` | プライベートメソッドの定義 |
| メソッド定義 | `mrb_define_const` | 定数の定義 |
| メソッド定義 | `mrb_define_global_const` | グローバル定数の定義 |
| メソッド定義 | `mrb_define_alias` | エイリアスの定義 |
| メソッド定義 | `mrb_undef_method` | メソッドの未定義化 |
| メソッド定義 | `mrb_undef_class_method` | クラスメソッドの未定義化 |
| 引数取得 | `mrb_get_args` | メソッド引数の取得 |
| 引数取得 | `mrb_get_argc` | 引数の数を取得 |
| 引数取得 | `mrb_get_argv` | 引数配列を取得 |
| 引数取得 | `mrb_get_arg1` | 単一引数の取得 |
| 引数取得 | `mrb_block_given_p` | ブロック引数の有無を確認 |
| 関数呼出 | `mrb_funcall` | Ruby関数の呼び出し（可変長引数） |
| 関数呼出 | `mrb_funcall_argv` | Ruby関数の呼び出し（配列引数） |
| 関数呼出 | `mrb_funcall_with_block` | ブロック付きRuby関数の呼び出し |
| 値生成 | `mrb_fixnum_value` | 整数値の生成 |
| 値生成 | `mrb_int_value` | 整数値の生成（mrb_state使用） |
| 値生成 | `mrb_float_value` | 浮動小数点値の生成 |
| 値生成 | `mrb_nil_value` | nil値の生成 |
| 値生成 | `mrb_true_value` | true値の生成 |
| 値生成 | `mrb_false_value` | false値の生成 |
| 値生成 | `mrb_bool_value` | 真偽値の生成 |
| 値生成 | `mrb_symbol_value` | シンボル値の生成 |
| 値生成 | `mrb_obj_value` | オブジェクトポインタから値の生成 |
| 値生成 | `mrb_undef_value` | undef値の生成 |
| 値生成 | `mrb_cptr_value` | Cポインタ値の生成 |
| 文字列操作 | `mrb_str_new` | 文字列の新規作成 |
| 文字列操作 | `mrb_str_new_cstr` | C文字列からRuby文字列を作成 |
| 文字列操作 | `mrb_str_new_static` | 静的文字列の作成 |
| 文字列操作 | `mrb_str_new_capa` | 容量指定で空文字列を作成 |
| 文字列操作 | `mrb_str_concat` | 文字列の結合（破壊的） |
| 文字列操作 | `mrb_str_plus` | 文字列の結合（新規作成） |
| 文字列操作 | `mrb_str_cat` | C文字列の追加 |
| 文字列操作 | `mrb_str_cat_cstr` | NUL終端C文字列の追加 |
| 文字列操作 | `mrb_str_cat_str` | Ruby文字列の追加 |
| 文字列操作 | `mrb_str_append` | 文字列の末尾追加 |
| 文字列操作 | `mrb_str_resize` | 文字列のリサイズ |
| 文字列操作 | `mrb_str_substr` | 部分文字列の取得 |
| 文字列操作 | `mrb_str_index` | 部分文字列の検索 |
| 文字列操作 | `mrb_str_dup` | 文字列の複製 |
| 文字列操作 | `mrb_str_intern` | 文字列をシンボルに変換 |
| 文字列操作 | `mrb_str_equal` | 文字列の等価比較 |
| 文字列操作 | `mrb_str_cmp` | 文字列の比較 |
| 文字列操作 | `mrb_str_to_cstr` | Ruby文字列をC文字列に変換 |
| 文字列操作 | `mrb_str_to_integer` | 文字列を整数に変換 |
| 文字列操作 | `mrb_str_to_dbl` | 文字列を浮動小数点数に変換 |
| 文字列操作 | `mrb_obj_as_string` | オブジェクトを文字列に変換 |
| 文字列操作 | `mrb_string_cstr` | NUL終端C文字列ポインタの取得 |
| 配列操作 | `mrb_ary_new` | 空配列の作成 |
| 配列操作 | `mrb_ary_new_capa` | 容量指定で配列を作成 |
| 配列操作 | `mrb_ary_new_from_values` | 初期値付き配列の作成 |
| 配列操作 | `mrb_ary_push` | 配列末尾に要素を追加 |
| 配列操作 | `mrb_ary_pop` | 配列末尾から要素を削除 |
| 配列操作 | `mrb_ary_unshift` | 配列先頭に要素を追加 |
| 配列操作 | `mrb_ary_shift` | 配列先頭から要素を削除 |
| 配列操作 | `mrb_ary_entry` | 配列要素の取得 |
| 配列操作 | `mrb_ary_set` | 配列要素の設定 |
| 配列操作 | `mrb_ary_splice` | 配列の部分置換 |
| 配列操作 | `mrb_ary_concat` | 配列の結合 |
| 配列操作 | `mrb_ary_clear` | 配列のクリア |
| 配列操作 | `mrb_ary_join` | 配列要素の結合 |
| 配列操作 | `mrb_ary_resize` | 配列容量の更新 |
| 配列操作 | `mrb_ary_replace` | 配列の置換 |
| 配列操作 | `mrb_ary_dup` | 配列の複製 |
| 配列操作 | `mrb_ary_splat` | 値を配列に変換 |
| ハッシュ操作 | `mrb_hash_new` | 空ハッシュの作成 |
| ハッシュ操作 | `mrb_hash_new_capa` | 容量指定でハッシュを作成 |
| ハッシュ操作 | `mrb_hash_set` | ハッシュに値を設定 |
| ハッシュ操作 | `mrb_hash_get` | ハッシュから値を取得 |
| ハッシュ操作 | `mrb_hash_fetch` | デフォルト値付きでハッシュから取得 |
| ハッシュ操作 | `mrb_hash_delete_key` | ハッシュからキーを削除 |
| ハッシュ操作 | `mrb_hash_keys` | ハッシュのキー一覧を取得 |
| ハッシュ操作 | `mrb_hash_values` | ハッシュの値一覧を取得 |
| ハッシュ操作 | `mrb_hash_key_p` | キーの存在確認 |
| ハッシュ操作 | `mrb_hash_empty_p` | ハッシュの空判定 |
| ハッシュ操作 | `mrb_hash_size` | ハッシュのサイズ取得 |
| ハッシュ操作 | `mrb_hash_clear` | ハッシュのクリア |
| ハッシュ操作 | `mrb_hash_dup` | ハッシュの複製 |
| ハッシュ操作 | `mrb_hash_merge` | ハッシュのマージ |
| ハッシュ操作 | `mrb_hash_foreach` | ハッシュの反復処理 |
| Range操作 | `mrb_range_new` | Rangeの作成 |
| Range操作 | `mrb_range_ptr` | Rangeポインタの取得 |
| Range操作 | `mrb_range_beg_len` | Rangeの開始・長さの計算 |
| シンボル | `mrb_intern_cstr` | C文字列からシンボルを作成 |
| シンボル | `mrb_intern` | 長さ指定でシンボルを作成 |
| シンボル | `mrb_intern_static` | 静的文字列からシンボルを作成 |
| シンボル | `mrb_intern_str` | Ruby文字列からシンボルを作成 |
| シンボル | `mrb_sym_name` | シンボルから名前を取得 |
| シンボル | `mrb_sym_name_len` | シンボルから名前と長さを取得 |
| シンボル | `mrb_sym_str` | シンボルからRuby文字列を取得 |
| オブジェクト | `mrb_obj_new` | オブジェクトの新規作成 |
| オブジェクト | `mrb_obj_dup` | オブジェクトの複製 |
| オブジェクト | `mrb_obj_clone` | オブジェクトのクローン |
| オブジェクト | `mrb_obj_freeze` | オブジェクトの凍結 |
| オブジェクト | `mrb_obj_respond_to` | メソッド応答の確認 |
| オブジェクト | `mrb_respond_to` | メソッド応答の確認（値版） |
| オブジェクト | `mrb_obj_is_kind_of` | 種類判定 |
| オブジェクト | `mrb_obj_is_instance_of` | インスタンス判定 |
| オブジェクト | `mrb_obj_eq` | オブジェクトの同一性比較 |
| オブジェクト | `mrb_obj_equal` | オブジェクトの等価比較 |
| オブジェクト | `mrb_equal` | Rubyレベルの等価比較 |
| オブジェクト | `mrb_inspect` | オブジェクトのinspect |
| オブジェクト | `mrb_obj_id` | オブジェクトIDの取得 |
| 変数操作 | `mrb_iv_get` | インスタンス変数の取得 |
| 変数操作 | `mrb_iv_set` | インスタンス変数の設定 |
| 変数操作 | `mrb_iv_defined` | インスタンス変数の定義有無 |
| 変数操作 | `mrb_iv_remove` | インスタンス変数の削除 |
| 変数操作 | `mrb_gv_get` | グローバル変数の取得 |
| 変数操作 | `mrb_gv_set` | グローバル変数の設定 |
| 変数操作 | `mrb_gv_remove` | グローバル変数の削除 |
| 変数操作 | `mrb_cv_get` | クラス変数の取得 |
| 変数操作 | `mrb_cv_set` | クラス変数の設定 |
| 変数操作 | `mrb_const_get` | 定数の取得 |
| 変数操作 | `mrb_const_set` | 定数の設定 |
| 変数操作 | `mrb_const_defined` | 定数の定義有無 |
| 変数操作 | `mrb_const_remove` | 定数の削除 |
| 例外処理 | `mrb_raise` | 例外の発生 |
| 例外処理 | `mrb_raisef` | フォーマット付き例外の発生 |
| 例外処理 | `mrb_exc_new` | 例外オブジェクトの作成 |
| 例外処理 | `mrb_exc_raise` | 例外オブジェクトの送出 |
| 例外処理 | `mrb_protect_error` | 例外保護付き実行 |
| 例外処理 | `mrb_protect` | 例外保護付き実行（mrb_value版） |
| 例外処理 | `mrb_ensure` | ensure付き実行 |
| 例外処理 | `mrb_rescue` | rescue付き実行 |
| 例外処理 | `mrb_rescue_exceptions` | 指定例外クラスのrescue |
| 例外処理 | `mrb_clear_error` | エラー状態のクリア |
| 例外処理 | `mrb_check_error` | エラー状態の確認 |
| 例外処理 | `mrb_print_backtrace` | バックトレースの出力 |
| 例外処理 | `mrb_print_error` | エラーの出力 |
| GC管理 | `mrb_garbage_collect` | ガベージコレクションの実行 |
| GC管理 | `mrb_full_gc` | フルGCの実行 |
| GC管理 | `mrb_incremental_gc` | インクリメンタルGCの実行 |
| GC管理 | `mrb_gc_protect` | GC保護（アリーナに退避） |
| GC管理 | `mrb_gc_register` | GCルートに登録 |
| GC管理 | `mrb_gc_unregister` | GCルートから削除 |
| GC管理 | `mrb_object_dead_p` | オブジェクトの死亡判定 |
| データ型 | `mrb_data_object_alloc` | カスタムデータオブジェクトの作成 |
| データ型 | `mrb_data_get_ptr` | データポインタの取得 |
| データ型 | `mrb_data_check_type` | データ型チェック |
| データ型 | `mrb_data_check_get_ptr` | データポインタの安全な取得 |
| コンパイル・実行 | `mrb_load_string` | Ruby文字列のコンパイルと実行 |
| コンパイル・実行 | `mrb_load_file` | Rubyファイルのコンパイルと実行 |
| コンパイル・実行 | `mrb_load_nstring` | 長さ指定Ruby文字列のコンパイルと実行 |
| コンパイル・実行 | `mrb_load_string_cxt` | コンテキスト付き文字列実行 |
| コンパイル・実行 | `mrb_load_irep_file` | バイナリファイルのロードと実行 |
| コンパイル・実行 | `mrb_read_irep` | バイナリからIREPの読み込み |
| コンパイル・実行 | `mrb_read_irep_buf` | バッファからIREPの読み込み |
| Fiber | `mrb_fiber_new` | Fiberの作成 |
| Fiber | `mrb_fiber_resume` | Fiberの再開 |
| Fiber | `mrb_fiber_yield` | Fiberの中断 |
| Fiber | `mrb_fiber_alive_p` | Fiberの生存確認 |
| メモリ管理 | `mrb_malloc` | メモリ確保 |
| メモリ管理 | `mrb_calloc` | ゼロ初期化メモリ確保 |
| メモリ管理 | `mrb_realloc` | メモリ再確保 |
| メモリ管理 | `mrb_free` | メモリ解放 |
| メモリ管理 | `mrb_temp_alloc` | 一時メモリ確保 |
| 数値演算 | `mrb_num_add` | 数値の加算 |
| 数値演算 | `mrb_num_sub` | 数値の減算 |
| 数値演算 | `mrb_num_mul` | 数値の乗算 |
| 数値演算 | `mrb_integer_to_str` | 整数を文字列に変換 |
| 型変換 | `mrb_ensure_array_type` | 配列型への変換（保証） |
| 型変換 | `mrb_check_array_type` | 配列型への変換（チェック） |
| 型変換 | `mrb_ensure_hash_type` | ハッシュ型への変換（保証） |
| 型変換 | `mrb_ensure_string_type` | 文字列型への変換（保証） |
| 型変換 | `mrb_ensure_int_type` | 整数型への変換（保証） |
| 型変換 | `mrb_ensure_float_type` | 浮動小数点型への変換（保証） |
| 型変換 | `mrb_type_convert` | 型変換（メソッド呼出） |
| 型変換 | `mrb_check_type` | 型チェック |
| ユーティリティ | `mrb_p` | オブジェクトのp出力 |
| ユーティリティ | `mrb_format` | フォーマット文字列の生成 |
| ユーティリティ | `mrb_show_version` | バージョン表示 |
| ユーティリティ | `mrb_show_copyright` | 著作権情報表示 |
| ユーティリティ | `mrb_state_atexit` | 終了時コールバック登録 |
| ブロック・Yield | `mrb_yield` | ブロックへの値の受け渡し |
| ブロック・Yield | `mrb_yield_argv` | ブロックへの配列引数の受け渡し |
| ブロック・Yield | `mrb_yield_with_class` | クラス指定でブロックにyield |

## 各APIエンドポイント定義

### VM管理

#### 1. mrb_open

mruby仮想マシンの新規作成。全てのmruby操作の起点となる関数。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_state* mrb_open(void)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_state*` — 新しいmruby状態ポインタ。失敗時はNULLまたは`mrb->exc`が設定される |

**パラメータ**

なし

**使用例**

```c
mrb_state *mrb = mrb_open();
if (MRB_OPEN_FAILURE(mrb)) {
  if (mrb) mrb_close(mrb);
  return EXIT_FAILURE;
}
// mrubyの操作...
mrb_close(mrb);
```

**備考**

- `MRB_OPEN_FAILURE(mrb)` マクロで初期化の成否を確認すること
- 対応する `mrb_close()` で必ず解放が必要

---

#### 2. mrb_open_core

コアのみのmruby VM作成。Gemが不要な最小構成で起動する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_state* mrb_open_core(void)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_state*` — 新しいmruby状態ポインタ |

**パラメータ**

なし

---

#### 3. mrb_close

mruby VMを終了し、確保した全リソースを解放する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_close(mrb_state *mrb)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | 終了するmruby状態 |

---

#### 4. mrb_top_run

mruby VMに入りプロシージャを実行する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_top_run(mrb_state *mrb, const struct RProc *proc, mrb_value self, mrb_int stack_keep)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_value` — 実行結果 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| proc | `const struct RProc*` | ○ | 実行するプロシージャ |
| self | `mrb_value` | ○ | 実行コンテキストのself |
| stack_keep | `mrb_int` | ○ | スタックトップから保持する値の数 |

---

### クラス・モジュール定義

#### 5. mrb_define_class

新しいRubyクラスを定義する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API struct RClass* mrb_define_class(mrb_state *mrb, const char *name, struct RClass *super)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `struct RClass*` — 定義されたクラスへの参照 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| name | `const char*` | ○ | クラス名 |
| super | `struct RClass*` | ○ | 親クラス（`mrb->object_class`が一般的） |

**使用例**

```c
struct RClass *my_class = mrb_define_class(mrb, "MyClass", mrb->object_class);
```

---

#### 6. mrb_define_module

新しいRubyモジュールを定義する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API struct RClass* mrb_define_module(mrb_state *mrb, const char *name)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `struct RClass*` — 定義されたモジュールへの参照 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| name | `const char*` | ○ | モジュール名 |

---

#### 7. mrb_define_class_under

既存のモジュール/クラス配下にクラスを定義する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API struct RClass* mrb_define_class_under(mrb_state *mrb, struct RClass *outer, const char *name, struct RClass *super)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `struct RClass*` — 定義されたクラスへの参照 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| outer | `struct RClass*` | ○ | 親となるモジュール/クラス |
| name | `const char*` | ○ | クラス名 |
| super | `struct RClass*` | ○ | 親クラス |

---

#### 8. mrb_include_module

モジュールを別のクラス/モジュールにインクルードする。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_include_module(mrb_state *mrb, struct RClass *cla, struct RClass *included)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| cla | `struct RClass*` | ○ | インクルード先のクラス/モジュール |
| included | `struct RClass*` | ○ | インクルードするモジュール |

---

### メソッド定義

#### 9. mrb_define_method

クラスにインスタンスメソッドを定義する。Gem開発やC拡張で最も多用される関数。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_define_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t func, mrb_aspec aspec)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| cla | `struct RClass*` | ○ | メソッドを定義するクラス |
| name | `const char*` | ○ | メソッド名 |
| func | `mrb_func_t` | ○ | C関数ポインタ |
| aspec | `mrb_aspec` | ○ | 引数仕様（`MRB_ARGS_*`マクロで指定） |

**引数仕様マクロ（aspec）**

| マクロ | 説明 |
| --- | --- |
| `MRB_ARGS_NONE()` | 引数なし |
| `MRB_ARGS_REQ(n)` | 必須引数n個 |
| `MRB_ARGS_OPT(n)` | オプション引数n個 |
| `MRB_ARGS_ARG(n1,n2)` | 必須n1個+オプションn2個 |
| `MRB_ARGS_REST()` | 可変長引数 |
| `MRB_ARGS_POST(n)` | rest後の必須引数n個 |
| `MRB_ARGS_KEY(n1,n2)` | キーワード引数n1個、辞書n2 |
| `MRB_ARGS_BLOCK()` | ブロック引数 |
| `MRB_ARGS_ANY()` | 任意の数の引数 |

**使用例**

```c
mrb_value my_method(mrb_state *mrb, mrb_value self) {
  mrb_int x;
  mrb_get_args(mrb, "i", &x);
  return mrb_fixnum_value(x * 2);
}

void mrb_example_gem_init(mrb_state *mrb) {
  struct RClass *cls = mrb_define_class(mrb, "Example", mrb->object_class);
  mrb_define_method(mrb, cls, "double", my_method, MRB_ARGS_REQ(1));
}
```

---

#### 10. mrb_define_class_method

クラスメソッド（`def self.method`相当）を定義する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_define_class_method(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| cla | `struct RClass*` | ○ | クラス |
| name | `const char*` | ○ | メソッド名 |
| fun | `mrb_func_t` | ○ | C関数ポインタ |
| aspec | `mrb_aspec` | ○ | 引数仕様 |

---

#### 11. mrb_define_module_function

モジュール関数を定義する。`module_function`として定義される。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_define_module_function(mrb_state *mrb, struct RClass *cla, const char *name, mrb_func_t fun, mrb_aspec aspec)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| cla | `struct RClass*` | ○ | モジュール |
| name | `const char*` | ○ | 関数名 |
| fun | `mrb_func_t` | ○ | C関数ポインタ |
| aspec | `mrb_aspec` | ○ | 引数仕様 |

---

#### 12. mrb_define_const

クラス/モジュールに定数を定義する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_define_const(mrb_state *mrb, struct RClass *cla, const char *name, mrb_value val)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| cla | `struct RClass*` | ○ | 定数を定義するクラス/モジュール |
| name | `const char*` | ○ | 定数名 |
| val | `mrb_value` | ○ | 定数値 |

---

### 引数取得

#### 13. mrb_get_args

Cメソッド内でRuby側から渡された引数を取得する。mrubyのC拡張で最も重要な関数の一つ。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_int mrb_get_args(mrb_state *mrb, mrb_args_format format, ...)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_int` — 取得した引数の数 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| format | `mrb_args_format` | ○ | 引数フォーマット文字列 |
| ... | 可変長 | ○ | 結果を格納するポインタ |

**フォーマット指定子**

| 指定子 | Ruby型 | C型 | 説明 |
| --- | --- | --- | --- |
| `o` | Object | `mrb_value` | 任意のオブジェクト |
| `C` | Class/Module | `mrb_value` | クラス/モジュール |
| `S` | String | `mrb_value` | 文字列 |
| `A` | Array | `mrb_value` | 配列 |
| `H` | Hash | `mrb_value` | ハッシュ |
| `s` | String | `const char*, mrb_int` | C文字列+長さ |
| `z` | String | `const char*` | NUL終端文字列 |
| `a` | Array | `const mrb_value*, mrb_int` | C配列+長さ |
| `c` | Class | `struct RClass*` | クラスポインタ |
| `f` | Numeric | `mrb_float` | 浮動小数点数 |
| `i` | Numeric | `mrb_int` | 整数 |
| `b` | Boolean | `mrb_bool` | 真偽値 |
| `n` | String/Symbol | `mrb_sym` | シンボル |
| `d` | Data | `void*, mrb_data_type` | カスタムデータ |
| `&` | Block | `mrb_value` | ブロック引数 |
| `*` | Rest | `const mrb_value*, mrb_int` | 残余引数 |
| `\|` | - | - | オプション引数の区切り |
| `?` | - | `mrb_bool` | 直前のオプション引数の有無 |
| `:` | Keyword | `mrb_kwargs` | キーワード引数 |

**使用例**

```c
mrb_value method(mrb_state *mrb, mrb_value self) {
  const char *str;
  mrb_int len, num;
  mrb_get_args(mrb, "si", &str, &len, &num);
  // str: 文字列ポインタ, len: 文字列長, num: 整数値
  return mrb_nil_value();
}
```

---

### 関数呼出

#### 14. mrb_funcall

Ruby関数を呼び出す。可変長引数で引数を渡す。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_funcall(mrb_state *mrb, mrb_value val, const char *name, mrb_int argc, ...)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_value` — メソッドの戻り値 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| val | `mrb_value` | ○ | レシーバオブジェクト |
| name | `const char*` | ○ | メソッド名 |
| argc | `mrb_int` | ○ | 引数の数 |
| ... | `mrb_value` | - | 可変長引数 |

**使用例**

```c
mrb_value result = mrb_funcall(mrb, obj, "to_s", 0);
mrb_value sum = mrb_funcall(mrb, obj, "+", 1, mrb_fixnum_value(10));
```

---

#### 15. mrb_funcall_argv

型安全なRuby関数呼び出し。引数を配列で渡す。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_funcall_argv(mrb_state *mrb, mrb_value val, mrb_sym name, mrb_int argc, const mrb_value *argv)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_value` — メソッドの戻り値 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| val | `mrb_value` | ○ | レシーバオブジェクト |
| name | `mrb_sym` | ○ | メソッドシンボル |
| argc | `mrb_int` | ○ | 引数の数 |
| argv | `const mrb_value*` | ○ | 引数配列 |

---

### 文字列操作

#### 16. mrb_str_new

指定したC文字列とサイズからRuby文字列を作成する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_str_new(mrb_state *mrb, const char *p, mrb_int len)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_value` — Ruby文字列 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| p | `const char*` | ○ | 文字列データ |
| len | `mrb_int` | ○ | 文字列長 |

---

#### 17. mrb_str_new_cstr

NUL終端のC文字列からRuby文字列を作成する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_str_new_cstr(mrb_state *mrb, const char *p)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_value` — Ruby文字列 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| p | `const char*` | ○ | NUL終端C文字列 |

---

#### 18. mrb_str_concat

文字列を破壊的に結合する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_str_concat(mrb_state *mrb, mrb_value self, mrb_value other)` |
| ヘッダー | `mruby/string.h` |
| 戻り値 | なし（selfが変更される） |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| self | `mrb_value` | ○ | 結合先の文字列 |
| other | `mrb_value` | ○ | 結合する文字列 |

---

#### 19. mrb_str_cat

Ruby文字列にCバイト列を追加する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_str_cat(mrb_state *mrb, mrb_value str, const char *ptr, size_t len)` |
| ヘッダー | `mruby/string.h` |
| 戻り値 | `mrb_value` — 結合後の文字列 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| str | `mrb_value` | ○ | 対象文字列 |
| ptr | `const char*` | ○ | 追加するC文字列 |
| len | `size_t` | ○ | 追加する長さ |

---

### 配列操作

#### 20. mrb_ary_new

空のRuby配列を作成する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_ary_new(mrb_state *mrb)` |
| ヘッダー | `mruby/array.h` |
| 戻り値 | `mrb_value` — 空のRuby配列 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |

---

#### 21. mrb_ary_push

配列の末尾に要素を追加する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_ary_push(mrb_state *mrb, mrb_value array, mrb_value value)` |
| ヘッダー | `mruby/array.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| array | `mrb_value` | ○ | 対象配列 |
| value | `mrb_value` | ○ | 追加する値 |

---

#### 22. mrb_ary_entry

配列の指定インデックスの要素を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_ary_entry(mrb_value ary, mrb_int offset)` |
| ヘッダー | `mruby/array.h` |
| 戻り値 | `mrb_value` — 指定位置の要素 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| ary | `mrb_value` | ○ | 対象配列 |
| offset | `mrb_int` | ○ | インデックス（負数は末尾からのオフセット） |

---

### ハッシュ操作

#### 23. mrb_hash_new

空のRubyハッシュを作成する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_hash_new(mrb_state *mrb)` |
| ヘッダー | `mruby/hash.h` |
| 戻り値 | `mrb_value` — 空のRubyハッシュ |

---

#### 24. mrb_hash_set

ハッシュにキーと値のペアを設定する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_hash_set(mrb_state *mrb, mrb_value hash, mrb_value key, mrb_value val)` |
| ヘッダー | `mruby/hash.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| hash | `mrb_value` | ○ | 対象ハッシュ |
| key | `mrb_value` | ○ | キー |
| val | `mrb_value` | ○ | 値 |

---

#### 25. mrb_hash_get

ハッシュからキーに対応する値を取得する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key)` |
| ヘッダー | `mruby/hash.h` |
| 戻り値 | `mrb_value` — キーに対応する値 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| hash | `mrb_value` | ○ | 対象ハッシュ |
| key | `mrb_value` | ○ | キー |

---

### カスタムデータ型

#### 26. mrb_data_object_alloc

CのネイティブデータをラップするRubyオブジェクトを作成する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API struct RData* mrb_data_object_alloc(mrb_state *mrb, struct RClass *klass, void *datap, const mrb_data_type *type)` |
| ヘッダー | `mruby/data.h` |
| 戻り値 | `struct RData*` — データオブジェクト |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| klass | `struct RClass*` | ○ | Rubyクラス |
| datap | `void*` | ○ | ラップするCデータポインタ |
| type | `const mrb_data_type*` | ○ | データ型記述子 |

**mrb_data_type構造体**

```c
typedef struct mrb_data_type {
  const char *struct_name;                // データ型名
  void (*dfree)(mrb_state *mrb, void*);   // 解放関数
} mrb_data_type;
```

**使用例**

```c
static const mrb_data_type my_type = { "MyData", mrb_free };

mrb_value my_init(mrb_state *mrb, mrb_value self) {
  MyStruct *data = (MyStruct*)mrb_malloc(mrb, sizeof(MyStruct));
  mrb_data_init(self, data, &my_type);
  return self;
}
```

---

#### 27. mrb_data_get_ptr

RubyオブジェクトからCデータポインタを取得する。型チェック付き。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void* mrb_data_get_ptr(mrb_state *mrb, mrb_value obj, const mrb_data_type *type)` |
| ヘッダー | `mruby/data.h` |
| 戻り値 | `void*` — Cデータポインタ |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| obj | `mrb_value` | ○ | データオブジェクト |
| type | `const mrb_data_type*` | ○ | 期待するデータ型 |

---

### コンパイル・実行

#### 28. mrb_load_string

Ruby文字列をコンパイルして実行する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_load_string(mrb_state *mrb, const char *s)` |
| ヘッダー | `mruby/compile.h` |
| 戻り値 | `mrb_value` — 実行結果 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| s | `const char*` | ○ | Rubyソースコード文字列 |

**使用例**

```c
mrb_value result = mrb_load_string(mrb, "1 + 2");
// result => mrb_fixnum_value(3)
```

**備考**

- GCリークの可能性があるため、アリーナの保存/復元を推奨

```c
int ai = mrb_gc_arena_save(mrb);
mrb_value result = mrb_load_string(mrb, code);
mrb_gc_arena_restore(mrb, ai);
```

---

#### 29. mrb_load_file

Rubyファイルをコンパイルして実行する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_load_file(mrb_state *mrb, FILE *fp)` |
| ヘッダー | `mruby/compile.h` |
| 戻り値 | `mrb_value` — 実行結果 |
| 条件 | `MRB_NO_STDIO`が未定義の場合のみ利用可能 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| fp | `FILE*` | ○ | 読み込むファイルポインタ |

---

#### 30. mrb_load_string_cxt

コンパイラコンテキスト付きでRuby文字列を実行する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_load_string_cxt(mrb_state *mrb, const char *s, mrb_ccontext *cxt)` |
| ヘッダー | `mruby/compile.h` |
| 戻り値 | `mrb_value` — 実行結果 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| s | `const char*` | ○ | Rubyソースコード文字列 |
| cxt | `mrb_ccontext*` | ○ | コンパイラコンテキスト |

---

### 例外処理

#### 31. mrb_raise

指定した例外クラスでメッセージ付き例外を発生させる。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_noreturn void mrb_raise(mrb_state *mrb, struct RClass *c, const char *msg)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし（関数から戻らない） |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| c | `struct RClass*` | ○ | 例外クラス |
| msg | `const char*` | ○ | エラーメッセージ |

**使用例**

```c
mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
```

---

#### 32. mrb_protect_error

例外を捕捉しながら関数を実行する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_protect_error(mrb_state *mrb, mrb_protect_error_func *body, void *userdata, mrb_bool *error)` |
| ヘッダー | `mruby/error.h` |
| 戻り値 | `mrb_value` — 正常時は戻り値、エラー時は例外オブジェクト |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| body | `mrb_protect_error_func*` | ○ | 実行する関数 |
| userdata | `void*` | - | 関数に渡すユーザーデータ |
| error | `mrb_bool*` | ○ | エラー発生フラグ（TRUEでエラー） |

---

### GC管理

#### 33. mrb_garbage_collect

ガベージコレクションを実行する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_garbage_collect(mrb_state *mrb)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

---

#### 34. mrb_gc_protect

オブジェクトをGCアリーナに追加して保護する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_gc_protect(mrb_state *mrb, mrb_value obj)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| obj | `mrb_value` | ○ | 保護するオブジェクト |

**備考**

- `mrb_gc_arena_save`/`mrb_gc_arena_restore` と組み合わせて使用

---

#### 35. mrb_gc_register / mrb_gc_unregister

オブジェクトをGCルートに登録/削除してGCから保護する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void mrb_gc_register(mrb_state *mrb, mrb_value obj)` |
| | `MRB_API void mrb_gc_unregister(mrb_state *mrb, mrb_value obj)` |
| ヘッダー | `mruby.h` |
| 戻り値 | なし |

---

### 変数操作

#### 36. mrb_iv_get / mrb_iv_set

インスタンス変数の取得/設定を行う。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_iv_get(mrb_state *mrb, mrb_value obj, mrb_sym sym)` |
| | `MRB_API void mrb_iv_set(mrb_state *mrb, mrb_value obj, mrb_sym sym, mrb_value v)` |
| ヘッダー | `mruby/variable.h` |

**パラメータ（get）**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| obj | `mrb_value` | ○ | オブジェクト |
| sym | `mrb_sym` | ○ | インスタンス変数名シンボル |

---

#### 37. mrb_gv_get / mrb_gv_set

グローバル変数の取得/設定を行う。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_gv_get(mrb_state *mrb, mrb_sym sym)` |
| | `MRB_API void mrb_gv_set(mrb_state *mrb, mrb_sym sym, mrb_value val)` |
| ヘッダー | `mruby/variable.h` |

---

### Fiber

#### 38. mrb_fiber_new

新しいFiberを作成する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_fiber_new(mrb_state *mrb, const struct RProc *proc)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_value` — Fiberオブジェクト |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| proc | `const struct RProc*` | ○ | Fiberで実行するプロシージャ |

---

#### 39. mrb_fiber_resume

Fiberを再開して実行する。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_value mrb_fiber_resume(mrb_state *mrb, mrb_value fib, mrb_int argc, const mrb_value *argv)` |
| ヘッダー | `mruby.h` |
| 戻り値 | `mrb_value` — yieldされた値 |

**パラメータ**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| fib | `mrb_value` | ○ | Fiberオブジェクト |
| argc | `mrb_int` | ○ | 引数の数 |
| argv | `const mrb_value*` | ○ | 引数配列 |

---

### メモリ管理

#### 40. mrb_malloc / mrb_calloc / mrb_realloc / mrb_free

mrubyが管理するメモリの確保・解放を行う。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API void* mrb_malloc(mrb_state *mrb, size_t size)` |
| | `MRB_API void* mrb_calloc(mrb_state *mrb, size_t nelem, size_t len)` |
| | `MRB_API void* mrb_realloc(mrb_state *mrb, void *ptr, size_t size)` |
| | `MRB_API void mrb_free(mrb_state *mrb, void *ptr)` |
| ヘッダー | `mruby.h` |

**備考**

- `mrb_malloc`, `mrb_calloc`, `mrb_realloc` はメモリ確保失敗時にRuntimeErrorを発生させる
- `mrb_malloc_simple`, `mrb_realloc_simple` は失敗時にNULLを返す

---

### コンパイラコンテキスト

#### 41. mrb_ccontext_new / mrb_ccontext_free

コンパイラコンテキストの作成と解放。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_ccontext* mrb_ccontext_new(mrb_state *mrb)` |
| | `MRB_API void mrb_ccontext_free(mrb_state *mrb, mrb_ccontext *cxt)` |
| ヘッダー | `mruby/compile.h` |

**使用例**

```c
mrb_ccontext *cxt = mrb_ccontext_new(mrb);
mrb_ccontext_filename(mrb, cxt, "example.rb");
mrb_value result = mrb_load_string_cxt(mrb, "puts 'hello'", cxt);
mrb_ccontext_free(mrb, cxt);
```

---

### バイナリIREP

#### 42. mrb_read_irep_buf / mrb_load_irep_file

コンパイル済みバイナリ（mrb形式）の読み込みと実行。

**基本情報**

| 項目 | 内容 |
| --- | --- |
| 関数シグネチャ | `MRB_API mrb_irep* mrb_read_irep_buf(mrb_state *mrb, const void *bin, size_t len)` |
| | `MRB_API mrb_value mrb_load_irep_file(mrb_state *mrb, FILE *fp)` |
| ヘッダー | `mruby/dump.h` |

**パラメータ（mrb_read_irep_buf）**

| パラメータ名 | 型 | 必須 | 説明 |
| --- | --- | --- | --- |
| mrb | `mrb_state*` | ○ | mruby状態 |
| bin | `const void*` | ○ | バイナリデータ |
| len | `size_t` | ○ | データサイズ |

---

## 備考

### 型判定マクロ

| マクロ | 説明 |
| --- | --- |
| `mrb_nil_p(o)` | nil判定 |
| `mrb_true_p(o)` | true判定 |
| `mrb_false_p(o)` | false判定 |
| `mrb_integer_p(o)` | 整数判定 |
| `mrb_float_p(o)` | 浮動小数点判定 |
| `mrb_symbol_p(o)` | シンボル判定 |
| `mrb_string_p(o)` | 文字列判定 |
| `mrb_array_p(o)` | 配列判定 |
| `mrb_hash_p(o)` | ハッシュ判定 |
| `mrb_data_p(o)` | データオブジェクト判定 |
| `mrb_undef_p(o)` | 未定義判定 |
| `mrb_immediate_p(o)` | 即値判定 |

### 値アクセスマクロ

| マクロ | 説明 |
| --- | --- |
| `mrb_fixnum(o)` / `mrb_integer(o)` | 整数値の取得 |
| `mrb_float(o)` | 浮動小数点値の取得 |
| `mrb_symbol(o)` | シンボルの取得 |
| `mrb_ptr(o)` | オブジェクトポインタの取得 |
| `mrb_type(o)` | 型情報の取得（enum mrb_vtype） |
| `RSTRING_PTR(s)` | 文字列のcharポインタ |
| `RSTRING_LEN(s)` | 文字列の長さ |
| `RARRAY_PTR(a)` | 配列の要素ポインタ |
| `RARRAY_LEN(a)` | 配列の長さ |

### GCアリーナの使用パターン

```c
int ai = mrb_gc_arena_save(mrb);
// mrb_valueを生成する処理
mrb_gc_arena_restore(mrb, ai);
```

### 条件コンパイルフラグ

| フラグ | 説明 |
| --- | --- |
| `MRB_NO_FLOAT` | 浮動小数点サポートの無効化 |
| `MRB_USE_FLOAT32` | 32bit floatの使用（デフォルトは64bit double） |
| `MRB_INT64` | 64bit整数の使用（デフォルトは32bit） |
| `MRB_NO_STDIO` | 標準I/O関数の無効化 |
| `MRB_UTF8_STRING` | UTF-8文字列サポートの有効化 |
| `MRB_GC_FIXED_ARENA` | 固定サイズGCアリーナの使用 |
