# 通知設計書 98-hintQuitCalled

## 概要

本ドキュメントは、Nimコンパイラにおけるヒント通知「hintQuitCalled」の設計を記載する。この通知はコンパイル時実行（静的実行）またはREPLモードでquit()が呼び出されたことをユーザーに通知するためのものである。

### 本通知の処理概要

hintQuitCalled（quit() called）は、NimのVM（仮想マシン）でコードが実行される際に、quit()プロシージャが呼び出されたことを通知するヒントメッセージである。

**業務上の目的・背景**：静的実行やREPLモードでのデバッグと制御を目的とする。quit()の呼び出しは通常プログラムの終了を意味するが、コンパイル時実行ではコンパイラプロセス自体を終了させる可能性がある。この通知により、開発者はquit()が呼び出されたことを認識し、意図した動作かどうかを確認できる。

**通知の送信タイミング**：VM（仮想マシン）がopcQuit命令を実行する際、emRepl/emStaticExpr/emStaticStmtモードの場合に送信される。

**通知の受信者**：コンパイルを実行している開発者。標準エラー出力を通じて通知される。

**通知内容の概要**：「quit() called」という固定メッセージで通知される。

**期待されるアクション**：開発者はquit()の呼び出しが意図したものか確認する。意図しない場合はコードを修正する。

## 通知種別

コンパイラコンソール出力（標準エラー出力）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 低（ヒント） |
| リトライ | 無 |

### 送信先決定ロジック

コンパイラを実行しているプロセスの標準エラー出力に直接出力される。

## 通知テンプレート

### コンソール出力の場合

| 項目 | 内容 |
|-----|------|
| 送信元 | Nimコンパイラ（VM） |
| 出力先 | stderr |
| 形式 | テキスト |

### 本文テンプレート

```
quit() called
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| （なし） | 固定メッセージ | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| VM実行 | opcQuit命令実行時 | c.mode in {emRepl, emStaticExpr, emStaticStmt} | REPL/静的実行モードのみ |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| 通常コンパイルモード | c.modeが上記以外の場合は通知なしで終了 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[opcQuit命令実行] --> B{c.mode判定}
    B -->|emRepl/emStaticExpr/emStaticStmt| C[message hintQuitCalled]
    C --> D[msgQuit実行]
    B -->|その他| E[TFullReg返却して終了]
```

## データベース参照・更新仕様

### 参照テーブル一覧

コンパイラ内部のVMコンテキストを参照。データベースは使用しない。

### テーブル別参照項目詳細

該当なし

### 更新テーブル一覧

該当なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 出力失敗 | stderr書き込みエラー | 処理継続（無視） |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | 制限なし |
| 1日あたり上限 | 制限なし |

### 配信時間帯

制限なし（VM実行時に即時出力）

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

機密情報を含まない。固定メッセージのため、特別なセキュリティ対策は不要。

## 備考

- quit()の終了コードはregs[ra]から取得される
- foreignPackageNotesDefaultに含まれる（外部パッケージでも表示）
- REPL（nim secret）での対話的実行時に特に重要

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、通知定義とVMのモード概念を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | lineinfos.nim | `compiler/lineinfos.nim` | hintQuitCalledの定義（108行目）とメッセージ（221行目） |
| 1-2 | vmdef.nim | `compiler/vmdef.nim` | PCtxとモード（emRepl, emStaticExprなど）の定義 |

**読解のコツ**: VMの実行モードがどのように使い分けられるかを理解する。

#### Step 2: エントリーポイントを理解する

VM内でのquit命令の処理を特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | vm.nim | `compiler/vm.nim` | opcQuit処理（1691-1696行目） |

**主要処理フロー**:
1. **1691行目**: opcQuit分岐開始
2. **1692行目**: モード判定
3. **1693行目**: message(hintQuitCalled)呼び出し
4. **1694行目**: msgQuitでプロセス終了

#### Step 3: 終了処理ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | vm.nim | `compiler/vm.nim` | opcQuit処理の全体像（1691-1696行目） |
| 3-2 | msgs.nim | `compiler/msgs.nim` | msgQuit関数 |

**主要処理フロー**:
- **1692行目**: c.mode in {emRepl, emStaticExpr, emStaticStmt}判定
- **1693行目**: ヒント出力
- **1694行目**: getOrdValueで終了コード取得、msgQuit実行

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

```
rawExecute (vm.nim)
    │
    └─ case instr.opcode
           │
           └─ of opcQuit (vm.nim:1691)
                  ├─ モード判定
                  │      └─ c.mode in {emRepl, emStaticExpr, emStaticStmt}
                  │
                  ├─ message(hintQuitCalled)
                  │
                  └─ msgQuit
                         └─ 終了コード: regs[ra]から取得
```

### データフロー図

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

opcQuit ───▶ rawExecute ───▶ stderr
    │            │
    └─ regs[ra]  ├─ モード判定
       （終了コード）└─ hintQuitCalled出力
                 │
                 └─ msgQuit（プロセス終了）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| lineinfos.nim | `compiler/lineinfos.nim` | ソース | hintQuitCalled定義 |
| vm.nim | `compiler/vm.nim` | ソース | opcQuit処理 |
| vmdef.nim | `compiler/vmdef.nim` | ソース | VM定義とモード |
| msgs.nim | `compiler/msgs.nim` | ソース | message関数、msgQuit関数 |
| options.nim | `compiler/options.nim` | ソース | foreignPackageNotesDefault |
