# データベース設計書

## 概要

本ドキュメントは、mruby（軽量Ruby実装）プロジェクトにおける内部データ構造の設計書である。mrubyはリレーショナルデータベースを使用するアプリケーションではなく、C言語で実装されたプログラミング言語ランタイムである。そのため、従来のSQLテーブル定義は存在しない。

本設計書では、mrubyの仮想マシン（VM）が管理するインメモリデータ構造体を「テーブル」に相当するエンティティとして整理し、各構造体のフィールド定義、構造体間の関連性を記述する。これらの構造体はオブジェクトの表現、メモリ管理、コード実行の基盤を形成している。

## テーブル一覧

| テーブル名 | 対応エンティティ | 説明 |
| --- | --- | --- |
| mrb_state | VM状態 | mrubyのVM全体の状態を管理する中核構造体 |
| mrb_context | 実行コンテキスト | Fiber/タスクごとの実行コンテキスト（スタック、コールスタック） |
| mrb_callinfo | コールフレーム | メソッド呼び出し時のフレーム情報 |
| mrb_gc | GC管理 | ガベージコレクションの状態管理 |
| RBasic | 基底オブジェクト | 全てのmrubyオブジェクトの基底構造体 |
| RObject | 一般オブジェクト | インスタンス変数テーブルを持つ一般オブジェクト |
| RClass | クラス/モジュール | クラスおよびモジュールの定義 |
| RString | 文字列 | Ruby文字列オブジェクトの内部表現 |
| RArray | 配列 | Ruby配列オブジェクトの内部表現 |
| RHash | ハッシュ | Rubyハッシュオブジェクトの内部表現 |
| RProc | Proc | Procオブジェクト（メソッド本体、ブロック、ラムダ） |
| REnv | 環境 | クロージャの環境（レキシカルスコープ変数の保持） |
| RRange | 範囲 | Rangeオブジェクトの内部表現 |
| RData | Cデータラッパー | ネイティブCデータのRubyラッパー |
| RFiber | ファイバー | Fiberオブジェクトの内部表現 |
| RException | 例外 | 例外オブジェクトの内部表現 |
| mrb_irep | 中間表現 | コンパイル済みRubyコードの中間表現 |
| mrb_irep_pool | 定数プール | irepが参照するリテラル値のプール |
| mrb_irep_debug_info | デバッグ情報 | irepに紐づくデバッグ情報 |
| mrb_irep_debug_info_file | デバッグファイル情報 | ソースファイルごとの行番号マッピング |
| mrb_method_t | メソッド | メソッドの内部表現（Proc参照またはC関数） |
| mrb_mt_tbl | メソッドテーブル | クラスのメソッドディスパッチテーブル |
| mrb_mt_entry | メソッドエントリ | メソッドテーブル内の個別エントリ |
| mrb_cache_entry | メソッドキャッシュ | メソッド検索結果のキャッシュエントリ |
| mrb_irep_catch_handler | 例外ハンドラ | rescue/ensureの例外捕捉ハンドラ定義 |
| mrb_shared_array | 共有配列 | 配列間で共有されるデータ領域 |
| mrb_data_type | データ型記述子 | RDataの型情報と解放関数 |

## 各テーブル定義

### 1. mrb_state

