From 0bf2ff6138a5e4f54a24b534d2e6b7c0746b32d7 Mon Sep 17 00:00:00 2001 From: Michael Vines Date: Tue, 13 Nov 2018 18:38:51 -0800 Subject: [PATCH] Add convenience macro for native program entrypoint --- programs/native/bpf_loader/src/lib.rs | 5 +++-- programs/native/erc20/src/lib.rs | 5 +++-- programs/native/lua_loader/src/lib.rs | 5 +++-- programs/native/noop/src/lib.rs | 5 +++-- sdk/src/native_program.rs | 12 ++++++++++++ 5 files changed, 24 insertions(+), 8 deletions(-) diff --git a/programs/native/bpf_loader/src/lib.rs b/programs/native/bpf_loader/src/lib.rs index 0c5245ce8..aeedbef91 100644 --- a/programs/native/bpf_loader/src/lib.rs +++ b/programs/native/bpf_loader/src/lib.rs @@ -7,6 +7,7 @@ extern crate env_logger; extern crate log; extern crate libc; extern crate solana_rbpf; +#[macro_use] extern crate solana_sdk; use bincode::deserialize; @@ -135,8 +136,8 @@ fn deserialize_parameters(keyed_accounts: &mut [KeyedAccount], buffer: &[u8]) { } } -#[no_mangle] -pub extern "C" fn process(keyed_accounts: &mut [KeyedAccount], tx_data: &[u8]) -> bool { +solana_entrypoint!(entrypoint); +fn entrypoint(keyed_accounts: &mut [KeyedAccount], tx_data: &[u8]) -> bool { static INIT: Once = ONCE_INIT; INIT.call_once(|| { // env_logger can only be initialized once diff --git a/programs/native/erc20/src/lib.rs b/programs/native/erc20/src/lib.rs index cca6d689a..cbc1653a2 100644 --- a/programs/native/erc20/src/lib.rs +++ b/programs/native/erc20/src/lib.rs @@ -7,6 +7,7 @@ extern crate log; extern crate serde; #[macro_use] extern crate serde_derive; +#[macro_use] extern crate solana_sdk; use solana_sdk::account::KeyedAccount; @@ -14,8 +15,8 @@ use std::sync::{Once, ONCE_INIT}; mod token_program; -#[no_mangle] -pub extern "C" fn process(info: &mut [KeyedAccount], input: &[u8]) -> bool { +solana_entrypoint!(entrypoint); +fn entrypoint(info: &mut [KeyedAccount], input: &[u8]) -> bool { // env_logger can only be initialized once static INIT: Once = ONCE_INIT; INIT.call_once(env_logger::init); diff --git a/programs/native/lua_loader/src/lib.rs b/programs/native/lua_loader/src/lib.rs index 005518743..9c330b278 100644 --- a/programs/native/lua_loader/src/lib.rs +++ b/programs/native/lua_loader/src/lib.rs @@ -3,6 +3,7 @@ extern crate env_logger; #[macro_use] extern crate log; extern crate rlua; +#[macro_use] extern crate solana_sdk; use bincode::deserialize; @@ -51,8 +52,8 @@ fn run_lua(keyed_accounts: &mut [KeyedAccount], code: &str, data: &[u8]) -> Resu update_accounts(&lua, "accounts", keyed_accounts) } -#[no_mangle] -pub extern "C" fn process(keyed_accounts: &mut [KeyedAccount], tx_data: &[u8]) -> bool { +solana_entrypoint!(entrypoint); +fn entrypoint(keyed_accounts: &mut [KeyedAccount], tx_data: &[u8]) -> bool { static INIT: Once = ONCE_INIT; INIT.call_once(|| { // env_logger can only be initialized once diff --git a/programs/native/noop/src/lib.rs b/programs/native/noop/src/lib.rs index e54b1a70e..feb9e0748 100644 --- a/programs/native/noop/src/lib.rs +++ b/programs/native/noop/src/lib.rs @@ -1,9 +1,10 @@ +#[macro_use] extern crate solana_sdk; use solana_sdk::account::KeyedAccount; -#[no_mangle] -pub extern "C" fn process(keyed_accounts: &mut [KeyedAccount], data: &[u8]) -> bool { +solana_entrypoint!(entrypoint); +fn entrypoint(keyed_accounts: &mut [KeyedAccount], data: &[u8]) -> bool { println!("noop: keyed_accounts: {:#?}", keyed_accounts); println!("noop: data: {:?}", data); true diff --git a/sdk/src/native_program.rs b/sdk/src/native_program.rs index 2b9bbf3ec..a7a5d53e0 100644 --- a/sdk/src/native_program.rs +++ b/sdk/src/native_program.rs @@ -6,3 +6,15 @@ pub const ENTRYPOINT: &str = "process"; // Native program ENTRYPOINT prototype pub type Entrypoint = unsafe extern "C" fn(keyed_accounts: &mut [KeyedAccount], data: &[u8]) -> bool; + +// Convenience macro to define the native program entrypoint. Supply a fn to this macro that +// conforms to the `Entrypoint` type signature. +#[macro_export] +macro_rules! solana_entrypoint( + ($entrypoint:ident) => ( + #[no_mangle] + pub extern "C" fn process(keyed_accounts: &mut [KeyedAccount], data: &[u8]) -> bool { + return $entrypoint(keyed_accounts, data); + } + ) +);