diff options
| author | nsfisis <nsfisis@gmail.com> | 2026-07-20 05:21:06 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2026-07-20 05:21:06 +0900 |
| commit | 087020525d364e1e5bb3d9b41d020704b068c59c (patch) | |
| tree | 8f2e94519c6df43afdcd2a53ebe750bb43dc7429 /crates/shirabe/src | |
| parent | f299bf44f6f19e84110b5fb39c440e2e81ab8310 (diff) | |
| download | php-shirabe-087020525d364e1e5bb3d9b41d020704b068c59c.tar.gz php-shirabe-087020525d364e1e5bb3d9b41d020704b068c59c.tar.zst php-shirabe-087020525d364e1e5bb3d9b41d020704b068c59c.zip | |
fix(auditor): restore instanceof ConsoleIO semantics for BufferIO
PHP's BufferIO extends ConsoleIO, so $io instanceof ConsoleIO matches
it; the port models that inheritance as composition, making the plain
ConsoleIO downcast reject BufferIO and throw where PHP renders tables.
Also try a BufferIO downcast and unwrap its inner ConsoleIO, which
unblocks the two FORMAT_TABLE cases and un-ignores test_audit.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src')
| -rw-r--r-- | crates/shirabe/src/advisory/auditor.rs | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/crates/shirabe/src/advisory/auditor.rs b/crates/shirabe/src/advisory/auditor.rs index 32e34380..ff93268a 100644 --- a/crates/shirabe/src/advisory/auditor.rs +++ b/crates/shirabe/src/advisory/auditor.rs @@ -433,7 +433,14 @@ impl Auditor { match format { Self::FORMAT_TABLE => { let io_ref = io.borrow(); - let io_as_console = io_ref.as_any().downcast_ref::<ConsoleIO>(); + // PHP: `$io instanceof ConsoleIO`. BufferIO extends ConsoleIO in PHP but is + // modeled as composition here, so also unwrap it to its inner ConsoleIO. + let io_as_console = io_ref.as_any().downcast_ref::<ConsoleIO>().or_else(|| { + io_ref + .as_any() + .downcast_ref::<crate::io::buffer_io::BufferIO>() + .map(|buffer_io| &buffer_io.inner) + }); if io_as_console.is_none() { return Err(InvalidArgumentException { message: format!( @@ -605,7 +612,14 @@ impl Auditor { } let io_ref = io.borrow(); - let io_as_console = io_ref.as_any().downcast_ref::<ConsoleIO>(); + // PHP: `$io instanceof ConsoleIO`. BufferIO extends ConsoleIO in PHP but is modeled as + // composition here, so also unwrap it to its inner ConsoleIO. + let io_as_console = io_ref.as_any().downcast_ref::<ConsoleIO>().or_else(|| { + io_ref + .as_any() + .downcast_ref::<crate::io::buffer_io::BufferIO>() + .map(|buffer_io| &buffer_io.inner) + }); if io_as_console.is_none() { return Err(InvalidArgumentException { message: format!( |