mrubyのVM全体の状態を管理する中核構造体。全てのクラス、GC、シンボルテーブル、実行コンテキストへの参照を保持する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| jmp | struct mrb_jmpbuf* | YES | 例外ジャンプ先のポインタ |
| c | struct mrb_context* | NO | 現在の実行コンテキスト |
| root_c | struct mrb_context* | NO | ルート（メイン）実行コンテキスト |
| globals | struct iv_tbl* | YES | グローバル変数テーブル |
| exc | struct RObject* | YES | 現在の例外オブジェクト |
| top_self | struct RObject* | NO | トップレベルのselfオブジェクト |
| object_class | struct RClass* | NO | Objectクラスへの参照 |
| class_class | struct RClass* | NO | Classクラスへの参照 |
| module_class | struct RClass* | NO | Moduleクラスへの参照 |
| proc_class | struct RClass* | NO | Procクラスへの参照 |
| string_class | struct RClass* | NO | Stringクラスへの参照 |
| array_class | struct RClass* | NO | Arrayクラスへの参照 |
| hash_class | struct RClass* | NO | Hashクラスへの参照 |
| range_class | struct RClass* | NO | Rangeクラスへの参照 |
| float_class | struct RClass* | YES | Floatクラスへの参照（MRB_NO_FLOAT時はなし） |
| integer_class | struct RClass* | NO | Integerクラスへの参照 |
| true_class | struct RClass* | NO | TrueClassへの参照 |
| false_class | struct RClass* | NO | FalseClassへの参照 |
| nil_class | struct RClass* | NO | NilClassへの参照 |
| symbol_class | struct RClass* | NO | Symbolクラスへの参照 |
| kernel_module | struct RClass* | NO | Kernelモジュールへの参照 |
| gc | mrb_gc | NO | GC管理構造体（インライン） |
| bootstrapping | mrb_bool | NO | 初期化中フラグ |
| cache | struct mrb_cache_entry[] | NO | メソッドキャッシュ配列（MRB_METHOD_CACHE_SIZE個） |
| symidx | mrb_sym | NO | 次に割り当てるシンボルID |
| symtbl | const char** | NO | シンボル名テーブル |
| symcapa | size_t | NO | シンボルテーブルの容量 |
| symhash | struct mrb_sym_hash_table* | YES | シンボルハッシュテーブル |
| sym_pool | void* | YES | シンボル文字列用メモリプール |
| symbuf | char[8] | NO | 小さなシンボル名のバッファ |
| eException_class | struct RClass* | NO | Exceptionクラスへの参照 |
| eStandardError_class | struct RClass* | NO | StandardErrorクラスへの参照 |
| nomem_err | struct RObject* | YES | 事前割り当て済みNoMemoryError |
| stack_err | struct RObject* | YES | 事前割り当て済みSystemStackError |
| arena_err | struct RObject* | YES | 事前割り当て済みアリーナオーバーフローエラー |
| rom_mt | struct mrb_mt_rom_list* | YES | ROMメソッドテーブルラッパーのリスト |
| ud | void* | YES | ユーザー定義補助データ |
| atexit_stack | mrb_atexit_func[] | YES | 終了時コールバック関数のスタック |
| atexit_stack_len | uint16_t | NO | atexitスタックの長さ |

### 2. mrb_context

Fiber/タスクごとの実行コンテキスト。VMのスタックとコールスタックを管理する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| prev | struct mrb_context* | YES | 前のコンテキスト（Fiber切り替え時） |
| stbase | mrb_value* | NO | VMスタックの先頭アドレス |
| stend | mrb_value* | NO | VMスタックの終端アドレス |
| ci | mrb_callinfo* | NO | 現在のコールフレーム |
| cibase | mrb_callinfo* | NO | コールフレームスタックの先頭 |
| ciend | mrb_callinfo* | NO | コールフレームスタックの終端 |
| status | enum mrb_fiber_state (4bit) | NO | ファイバーの状態（CREATED/RUNNING/RESUMED/SUSPENDED/TRANSFERRED/TERMINATED） |
| vmexec | mrb_bool (1bit) | NO | VM実行中フラグ |
| fib | struct RFiber* | YES | 所属するFiberオブジェクトへの参照 |

### 3. mrb_callinfo

メソッド呼び出し時のコールフレーム情報。各メソッド呼び出しに対応する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| n | uint8_t (4bit) | NO | 通常引数の数（15=可変長引数） |
| nk | uint8_t (4bit) | NO | キーワード引数の数（15=可変長） |
| cci | uint8_t | NO | C関数から呼び出されたかのフラグ |
| vis | uint8_t | NO | メソッド可視性とモジュールフラグ |
| mid | mrb_sym | NO | メソッドのシンボルID |
| proc | const struct RProc* | YES | 実行中のProcオブジェクト |
| blk | struct RProc* | YES | ブロック引数 |
| stack | mrb_value* | NO | このフレームのスタック位置 |
| pc | const mrb_code* | YES | 現在のプログラムカウンタ |
| u.env | struct REnv* | YES | 環境オブジェクト（共用体） |
| u.target_class | struct RClass* | YES | ターゲットクラス（共用体） |

### 4. mrb_gc

