# 機能設計書 9-Objectクラス

## 概要

本ドキュメントは、mrubyのObjectクラスの設計を記述する。全オブジェクトの基底クラスであり、オブジェクトの型判定・比較・変換・コピー等の基本操作を提供する。

### 本機能の処理概要

Objectクラスはmrubyのクラス階層のルートであり、NilClass, TrueClass, FalseClassの定義も含む。全オブジェクトに共通する基本操作（等値比較、型変換、型チェック）を提供する。boxing方式に応じた効率的な等値比較や、型変換メソッドの呼び出し基盤を実装している。

**業務上の目的・背景**：Rubyの全オブジェクトはObjectクラスを継承するため、共通の基本操作をここで定義する必要がある。nil, true, falseの専用クラスもここで初期化される。

**機能の利用シーン**：オブジェクト比較（`==`, `eql?`, `equal?`）、型チェック（`is_a?`, `kind_of?`, `instance_of?`）、型変換（`to_s`, `to_i`等のダックタイピング変換）、nil/true/false値の操作。

**主要な処理内容**：
1. `mrb_obj_eq()` - boxing方式に応じたオブジェクト同一性判定
2. `mrb_equal()` - 等値比較（==演算子呼び出し含む）
3. `mrb_type_convert()` / `mrb_type_convert_check()` - 型変換
4. `mrb_check_type()` - 型チェック（TypeError発生）
5. `mrb_any_to_s()` - デフォルトのto_s実装
6. NilClass / TrueClass / FalseClass のメソッド定義

**関連システム・外部連携**：Kernelモジュール（基本メソッド提供）、GC（オブジェクト管理）。

**権限による制御**：なし。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 画面機能マッピングにデータなし |

## 機能種別

オブジェクト基本操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| mrb | mrb_state* | Yes | mrubyインタプリタ状態 | NULLでないこと |
| v1, v2 | mrb_value | Yes | 比較対象のmruby値 | - |
| val | mrb_value | Yes | 型変換対象の値 | - |
| type | enum mrb_vtype | Yes | ターゲット型（型変換時） | - |
| method | mrb_sym | Yes | 変換メソッドシンボル | - |

### 入力データソース

Rubyプログラムからの比較・変換リクエスト、VM内部からの型チェック。

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| mrb_bool | mrb_bool | 比較結果（TRUE/FALSE） |
| mrb_value | mrb_value | 変換結果の値 |

### 出力先

呼び出し元への戻り値。

## 処理フロー

### 処理シーケンス

```
1. mrb_obj_eq(v1, v2) - 同一性判定
   ├─ NAN_BOXING: uint64比較
   ├─ WORD_BOXING: mrb_word比較
   └─ NO_BOXING: 型別比較（即値は値比較、オブジェクトはポインタ比較）
2. mrb_equal(obj1, obj2) - 等値比較
   ├─ mrb_obj_eq()で同一性チェック
   ├─ Integer/Float混合比較
   ├─ BigInt比較（有効時）
   └─ ==演算子呼び出し（デフォルトでない場合）
3. mrb_type_convert(val, type, method) - 型変換
   ├─ 既にターゲット型 → そのまま返却
   ├─ methodを呼び出して変換
   └─ 変換失敗 → TypeError（String型はfallbackあり）
4. mrb_init_object() - 初期化
   ├─ NilClass定義（ROMメソッドテーブル付き）
   ├─ TrueClass定義（ROMメソッドテーブル付き）
   └─ FalseClass定義（ROMメソッドテーブル付き）
```

### フローチャート

