mirror of
https://github.com/bspeice/qadapt
synced 2024-11-22 22:08:10 -05:00
32 lines
1.2 KiB
Rust
32 lines
1.2 KiB
Rust
|
//! 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
|
||
|
}
|