ガベージコレクションの状態管理構造体。三色マーキング方式の世代別GCを実装する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| heaps | struct mrb_heap_page* | YES | 全ヒープページのリスト |
| free_heaps | struct mrb_heap_page* | YES | 割り当て用空きヒープページ |
| sweeps | struct mrb_heap_page* | YES | スイープ開始ページ |
| gray_stack | struct RBasic*[MRB_GRAY_STACK_SIZE] | NO | グレーオブジェクトのスタック |
| gray_stack_top | size_t | NO | グレースタックのトップインデックス |
| gray_overflow | mrb_bool (1bit) | NO | グレースタックオーバーフローフラグ |
| live | size_t | NO | 生存オブジェクト数 |
| live_after_mark | size_t | NO | マーク後の旧世代オブジェクト数 |
| threshold | size_t | NO | GC開始しきい値 |
| oldgen_threshold | size_t | NO | メジャーGC開始しきい値 |
| state | mrb_gc_state | NO | 現在のGC状態（ROOT/MARK/SWEEP） |
| interval_ratio | int | NO | GC間隔比率 |
| step_ratio | int | NO | GCステップ比率 |
| current_white_part | int (2bit) | NO | 現在の白色パーティション |
| iterating | mrb_bool (1bit) | NO | オブジェクト走査中フラグ |
| disabled | mrb_bool (1bit) | NO | GC無効化フラグ |
| generational | mrb_bool (1bit) | NO | 世代別GCモード |
| full | mrb_bool (1bit) | NO | メジャーGCモード |
| out_of_memory | mrb_bool (1bit) | NO | メモリ不足発生フラグ |
| arena | struct RBasic*[] | NO | GC保護配列（アリーナ） |
| arena_idx | int | NO | アリーナの現在インデックス |

### 5. RBasic

全てのmrubyオブジェクトの基底構造体。MRB_OBJECT_HEADERマクロにより全オブジェクトに共通のフィールドが定義される。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| c | struct RClass* | YES | オブジェクトが属するクラス |
| tt | enum mrb_vtype (8bit) | NO | オブジェクトの型タグ（MRB_TT_*） |
| gc_color | unsigned int (3bit) | NO | GCカラー（白/灰/黒） |
| frozen | unsigned int (1bit) | NO | オブジェクトの凍結状態 |
| flags | uint32_t (20bit) | NO | 型固有のフラグビットフィールド |

### 6. RObject

インスタンス変数テーブルを持つ一般オブジェクト。RBasicを拡張する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| iv | struct iv_tbl* | YES | インスタンス変数テーブル |

### 7. RClass

クラスおよびモジュールの定義構造体。メソッドテーブルとスーパークラスチェーンを保持する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| iv | struct iv_tbl* | YES | インスタンス変数/定数テーブル |
| mt | struct mrb_mt_tbl* | YES | メソッドテーブル |
| super | struct RClass* | YES | スーパークラスへのポインタ |

flagsフィールドの用途:
- bit 0-5: インスタンス型（MRB_TT_*）
- bit 6: Class#allocate禁止フラグ
- bit 17: 継承済みフラグ（メソッドキャッシュ用）
- bit 18: originフラグ
- bit 19: prependedフラグ
- bit 20: frozenフラグ

### 8. RString

Ruby文字列オブジェクトの内部表現。短い文字列はオブジェクト内に埋め込み（embed）、長い文字列はヒープに格納する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| as.heap.len | mrb_ssize | NO | 文字列の長さ（ヒープモード時） |
| as.heap.aux.capa | mrb_ssize | NO | 割り当て済み容量（通常モード時） |
| as.heap.aux.shared | struct mrb_shared_string* | YES | 共有文字列参照（共有モード時） |
| as.heap.aux.fshared | struct RString* | YES | 凍結共有文字列参照 |
| as.heap.ptr | char* | YES | 文字列データへのポインタ（ヒープモード時） |

flagsフィールドの用途:
- bit 0-3: 文字列タイプ（NORMAL=0, SHARED=1, FSHARED=2, NOFREE=4, EMBED=8）
- bit 4: バイナリ文字列フラグ
- bit 5: シングルバイト文字列フラグ
- bit 6-10: 埋め込み長さ（embedモード時）

### 9. RArray

