6
6
//
7
7
8
8
use proc_macro:: TokenStream ;
9
- use quote:: ToTokens ;
10
9
use quote:: format_ident;
11
10
use quote:: quote;
11
+ use quote:: ToTokens ;
12
12
13
13
extern crate proc_macro;
14
14
15
15
fn invalid_parameter ( stream : impl ToTokens ) -> ! {
16
- panic ! ( "Invalid parameter `{}`: registered routines can only accept SEXP parameters." , stream. to_token_stream( ) ) ;
16
+ panic ! (
17
+ "Invalid parameter `{}`: registered routines can only accept SEXP parameters." ,
18
+ stream. to_token_stream( )
19
+ ) ;
17
20
}
18
21
19
22
fn invalid_return_type ( stream : impl ToTokens ) -> ! {
20
- panic ! ( "Invalid return type `{}`: registered routines must return a SEXP." , stream. to_token_stream( ) ) ;
23
+ panic ! (
24
+ "Invalid return type `{}`: registered routines must return a SEXP." ,
25
+ stream. to_token_stream( )
26
+ ) ;
21
27
}
22
28
23
29
fn invalid_extern ( stream : impl ToTokens ) -> ! {
24
- panic ! ( "Invalid signature `{}`: registered routines must be 'extern \" C\" '." , stream. to_token_stream( ) ) ;
30
+ panic ! (
31
+ "Invalid signature `{}`: registered routines must be 'extern \" C\" '." ,
32
+ stream. to_token_stream( )
33
+ ) ;
25
34
}
26
35
27
36
#[ proc_macro_attribute]
28
37
pub fn register ( _attr : TokenStream , item : TokenStream ) -> TokenStream {
29
-
30
38
// Get metadata about the function being registered.
31
- let function : syn:: ItemFn = syn:: parse ( item) . unwrap ( ) ;
39
+ let function: syn:: ItemFn = syn:: parse ( item) . unwrap ( ) ;
32
40
33
41
// Make sure the function is 'extern "C"'.
34
42
let abi = match function. sig . abi {
@@ -48,7 +56,6 @@ pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
48
56
49
57
// Make sure that the function only accepts SEXPs.
50
58
for input in function. sig . inputs . iter ( ) {
51
-
52
59
let pattern = match input {
53
60
syn:: FnArg :: Typed ( pattern) => pattern,
54
61
syn:: FnArg :: Receiver ( receiver) => invalid_parameter ( receiver) ,
@@ -63,13 +70,12 @@ pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
63
70
if value != "SEXP" {
64
71
invalid_parameter ( pattern) ;
65
72
}
66
-
67
73
}
68
74
69
75
// Make sure that the function returns a SEXP.
70
76
let ty = match function. sig . output {
71
77
syn:: ReturnType :: Type ( _, ref ty) => ty,
72
- _ => invalid_return_type ( function. sig . output )
78
+ _ => invalid_return_type ( function. sig . output ) ,
73
79
} ;
74
80
75
81
let stream = ty. into_token_stream ( ) ;
@@ -97,7 +103,7 @@ pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
97
103
98
104
unsafe {
99
105
harp:: routines:: add( R_CallMethodDef {
100
- name: ( #name) . as_ptr( ) as * const i8 ,
106
+ name: ( #name) . as_ptr( ) as * const c_char ,
101
107
fun: Some ( :: std:: mem:: transmute( #ident as * const ( ) ) ) ,
102
108
numArgs: #nargs
103
109
} ) ;
@@ -110,5 +116,4 @@ pub fn register(_attr: TokenStream, item: TokenStream) -> TokenStream {
110
116
// Put everything together.
111
117
let all = quote ! { #function #registration } ;
112
118
all. into ( )
113
-
114
119
}
0 commit comments