1extern crate proc_macro;
2
3use proc_macro::TokenStream;
4use quote::quote;
5use syn::{parse_macro_input, parse_quote, ItemFn};
6
7mod cpi_signer;
8mod pubkey;
9
10#[proc_macro]
12pub fn pubkey(input: TokenStream) -> TokenStream {
13 let args = parse_macro_input!(input as pubkey::PubkeyArgs);
14 pubkey::pubkey(args)
15 .unwrap_or_else(|err| err.to_compile_error())
16 .into()
17}
18
19#[proc_macro]
21pub fn pubkey_array(input: TokenStream) -> TokenStream {
22 let args = parse_macro_input!(input as pubkey::PubkeyArgs);
23 pubkey::pubkey_array(args)
24 .unwrap_or_else(|err| err.to_compile_error())
25 .into()
26}
27
28#[proc_macro_attribute]
29pub fn heap_neutral(_: TokenStream, input: TokenStream) -> TokenStream {
30 let mut function = parse_macro_input!(input as ItemFn);
31
32 let init_code: syn::Stmt = parse_quote! {
34 #[cfg(target_os = "solana")]
35 let pos = light_heap::GLOBAL_ALLOCATOR.get_heap_pos();
36 };
37 let msg = format!("pre: {}", function.sig.ident);
38 let log_pre: syn::Stmt = parse_quote! {
39 #[cfg(all(target_os = "solana", feature = "mem-profiling"))]
40 light_heap::GLOBAL_ALLOCATOR.log_total_heap(#msg);
41 };
42 function.block.stmts.insert(0, init_code);
43 function.block.stmts.insert(1, log_pre);
44
45 let msg = format!("post: {}", function.sig.ident);
47 let log_post: syn::Stmt = parse_quote! {
48 #[cfg(all(target_os = "solana", feature = "mem-profiling"))]
49 light_heap::GLOBAL_ALLOCATOR.log_total_heap(#msg);
50 };
51 let cleanup_code: syn::Stmt = parse_quote! {
52 #[cfg(target_os = "solana")]
53 light_heap::GLOBAL_ALLOCATOR.free_heap(pos)?;
54 };
55 let len = function.block.stmts.len();
56 function.block.stmts.insert(len - 1, log_post);
57 function.block.stmts.insert(len - 1, cleanup_code);
58 TokenStream::from(quote! { #function })
59}
60
61#[proc_macro_derive(Noop)]
64pub fn derive_noop(_input: TokenStream) -> TokenStream {
65 TokenStream::new()
66}
67
68#[proc_macro]
84pub fn derive_light_cpi_signer_pda(input: TokenStream) -> TokenStream {
85 cpi_signer::derive_light_cpi_signer_pda(input)
86}
87
88#[proc_macro]
108pub fn derive_light_cpi_signer(input: TokenStream) -> TokenStream {
109 cpi_signer::derive_light_cpi_signer(input)
110}