Ruby配列オブジェクトの内部表現。小さな配列はオブジェクト内に埋め込み可能。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| as.heap.len | mrb_ssize | NO | 配列の長さ（ヒープモード時） |
| as.heap.aux.capa | mrb_ssize | NO | 割り当て済み容量 |
| as.heap.aux.shared | mrb_shared_array* | YES | 共有配列参照 |
| as.heap.ptr | mrb_value* | YES | 配列要素へのポインタ（ヒープモード時） |
| as.ary | mrb_value[] | NO | 埋め込み配列データ（embedモード時） |

flagsフィールドの用途:
- bit 0-2: 埋め込み長さ+1（embedモード時、0は非embed）
- bit 8: 共有配列フラグ（MRB_ARY_SHARED）

### 10. RHash

Rubyハッシュオブジェクトの内部表現。小さなハッシュはリニアサーチ配列（ea）、大きなハッシュはハッシュテーブル（ht）を使用する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| iv | struct iv_tbl* | YES | インスタンス変数テーブル |
| size | uint32_t | NO | ハッシュ内の要素数 |
| ea_capa | uint32_t | NO | エントリ配列の容量（64bit時のみ独立フィールド） |
| ea_n_used | uint32_t | NO | エントリ配列の使用済みスロット数（64bit時のみ独立フィールド） |
| hsh.ea | struct hash_entry* | YES | エントリ配列（リニアサーチ用） |
| hsh.ht | struct hash_table* | YES | ハッシュテーブル（大規模時） |

flagsフィールドの用途:
- bit 0-4: ハッシュテーブルのビット数（HT使用時）/ エントリ配列容量（EA使用時）
- bit 5-9: エントリ配列の使用済みスロット数
- bit 10: デフォルト値フラグ
- bit 11: Procデフォルトフラグ
- bit 12: ハッシュテーブルモードフラグ

### 11. RProc

Procオブジェクト。メソッド本体、ブロック、ラムダを表現する。C関数またはirepのいずれかを保持する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| body.irep | const mrb_irep* | YES | Rubyメソッド時の中間表現（共用体） |
| body.func | mrb_func_t | YES | Cメソッド時の関数ポインタ（共用体） |
| body.mid | mrb_sym | NO | エイリアスメソッド時のシンボル（共用体） |
| upper | const struct RProc* | YES | 外側のProc（レキシカルスコープ） |
| e.target_class | struct RClass* | YES | ターゲットクラス（共用体、ENV無し時） |
| e.env | struct REnv* | YES | 環境オブジェクト（共用体、ENV有り時） |

flagsフィールドの用途:
- bit 7: C関数フラグ（MRB_PROC_CFUNC_FL）
- bit 8: strictフラグ
- bit 9: orphanフラグ
- bit 10: 環境設定済みフラグ（MRB_PROC_ENVSET）
- bit 11: スコープフラグ
- bit 12: 引数なしフラグ
- bit 13: エイリアスフラグ

### 12. REnv

クロージャの環境オブジェクト。レキシカルスコープ内のローカル変数をキャプチャして保持する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| stack | mrb_value* | YES | キャプチャされた変数のスタック |
| cxt | struct mrb_context* | YES | 共有元のコンテキスト（NULLでクローズド） |
| mid | mrb_sym | NO | メソッドのシンボルID |

flagsフィールドの用途:
- bit 0-7: スタック長
- bit 8-15: ブロック引数インデックス
- bit 16-17: メソッド可視性
- bit 18: 可視性ブレークフラグ

### 13. RRange

Rangeオブジェクトの内部表現。開始値と終了値、排他フラグを保持する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| beg | mrb_value | NO | 範囲の開始値（embedモード時） |
| end | mrb_value | NO | 範囲の終了値（embedモード時） |
| edges | mrb_range_edges* | YES | 範囲の開始/終了値へのポインタ（非embedモード時） |
| excl | mrb_bool | NO | 終了値を排他するか（TRUE=排他） |

### 14. RData

ネイティブCデータのRubyラッパー。ユーザー定義のC構造体をRubyオブジェクトとして扱う。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| iv | struct iv_tbl* | YES | インスタンス変数テーブル |
| type | const mrb_data_type* | YES | データ型記述子 |
| data | void* | YES | ネイティブデータへのポインタ |

