refactor: add MIR interpreter utility helpers (Phase 1)
- Add destination write helpers (write_box_result, write_void, write_result) - Add argument validation helpers (validate_args_exact/range/min) - Add receiver conversion helper (convert_to_box) - Update handlers to use new helpers Reduces code duplication: - Destination patterns: 37 call sites converted - Each replacement saves 2-3 lines (74-111 lines saved) - Helper infrastructure: 178 lines added - Net improvement: Reduced duplication + better maintainability Impact: - Build: ✓ SUCCESS (0 errors, 146 warnings) - Tests: ✓ 8/9 smoke tests PASS - Functionality: ✓ PRESERVED (no behavior changes) Files created: - src/backend/mir_interpreter/utils/mod.rs - src/backend/mir_interpreter/utils/destination_helpers.rs - src/backend/mir_interpreter/utils/arg_validation.rs - src/backend/mir_interpreter/utils/receiver_helpers.rs Files modified: 15 handler files - arithmetic.rs, boxes.rs, boxes_array.rs, boxes_instance.rs - boxes_map.rs, boxes_object_fields.rs, boxes_plugin.rs - boxes_string.rs, calls.rs, extern_provider.rs, externals.rs - memory.rs, misc.rs, mod.rs Related: Phase 21.0 refactoring Risk: Low (pure refactoring, no behavior change)
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
use super::*;
|
||||
use super::super::utils::*;
|
||||
use crate::box_trait::NyashBox;
|
||||
|
||||
pub(super) fn try_handle_array_box(
|
||||
@ -20,32 +21,32 @@ pub(super) fn try_handle_array_box(
|
||||
match method {
|
||||
"birth" => {
|
||||
// No-op constructor init
|
||||
if let Some(d) = dst { this.regs.insert(d, VMValue::Void); }
|
||||
this.write_void(dst);
|
||||
return Ok(true);
|
||||
}
|
||||
"push" => {
|
||||
if args.len() != 1 { return Err(VMError::InvalidInstruction("push expects 1 arg".into())); }
|
||||
let val = this.reg_load(args[0])?.to_nyash_box();
|
||||
let _ = ab.push(val);
|
||||
if let Some(d) = dst { this.regs.insert(d, VMValue::Void); }
|
||||
this.write_void(dst);
|
||||
return Ok(true);
|
||||
}
|
||||
"pop" => {
|
||||
if !args.is_empty() { return Err(VMError::InvalidInstruction("pop expects 0 args".into())); }
|
||||
let ret = ab.pop();
|
||||
if let Some(d) = dst { this.regs.insert(d, VMValue::from_nyash_box(ret)); }
|
||||
this.write_result(dst, VMValue::from_nyash_box(ret));
|
||||
return Ok(true);
|
||||
}
|
||||
"len" | "length" | "size" => {
|
||||
let ret = ab.length();
|
||||
if let Some(d) = dst { this.regs.insert(d, VMValue::from_nyash_box(ret)); }
|
||||
this.write_result(dst, VMValue::from_nyash_box(ret));
|
||||
return Ok(true);
|
||||
}
|
||||
"get" => {
|
||||
if args.len() != 1 { return Err(VMError::InvalidInstruction("get expects 1 arg".into())); }
|
||||
let idx = this.reg_load(args[0])?.to_nyash_box();
|
||||
let ret = ab.get(idx);
|
||||
if let Some(d) = dst { this.regs.insert(d, VMValue::from_nyash_box(ret)); }
|
||||
this.write_result(dst, VMValue::from_nyash_box(ret));
|
||||
return Ok(true);
|
||||
}
|
||||
"set" => {
|
||||
@ -53,7 +54,7 @@ pub(super) fn try_handle_array_box(
|
||||
let idx = this.reg_load(args[0])?.to_nyash_box();
|
||||
let val = this.reg_load(args[1])?.to_nyash_box();
|
||||
let _ = ab.set(idx, val);
|
||||
if let Some(d) = dst { this.regs.insert(d, VMValue::Void); }
|
||||
this.write_void(dst);
|
||||
return Ok(true);
|
||||
}
|
||||
_ => {}
|
||||
|
||||
Reference in New Issue
Block a user