feat: replace M4 callback writers with safe handles

This commit is contained in:
2026-08-16 18:27:26 +09:00
parent 42abc0d7e7
commit 351e5dbb23
11 changed files with 54 additions and 72 deletions
+7
View File
@@ -0,0 +1,7 @@
unit m4_bad_buffer_writer;
fn main() -> void {
var raw: [4]u8 = [0, 0, 0, 0];
var buf: []mut u8 = raw[..];
let w = io.buf_writer(buf);
}
+1 -1
View File
@@ -2,6 +2,6 @@ unit m4_bad_writer;
fn main() -> i32 {
var x: i32 = 0;
@fprint(&mut x, "bad");
@fprint(x, "bad");
return 0;
}
+7 -7
View File
@@ -8,15 +8,15 @@ fn main() -> i32 {
var raw3: [8]u8 = [0, 0, 0, 0, 0, 0, 0, 0];
var raw4: [8]u8 = [0, 0, 0, 0, 0, 0, 0, 0];
var raw5: [8]u8 = [0, 0, 0, 0, 0, 0, 0, 0];
var buf: []u8 = raw[..];
var buf2: []u8 = raw2[..];
var buf3: []u8 = raw3[..];
var buf4: []u8 = raw4[..];
var buf5: []u8 = raw5[..];
let w: io.Writer = io.buf_writer(&mut buf);
var buf: []mut u8 = raw[..];
var buf2: []mut u8 = raw2[..];
var buf3: []mut u8 = raw3[..];
var buf4: []mut u8 = raw4[..];
var buf5: []mut u8 = raw5[..];
let w: io.Writer = io.null_writer();
const LOCAL_FMT: str = "value={}\n";
@print(FMT, 7, 15, 'A', "yes", true);
@fprint(&mut w, LOCAL_FMT, 12);
@fprint(w, LOCAL_FMT, 12);
let n: usize = @sprint(buf2, "A\x42\u0043defghi");
let n2: usize = @sprint(buf3, "xy");
let inner_n: usize = @sprint(buf4, "xy");
+1 -1
View File
@@ -1,5 +1,5 @@
unit m4_prop;
pub fn propagate(w: &mut io.Writer) -> !void {
pub fn propagate(w: io.Writer) -> !void {
try @fprint(w, "a{}b", 1);
}
+4 -16
View File
@@ -1,23 +1,11 @@
#include "prop.c"
static unsigned short calls;
static unsigned short fail_write(void *ctx, const unsigned char *p,
unsigned long n)
{
(void)ctx;
(void)p;
(void)n;
++calls;
return calls == 1 ? 7 : 0;
}
int main(void)
{
fe_writer w;
unsigned short result;
w.ctx=0;
w.write_fn=fail_write;
result=fe_m4_prop_propagate(&w);
return (result==7 && calls==1) ? 0 : 1;
w.tag=2;
w.handle=99;
result=fe_m4_prop_propagate(w);
return result==1 ? 0 : 1;
}
+3 -3
View File
@@ -2,7 +2,7 @@ unit m4_try_fprint;
fn main() -> !void {
var raw: [4]u8 = [0, 0, 0, 0];
var buf: []u8 = raw[..];
let w: io.Writer = io.buf_writer(&mut buf);
try @fprint(&mut w, "ok");
var buf: []mut u8 = raw[..];
let w: io.Writer = io.null_writer();
try @fprint(w, "ok");
}