Skip to main content

byteflow/bytecode/
macros.rs

1//! Thin `macro_rules!` sugar over crate-internal [`ChunkBuilder`] helpers.
2//!
3//! Prefer [`crate::Fn::native1_from`] and [`crate::Fn::native_n`] in new code.
4//! These macros remain for internal tests that emit bytecode directly.
5
6/// `emit_native1_from!(builder, dest, src, native)` — see [`Fn::native1_from`].
7///
8/// # Example
9/// ```
10/// use byteflow::Program;
11///
12/// let mut p = Program::new("example");
13/// p.function("main", 0, |f| {
14///     let msg = f.receive();
15///     let sender = f.native1_from(msg, 3);
16///     f.return_(sender);
17/// });
18/// let chunk = p.build();
19/// assert!(chunk.code.len() >= 4);
20/// ```
21#[macro_export]
22macro_rules! emit_native1_from {
23    ($builder:expr, $dest:expr, $src:expr, $native:expr) => {
24        $builder.emit_native1_from($dest, $src, $native)
25    };
26}
27
28/// `emit_native_n!(builder, base, native, argc)` — see [`Fn::native_n`].
29#[macro_export]
30macro_rules! emit_native_n {
31    ($builder:expr, $base:expr, $native:expr, $argc:expr) => {
32        $builder.emit_native_n($base, $native, $argc)
33    };
34}
35
36/// Namespaced re-exports for callers who prefer an explicit path.
37pub mod asm_macros {
38    pub use crate::emit_native1_from;
39    pub use crate::emit_native_n;
40}