173 lines
5.8 KiB
Markdown
173 lines
5.8 KiB
Markdown
|
|
# Phase 138: ReturnValueLowererBox - Return Lowering SSOT
|
||
|
|
|
||
|
|
**Date**: 2025-12-18
|
||
|
|
**Status**: DONE ✅
|
||
|
|
**Scope**: Extract return lowering to shared Box (behavior unchanged)
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Goal
|
||
|
|
|
||
|
|
Establish SSOT for return value lowering by extracting logic to ReturnValueLowererBox:
|
||
|
|
- Extract `lower_return_value_to_vid()` from `loop_true_break_once.rs`
|
||
|
|
- Create shared `ReturnValueLowererBox` for Normalized shadow paths
|
||
|
|
- Keep **挙動不変**: Phase 136/137 behavior unchanged
|
||
|
|
- Keep **Phase 139 準備**: Prepare for post_if_post_k.rs unification
|
||
|
|
|
||
|
|
## Scope
|
||
|
|
|
||
|
|
### ✅ In Scope (Phase 138 P0)
|
||
|
|
|
||
|
|
- **Boxification**: Extract return lowering to `common/return_value_lowerer_box.rs`
|
||
|
|
- **Migration**: `loop_true_break_once.rs` uses Box (2 call sites)
|
||
|
|
- **Tests**: 5 unit tests for all supported patterns
|
||
|
|
- **Regression**: All Phase 136/137 smokes unchanged
|
||
|
|
|
||
|
|
### ❌ Out of Scope (Phase 139)
|
||
|
|
|
||
|
|
- **post_if_post_k.rs**: Not modified (different responsibility)
|
||
|
|
- Unification planned for Phase 139 P0
|
||
|
|
|
||
|
|
## SSOT Location
|
||
|
|
|
||
|
|
**File**: `src/mir/control_tree/normalized_shadow/common/return_value_lowerer_box.rs`
|
||
|
|
|
||
|
|
**Function**: `ReturnValueLowererBox::lower_to_value_id()`
|
||
|
|
|
||
|
|
### Supported Patterns (Phase 136-137)
|
||
|
|
|
||
|
|
1. **Variable**: `return x` → env lookup → ValueId
|
||
|
|
2. **Integer literal**: `return 7` → Const generation → ValueId
|
||
|
|
3. **Add expression**: `return x + 2` or `return 5 + 3` → BinOp(Add, lhs, rhs) → ValueId
|
||
|
|
|
||
|
|
### Out-of-Scope Patterns
|
||
|
|
|
||
|
|
- Other operators: `return x - 2` → `Ok(None)` (fallback)
|
||
|
|
- Variable + variable: `return x + y` → `Ok(None)` (fallback)
|
||
|
|
- Nested expressions: `return (x + 2) + 3` → `Ok(None)` (fallback)
|
||
|
|
|
||
|
|
## Implementation
|
||
|
|
|
||
|
|
### New Files
|
||
|
|
|
||
|
|
1. **`src/mir/control_tree/normalized_shadow/common/return_value_lowerer_box.rs`** (~300 lines)
|
||
|
|
- Main function: `lower_to_value_id()`
|
||
|
|
- Helper: `lower_binary_op()` for Add expressions
|
||
|
|
- 5 comprehensive unit tests
|
||
|
|
|
||
|
|
2. **`src/mir/control_tree/normalized_shadow/common/mod.rs`**
|
||
|
|
- Module export for common utilities
|
||
|
|
|
||
|
|
### Modified Files
|
||
|
|
|
||
|
|
1. **`src/mir/control_tree/normalized_shadow/mod.rs`**
|
||
|
|
- Added `pub mod common;`
|
||
|
|
|
||
|
|
2. **`src/mir/control_tree/normalized_shadow/loop_true_break_once.rs`**
|
||
|
|
- Removed `lower_return_value_to_vid()` method (~115 lines)
|
||
|
|
- Added import: `use super::common::return_value_lowerer_box::ReturnValueLowererBox;`
|
||
|
|
- Updated 2 call sites:
|
||
|
|
- Line 417: post_k return processing
|
||
|
|
- Line 481: k_exit return processing
|
||
|
|
- Updated SSOT documentation (lines 29-43)
|
||
|
|
|
||
|
|
### Call Sites (Phase 138 P0)
|
||
|
|
|
||
|
|
**File**: `loop_true_break_once.rs`
|
||
|
|
|
||
|
|
1. **post_k return processing** (line 417):
|
||
|
|
```rust
|
||
|
|
match ReturnValueLowererBox::lower_to_value_id(
|
||
|
|
value_ast,
|
||
|
|
&mut post_k_func.body,
|
||
|
|
&mut next_value_id,
|
||
|
|
&env_post_k
|
||
|
|
)? {
|
||
|
|
Some(vid) => { post_k_func.body.push(JoinInst::Ret { value: Some(vid) }); }
|
||
|
|
None => { return Ok(None); }
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
2. **k_exit return processing** (line 481):
|
||
|
|
```rust
|
||
|
|
match ReturnValueLowererBox::lower_to_value_id(
|
||
|
|
value_ast,
|
||
|
|
&mut k_exit_func.body,
|
||
|
|
&mut next_value_id,
|
||
|
|
&env_k_exit
|
||
|
|
)? {
|
||
|
|
Some(vid) => { k_exit_func.body.push(JoinInst::Ret { value: Some(vid) }); }
|
||
|
|
None => { return Ok(None); }
|
||
|
|
}
|
||
|
|
```
|
||
|
|
|
||
|
|
## Unit Tests (5 tests)
|
||
|
|
|
||
|
|
**File**: `src/mir/control_tree/normalized_shadow/common/return_value_lowerer_box.rs`
|
||
|
|
|
||
|
|
1. `test_lower_variable` - Variable lookup in env
|
||
|
|
2. `test_lower_integer_literal` - Const instruction generation
|
||
|
|
3. `test_lower_add_var_plus_int` - `x + 2` pattern
|
||
|
|
4. `test_lower_add_int_plus_int` - `5 + 3` constant folding
|
||
|
|
5. `test_out_of_scope_subtract` - Fallback for unsupported operators
|
||
|
|
|
||
|
|
## Verification
|
||
|
|
|
||
|
|
```bash
|
||
|
|
# Build
|
||
|
|
cargo build --release -p nyash-rust --features llvm
|
||
|
|
|
||
|
|
# Unit tests
|
||
|
|
cargo test --lib
|
||
|
|
|
||
|
|
# Phase 137 regression (6 tests)
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase137_loop_true_break_once_return_add_vm.sh
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase137_loop_true_break_once_return_add_const_vm.sh
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase137_loop_true_break_once_post_return_add_vm.sh
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase137_loop_true_break_once_return_add_llvm_exe.sh
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase137_loop_true_break_once_return_add_const_llvm_exe.sh
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase137_loop_true_break_once_post_return_add_llvm_exe.sh
|
||
|
|
|
||
|
|
# Phase 97 regression (2 tests)
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase97_next_non_ws_llvm_exe.sh
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase97_json_loader_escape_llvm_exe.sh
|
||
|
|
|
||
|
|
# Phase 131/135/136 regression
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase131_loop_true_break_once_vm.sh
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase135_loop_true_break_once_post_empty_return_vm.sh
|
||
|
|
bash tools/smokes/v2/profiles/integration/apps/phase136_loop_true_break_once_return_literal_vm.sh
|
||
|
|
```
|
||
|
|
|
||
|
|
## Acceptance Criteria
|
||
|
|
|
||
|
|
- ✅ cargo test --lib: 1194 tests PASS (+5 new unit tests)
|
||
|
|
- ✅ Phase 137 regression: 6/6 PASS
|
||
|
|
- ✅ Phase 97 regression: 2/2 PASS
|
||
|
|
- ✅ Phase 131/135/136 regression: 3/3 PASS
|
||
|
|
- ✅ Behavior unchanged: All Phase 136/137 fixtures/smokes PASS
|
||
|
|
- ✅ SSOT established: ReturnValueLowererBox is single source of truth
|
||
|
|
- ✅ post_if_post_k.rs unchanged: Phase 139 P0 scope
|
||
|
|
|
||
|
|
## Boxification Trigger
|
||
|
|
|
||
|
|
**Condition**: When 2+ files need identical return lowering logic
|
||
|
|
|
||
|
|
**Result**: Phase 138 P0 achieved this trigger with loop_true_break_once.rs migration
|
||
|
|
|
||
|
|
**Next Step**: Phase 139 P0 - Migrate post_if_post_k.rs to ReturnValueLowererBox
|
||
|
|
|
||
|
|
## Current Status
|
||
|
|
|
||
|
|
Phase 138 - DONE ✅ (2025-12-18)
|
||
|
|
|
||
|
|
SSOT established: `common/return_value_lowerer_box.rs`
|
||
|
|
|
||
|
|
Return lowering unified for loop paths, ready for if-with-post paths in Phase 139.
|
||
|
|
|
||
|
|
## Architecture Impact
|
||
|
|
|
||
|
|
- **Code Reduction**: ~115 lines removed from loop_true_break_once.rs
|
||
|
|
- **Maintainability**: Single location for return lowering improvements
|
||
|
|
- **Testability**: Isolated unit tests for return lowering logic
|
||
|
|
- **Extensibility**: Easy to add new return patterns in one location
|