Giter VIP home page Giter VIP logo

call-dispatch-macro's Introduction

call-dispatch-macro

Actions Status

Generate function call dispatcher in Rust procedural macro.

๐Ÿšง Working In Progress ๐Ÿšง

Usage

use call_dispatch_macro::call_dispatch;

// Define a struct.
struct Syscall;

// Put `call_dispatch` attribute on the impl block.
#[call_dispatch]
impl Syscall {
    // Mark the dispatcher function.
    #[dispatcher(match_arm_prefix = "sys")]
    fn dispatch(&mut self, num: u32, args: [usize; 6]) -> Option<i32> {
        // The body will be rewritten by the macro.
        panic!("code generated by macro")
        // ======== Generated Code Start ========
        match num {
            sys::SYS_READ => Some(self.sys_read(args[0] as _, args[1] as _, args[2] as _)),
            sys::SYS_WRITE => Some(self.sys_write(args[0] as _, args[1] as _, args[2] as _)),
            _ => None,
        }
        // ========= Generated Code End =========
    }

    // Mark the function to be dispatched.
    #[call]
    fn sys_read(&mut self, fd: i32, buf: *mut u8, len: usize) -> i32 {
        println!("sys_read: fd={:?}, buf=({:?}; {:?})", fd, buf, len);
        1
    }
    #[call]
    fn sys_write(&mut self, fd: i32, buf: *const u8, len: usize) -> i32 {
        println!("sys_write: fd={:?}, buf=({:?}; {:?})", fd, buf, len);
        2
    }
}

// Define constants for match number.
mod sys {
    pub const SYS_READ: u32 = 1;
    pub const SYS_WRITE: u32 = 2;
}

fn main() {
    let mut syscall = Syscall;
    assert_eq!(syscall.dispatch(0, [1, 2, 3, 4, 5, 6]), None);
    assert_eq!(syscall.dispatch(1, [1, 2, 3, 4, 5, 6]), Some(1));
    assert_eq!(syscall.dispatch(2, [1, 2, 3, 4, 5, 6]), Some(2));
}

call-dispatch-macro's People

Contributors

wangrunji0408 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.