### 15. RFiber

Fiberオブジェクトの内部表現。独自のコンテキストを保持する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| cxt | struct mrb_context* | YES | ファイバー固有の実行コンテキスト |

### 16. RException

例外オブジェクトの内部表現。RObjectと同じ構造を持つ（tt == MRB_TT_EXCEPTION）。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| (MRB_OBJECT_HEADER) | - | - | RBasicと同じ共通ヘッダ |
| iv | struct iv_tbl* | YES | インスタンス変数テーブル（メッセージ、バックトレース等） |

### 17. mrb_irep

コンパイル済みRubyコードの中間表現。バイトコード命令列、定数プール、シンボル、子irepへの参照を保持する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| nlocals | uint16_t | NO | ローカル変数の数 |
| nregs | uint16_t | NO | レジスタ変数の数 |
| clen | uint16_t | NO | 例外ハンドラの数 |
| flags | uint8_t | NO | フラグ（MRB_ISEQ_NO_FREE, MRB_IREP_NO_FREE） |
| iseq | const mrb_code* | NO | バイトコード命令列 |
| pool | const mrb_irep_pool* | YES | 定数プール |
| syms | const mrb_sym* | YES | シンボルテーブル |
| reps | const struct mrb_irep* const* | YES | 子irep（ブロック、ネストメソッド）の配列 |
| lv | const mrb_sym* | YES | ローカル変数名テーブル |
| debug_info | struct mrb_irep_debug_info* | YES | デバッグ情報 |
| ilen | uint32_t | NO | 命令列の長さ |
| plen | uint16_t | NO | 定数プールの長さ |
| slen | uint16_t | NO | シンボルテーブルの長さ |
| rlen | uint16_t | NO | 子irepの数 |
| refcnt | uint16_t | NO | 参照カウント |

### 18. mrb_irep_pool

irepが参照するリテラル値のプール。文字列、整数、浮動小数点数を格納する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| tt | uint32_t | NO | 型と長さ（文字列時）のパック値 |
| u.str | const char* | YES | 文字列データ（IREP_TT_STR/IREP_TT_SSTR時） |
| u.i32 | int32_t | NO | 32bit整数値（IREP_TT_INT32時） |
| u.i64 | int64_t | NO | 64bit整数値（IREP_TT_INT64時） |
| u.f | mrb_float | NO | 浮動小数点値（IREP_TT_FLOAT時） |

### 19. mrb_irep_debug_info

irepに紐づくデバッグ情報のトップレベル構造体。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| pc_count | uint32_t | NO | プログラムカウンタの総数 |
| flen | uint16_t | NO | ファイル情報の数 |
| files | mrb_irep_debug_info_file** | YES | ファイルごとのデバッグ情報配列 |

### 20. mrb_irep_debug_info_file

ソースファイルごとの行番号マッピング情報。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| start_pos | uint32_t | NO | 対応するiseq内の開始位置 |
| filename_sym | mrb_sym | NO | ファイル名のシンボルID |
| line_entry_count | uint32_t | NO | 行エントリの数 |
| line_type | mrb_debug_line_type | NO | 行情報のエンコード方式（ary/flat_map/packed_map） |
| lines.ary | const uint16_t* | YES | 行番号配列（ary方式時） |
| lines.flat_map | const mrb_irep_debug_info_line* | YES | 行情報フラットマップ（flat_map方式時） |
| lines.packed_map | const uint8_t* | YES | パック済み行情報（packed_map方式時） |

### 21. mrb_method_t

メソッドの内部表現。Procオブジェクトへの参照またはC関数ポインタのいずれかを保持する。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| flags | uint32_t | NO | メソッドフラグ（FUNC/PROC、可視性など） |
| as.proc | const struct RProc* | YES | Procオブジェクト（PROC時） |
| as.func | mrb_func_t | YES | C関数ポインタ（FUNC時） |

flagsフィールドの用途:
- bit 24: C関数フラグ（MRB_METHOD_FUNC_FL）
- bit 25: プライベートフラグ
- bit 26: プロテクテッドフラグ

### 22. mrb_mt_tbl

