#debugging #display #write #format

no-std aya-ufmt

Alessandro Decina 对 ufmt 进行了修改,使其与 eBPF 内核验证器兼容。

1 个不稳定版本

0.1.0 2021年10月15日

#1636嵌入式开发

MIT/Apache

145KB
1K SLoC

aya-ufmt

这是对 https://github.com/japaric/ufmt 的分支,经过修改以与 eBPF 内核验证器兼容。

μfmt

core::fmt 小 (6-40 倍),快 (2-9 倍) 且无 panic 的替代品。

Call graph of formatting structs

格式化某些结构体的程序调用图(使用 cargo-call-stack 生成)。源代码位于此文件的底部。该程序使用 -C opt-level=z 编译。

API 文档

设计目标

从最高优先级到最低优先级

  • 优化二进制大小和速度(而不是编译时间)

  • 生成代码中无动态分派

  • 优化时,生成代码中无 panic 分支

  • 尽可能避免递归

功能

  • DebugDisplay 类似的特质

  • core::write! 类似的宏

  • 通用的 Formatter<'_, impl uWrite>,而不是单个 core::FormatteruWrite 特质有一个关联的错误类型,因此每个 writer 可以选择其错误类型。例如,std::String 的实现使用 Infallible 作为其错误类型。

  • core::fmt::Formatter::debug_struct 类似的 API

  • #[derive(uDebug)]

  • uDebug 提供漂亮格式化({:#?}

最小支持的 Rust 版本(MSRV)

此 crate 保证在稳定 Rust 1.34 及以上版本上编译。它可能在较旧版本上编译,但任何新的补丁版本都可能改变这一点。

许可协议

所有源代码(包括代码片段)都受以下其中之一许可协议的许可:

由您选择。

贡献

除非您明确声明,否则根据 Apache-2.0 许可证定义的任何有意提交以包含在作品中的贡献,应如上所述进行许可,不附加任何额外条款或条件。

附录

格式化结构体(代码片段)

完整源代码在nopanic/examples/struct.rs

// ..

#[derive(Clone, Copy, uDebug)]
struct Pair {
    x: i32,
    y: i32,
}

static X: AtomicI32 = AtomicI32::new(0);
static Y: AtomicI32 = AtomicI32::new(0);

#[exception]
fn PendSV() {
    let x = X.load(Ordering::Relaxed);
    let y = Y.load(Ordering::Relaxed);

    uwrite!(&mut W, "{:?}", Braces {}).unwrap();
    uwrite!(&mut W, "{:#?}", Braces {}).unwrap();

    uwrite!(&mut W, "{:?}", Parens()).unwrap();
    uwrite!(&mut W, "{:#?}", Parens()).unwrap();

    uwrite!(&mut W, "{:?}", I32(x)).unwrap();
    uwrite!(&mut W, "{:#?}", I32(x)).unwrap();

    uwrite!(&mut W, "{:?}", Tuple(x, y)).unwrap();
    uwrite!(&mut W, "{:#?}", Tuple(x, y)).unwrap();

    let pair = Pair { x, y };
    uwrite!(&mut W, "{:?}", pair).unwrap();
    uwrite!(&mut W, "{:#?}", pair).unwrap();

    let first = pair;
    let second = pair;
    uwrite!(&mut W, "{:?}", Nested { first, second }).unwrap();
    uwrite!(&mut W, "{:#?}", Nested { first, second }).unwrap();
}

// ..

依赖项

~1.5MB
~35K SLoC