```mermaid
flowchart TD
    A[mrb_equal] --> B{mrb_obj_eq?}
    B -->|Yes| C[TRUE返却]
    B -->|No| D{Integer/Float混合?}
    D -->|Yes| E[数値比較]
    D -->|No| F{==がデフォルト?}
    F -->|Yes| G[FALSE返却]
    F -->|No| H[==メソッド呼び出し]
    H --> I{結果がtrue?}
    I -->|Yes| C
    I -->|No| G
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | boxing方式別比較 | NAN_BOXING/WORD_BOXING/NO_BOXINGで比較ロジックが異なる | mrb_obj_eq |
| BR-02 | Integer/Float混合比較 | 型が異なってもInteger/Float間は数値比較 | mrb_equal |
| BR-03 | String型変換fallback | to_s変換失敗時にmrb_any_to_sにfallback | mrb_type_convert |
| BR-04 | NilClass/TrueClass/FalseClassはnew不可 | mrb_undef_class_method_idでnewを除去 | 初期化時 |

### 計算ロジック

特になし。

## データベース操作仕様

該当なし

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| TypeError | 型変換失敗 | 変換メソッドがターゲット型を返さない | 正しい変換メソッドの実装 |
| TypeError | 型不正 | mrb_check_typeで期待型と不一致 | 正しい型のオブジェクトを渡す |

### リトライ仕様

リトライ機構なし。

## トランザクション仕様

該当なし

## パフォーマンス要件

- boxing方式に応じた最適化済み比較
- 即値（Integer, Symbol, true, false, nil）はポインタ間接参照なしで比較

## セキュリティ考慮事項

特になし。

## 備考

- object.cは883行
- NilClass/TrueClass/FalseClassのメソッドはROMテーブルで定義（nil_rom_entries等）
- mrb_equal内でBigInt比較はMRB_USE_BIGINT定義時のみ有効

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: 等値比較を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | object.c | `src/object.c` | mrb_obj_eq()（27-56行目）: boxing方式別の同一性判定 |
| 1-2 | object.c | `src/object.c` | mrb_equal()（79-106行目）: 等値比較の全体フロー |

**読解のコツ**: MRB_NAN_BOXING, MRB_WORD_BOXING, MRB_NO_BOXINGの3つのboxing方式を条件コンパイルで切り替えている。

#### Step 2: 型変換を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | object.c | `src/object.c` | mrb_type_convert()（412-424行目）: 例外発生型変換 |
| 2-2 | object.c | `src/object.c` | mrb_type_convert_check()（445-452行目）: 非例外型変換 |
| 2-3 | object.c | `src/object.c` | convert_type()（384-395行目）: 変換メソッド呼び出し基盤 |

**主要処理フロー**:
- **415行目**: 既にターゲット型ならそのまま返却
- **418行目**: convert_typeでメソッド呼び出し
- **420行目**: String型の特別フォールバック

#### Step 3: NilClass/TrueClass/FalseClass初期化を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | object.c | `src/object.c` | mrb_init_object()（351-371行目）: 3クラスの定義とROMテーブル初期化 |
| 3-2 | object.c | `src/object.c` | nil_rom_entries[]（325-332行目）: NilClassのメソッド定義 |
| 3-3 | object.c | `src/object.c` | true_rom_entries[]（334-340行目）: TrueClassのメソッド定義 |
| 3-4 | object.c | `src/object.c` | false_rom_entries[]（342-348行目）: FalseClassのメソッド定義 |

**主要処理フロー**:
- **357行目**: NilClass定義（MRB_TT_FALSE型、newメソッド除去）
- **362行目**: TrueClass定義（MRB_TT_TRUE型、newメソッド除去）
- **367行目**: FalseClass定義（MRB_TT_FALSE型、newメソッド除去）

### プログラム呼び出し階層図

```
mrb_equal()
    │
    ├─ mrb_obj_eq() ─── 同一性チェック
    │
    ├─ [Integer/Float混合比較]
    │
    └─ mrb_funcall_argv(==) ─── ==演算子呼び出し

mrb_type_convert()
    │
    └─ convert_type()
           └─ mrb_funcall_argv(method) ─── 変換メソッド呼び出し

mrb_init_object()
    │
    ├─ mrb_define_class_id(NilClass)
    ├─ mrb_define_class_id(TrueClass)
    └─ mrb_define_class_id(FalseClass)
```

### データフロー図

```
[入力]                     [処理]                         [出力]

mrb_value v1, v2 ────────▶ mrb_obj_eq()                ──▶ mrb_bool
mrb_value v1, v2 ────────▶ mrb_equal()                 ──▶ mrb_bool
mrb_value val    ────────▶ mrb_type_convert()           ──▶ mrb_value (変換済み)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| object.c | `src/object.c` | ソース | Objectクラス本体（883行） |
| class.c | `src/class.c` | ソース | クラス定義API |
| kernel.c | `src/kernel.c` | ソース | Kernelモジュール（Objectにinclude） |
| value.h | `include/mruby/value.h` | ヘッダ | mrb_value型定義、boxing方式 |
