perf counter macros

This commit is contained in:
2021-10-31 16:12:32 +01:00
parent 33bea8fbc8
commit bee1b66b55
10 changed files with 136 additions and 34 deletions

View File

@@ -0,0 +1,13 @@
[package]
name = "rust-engine-proc"
version = "0.1.0"
edition = "2018"
[lib]
proc-macro = true
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
syn = { version = "1.0", features = ["full"] }
quote = "1.0"

View File

@@ -0,0 +1,28 @@
extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
use syn::{AttributeArgs, ItemFn, Lit, Meta, parse_macro_input, parse_quote};
#[proc_macro_attribute]
pub fn perf(attr: TokenStream, item: TokenStream) -> TokenStream {
let attrs = parse_macro_input!(attr as AttributeArgs);
let name = match &attrs[0] {
syn::NestedMeta::Lit(Lit::Str(l)) => l.value(),
_ => panic!("Invalid attribute"),
};
let counter_type = match &attrs[1] {
syn::NestedMeta::Meta(Meta::Path(p)) => p,
_ => panic!("Invalid attribute"),
};
let mut function = parse_macro_input!(item as ItemFn);
function.block.stmts.insert(0, parse_quote! {
let __perf_start = std::time::Instant::now();
});
function.block.stmts.push(parse_quote! {
unsafe {
#counter_type::write_perf(#name, __perf_start.elapsed().as_micros());
}
});
quote!(#function).into()
}