mirror of
https://github.com/bspeice/qadapt
synced 2024-11-24 23:08:11 -05:00
Start work on a procedural macro
Turns out the system still needs some work.
This commit is contained in:
parent
16a0238dc5
commit
18d1c3e6d1
@ -13,3 +13,5 @@ backtrace = "0.3"
|
|||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
spin = "0.4"
|
spin = "0.4"
|
||||||
|
|
||||||
|
qadapt-macro = { path = "./qadapt-macro" }
|
3
qadapt-macro/.gitignore
vendored
Normal file
3
qadapt-macro/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/target
|
||||||
|
**/*.rs.bk
|
||||||
|
Cargo.lock
|
9
qadapt-macro/Cargo.toml
Normal file
9
qadapt-macro/Cargo.toml
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
[package]
|
||||||
|
name = "qadapt-macro"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Bradlee Speice <bradlee@speice.io>"]
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
proc-macro = true
|
||||||
|
|
||||||
|
[dependencies]
|
31
qadapt-macro/src/lib.rs
Normal file
31
qadapt-macro/src/lib.rs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
//! Helper macros to use with the QADAPT allocator system
|
||||||
|
//!
|
||||||
|
//! This crate is unusable on its own, but because `proc_macro` crates
|
||||||
|
//! can't export non-proc-macro symbols, we have to go through an extra step
|
||||||
|
//! to move these up.
|
||||||
|
//!
|
||||||
|
//! Ultimately, this does actually work because we don't need to actually use
|
||||||
|
//! references to the underlying functionality here, we just need to know
|
||||||
|
//! where they will ultimately end up at.
|
||||||
|
// TODO: This causes issues, but I can't track down why
|
||||||
|
// #![deny(missing_docs)]
|
||||||
|
extern crate proc_macro;
|
||||||
|
|
||||||
|
use proc_macro::TokenTree;
|
||||||
|
use proc_macro::TokenStream;
|
||||||
|
|
||||||
|
/// Set up the QADAPT allocator to trigger a panic if any allocations happen during
|
||||||
|
/// this function. Race conditions between threads are not checked, this macro will
|
||||||
|
/// only work as intended in a single-threaded or otherwise synchronized environment.
|
||||||
|
#[proc_macro_attribute]
|
||||||
|
pub fn allocate_panic(_attr: TokenStream, item: TokenStream) -> TokenStream {
|
||||||
|
let ret = item.clone();
|
||||||
|
|
||||||
|
let mut token_iter = item.into_iter();
|
||||||
|
match token_iter.next() {
|
||||||
|
Some(TokenTree::Ident(ref i)) if i.to_string() == "fn" => (),
|
||||||
|
_ => panic!("#[allocate_panic] macro can only be applied to functions")
|
||||||
|
}
|
||||||
|
|
||||||
|
ret
|
||||||
|
}
|
@ -1,9 +1,13 @@
|
|||||||
extern crate backtrace;
|
extern crate backtrace;
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
|
extern crate qadapt_macro;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate log;
|
extern crate log;
|
||||||
extern crate spin;
|
extern crate spin;
|
||||||
|
|
||||||
|
// Re-export the proc macros to use by other code
|
||||||
|
pub use qadapt_macro::*;
|
||||||
|
|
||||||
use backtrace::Backtrace;
|
use backtrace::Backtrace;
|
||||||
use libc::c_void;
|
use libc::c_void;
|
||||||
use libc::free;
|
use libc::free;
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
#![feature(asm)]
|
#![feature(asm)]
|
||||||
|
|
||||||
extern crate qadapt;
|
extern crate qadapt;
|
||||||
|
|
||||||
use qadapt::QADAPT;
|
use qadapt::QADAPT;
|
Loading…
Reference in New Issue
Block a user