クラスのメソッドディスパッチテーブル。連結リスト構造でROMテーブルのチェーンをサポートする。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| size | int | NO | 現在のエントリ数 |
| alloc | int | NO | 割り当て容量（bit30: readonly, bit29: frozen） |
| ptr | mrb_mt_entry* | YES | エントリ配列へのポインタ |
| next | struct mrb_mt_tbl* | YES | 次のメソッドテーブル（ROMチェーン） |

### 23. mrb_mt_entry

メソッドテーブル内の個別エントリ。シンボルキーとメソッド値のペア。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| val.proc | const struct RProc* | YES | Procオブジェクト（共用体） |
| val.func | mrb_func_t | YES | C関数ポインタ（共用体） |
| key | mrb_sym | NO | メソッド名のシンボルID |
| flags | uint32_t | NO | メソッドフラグ + aspec |

### 24. mrb_cache_entry

メソッド検索結果のキャッシュエントリ。ディスパッチ高速化のために使用される。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| c | struct RClass* | YES | メソッドが見つかったクラス |
| c0 | struct RClass* | YES | 検索を開始したクラス |
| mid | mrb_sym | NO | メソッド名のシンボルID |
| m | mrb_method_t | NO | メソッド情報 |

### 25. mrb_irep_catch_handler

rescue/ensureの例外捕捉ハンドラ定義。irepの命令列の後に配置される。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| type | uint8_t | NO | ハンドラ種別（RESCUE=0, ENSURE=1） |
| begin | uint8_t[4] | NO | ハンドラ対象範囲の開始アドレス |
| end | uint8_t[4] | NO | ハンドラ対象範囲の終了アドレス |
| target | uint8_t[4] | NO | マッチ時のジャンプ先アドレス |

### 26. mrb_shared_array

配列間で共有されるデータ領域。コピーオンライト最適化に使用される。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| refcnt | int | NO | 参照カウント |
| len | mrb_ssize | NO | 配列の長さ |
| ptr | mrb_value* | YES | 配列要素へのポインタ |

### 27. mrb_data_type

RDataの型情報と解放関数を定義する記述子。

| カラム名 | データ型 | NULL | 説明 |
| --- | --- | --- | --- |
| struct_name | const char* | NO | データ型の名前 |
| dfree | void (*)(mrb_state*, void*) | YES | データ解放用コールバック関数 |

## 備考

### プロジェクトの特性について

mrubyはRuby言語の軽量実装であり、組み込みシステム向けに設計されたプログラミング言語ランタイムである。本設計書で記述したデータ構造は、SQLデータベースのテーブルではなく、C言語のヒープ上に動的に確保されるインメモリ構造体である。

### 主要なデータ管理パターン

1. **オブジェクトヘッダ共有**: 全てのRubyオブジェクト（RBasic, RObject, RClass, RString等）は `MRB_OBJECT_HEADER` マクロにより共通のヘッダフィールドを持つ。これはOOP的な継承に相当する。
2. **共用体による多態性**: RProc.body, RHash.hsh, RArray.as 等で共用体（union）を使用し、状態に応じて異なる型のデータを同一メモリ領域に格納する。
3. **埋め込み最適化**: RString, RArray では短いデータをオブジェクト自体に埋め込むことで、追加のメモリ割り当てを回避する最適化を行っている。
4. **参照カウントとGC併用**: mrb_irep は参照カウントで管理され、一般のオブジェクトは三色マーキング方式の世代別GCで管理される。
5. **フラグビットフィールド**: 各構造体のflagsフィールドをビットフィールドとして活用し、メモリ効率を最大化している。

### 条件付きコンパイルによる構造の変化

以下のコンパイル時定義により、構造体の内容が変化する:

- `MRB_NO_FLOAT`: Floatサポートを無効化（float_classが存在しなくなる）
- `MRB_INT64`: 整数型を64bitに変更
- `MRB_NAN_BOXING` / `MRB_WORD_BOXING`: 値のボクシング方式を変更
- `MRB_GC_FIXED_ARENA`: GCアリーナを固定サイズ配列に変更
- `MRB_NO_METHOD_CACHE`: メソッドキャッシュを無効化
- `MRB_ARY_NO_EMBED`: 配列の埋め込み最適化を無効化
- `MRB_RANGE_EMBED`: RangeをEmbed方式に変更
- `MRB_UTF8_STRING`: UTF-8文字列サポートを有効化
