@@ -2,11 +2,11 @@ extern crate proc_macro;
2
2
extern crate syn;
3
3
4
4
use proc_macro:: TokenStream ;
5
- use syn:: { parse_macro_input, ItemFn , FnArg , parse_str, ExprLet } ;
6
- use quote:: quote;
7
5
use proc_macro2:: { Ident , Span } ;
6
+ use quote:: quote;
8
7
use syn:: punctuated:: Punctuated ;
9
8
use syn:: token:: Comma ;
9
+ use syn:: { parse_macro_input, parse_str, FnArg , ItemFn } ;
10
10
11
11
#[ proc_macro_attribute]
12
12
pub fn php_function ( _attr : TokenStream , input : TokenStream ) -> TokenStream {
@@ -39,15 +39,16 @@ pub fn php_function(_attr: TokenStream, input: TokenStream) -> TokenStream {
39
39
pub fn php_minit_function ( _attr : TokenStream , input : TokenStream ) -> TokenStream {
40
40
let input = parse_macro_input ! ( input as ItemFn ) ;
41
41
42
+ use syn:: export:: quote:: ToTokens ;
43
+
44
+ let fn_arg = get_context_fn_arg ( & input. sig . inputs ) ;
45
+
42
46
let vis = & input. vis ;
43
- let inputs = & input . sig . inputs ;
47
+ let inputs = & init_func_args ( Punctuated :: new ( ) ) ;
44
48
let name = & input. sig . ident ;
45
49
let body = & input. block ;
46
50
let attrs = & input. attrs ;
47
51
48
- let mut inputs = & mut inputs. clone ( ) ;
49
- init_func_args ( & mut inputs) ;
50
-
51
52
let name = Ident :: new ( & format ! ( "zm_startup_{}" , name) , Span :: call_site ( ) ) ;
52
53
53
54
let result = quote ! {
@@ -65,22 +66,25 @@ pub fn php_minit_function(_attr: TokenStream, input: TokenStream) -> TokenStream
65
66
pub fn php_mshutdown_function ( _attr : TokenStream , input : TokenStream ) -> TokenStream {
66
67
let input = parse_macro_input ! ( input as ItemFn ) ;
67
68
68
- let vis = & input. vis ;
69
- let inputs = & input. sig . inputs ;
70
- let name = & input . sig . ident ;
69
+ let name = & zend_module_shutdown_n ( input. sig . ident . clone ( ) ) ;
70
+ let ret = & input. sig . output ;
71
+ let inputs = shutdown_func_args ( Punctuated :: new ( ) ) ;
71
72
let body = & input. block ;
72
73
let attrs = & input. attrs ;
73
74
74
- let mut inputs = & mut inputs. clone ( ) ;
75
- shutdown_func_args ( & mut inputs) ;
76
-
77
- let name = Ident :: new ( & format ! ( "zm_shutdown_{}" , name) , Span :: call_site ( ) ) ;
78
-
79
75
let result = quote ! {
80
76
#[ no_mangle]
81
- #( #attrs) *
82
- #vis extern "C" fn #name( #inputs) -> :: std:: os:: raw:: c_int {
83
- #body
77
+ pub extern "C" fn #name( #inputs) -> :: std:: os:: raw:: c_int {
78
+ #( #attrs) *
79
+ fn #name( ) #ret {
80
+ #body
81
+ }
82
+ let b: bool = #name( ) ;
83
+ if b {
84
+ :: phper_sys:: ZEND_RESULT_CODE_SUCCESS
85
+ } else {
86
+ :: phper_sys:: ZEND_RESULT_CODE_FAILURE
87
+ }
84
88
}
85
89
} ;
86
90
@@ -92,14 +96,11 @@ pub fn php_rinit_function(_attr: TokenStream, input: TokenStream) -> TokenStream
92
96
let input = parse_macro_input ! ( input as ItemFn ) ;
93
97
94
98
let vis = & input. vis ;
95
- let inputs = & input. sig . inputs ;
99
+ let inputs = & init_func_args ( input. sig . inputs . clone ( ) ) ;
96
100
let name = & input. sig . ident ;
97
101
let body = & input. block ;
98
102
let attrs = & input. attrs ;
99
103
100
- let mut inputs = & mut inputs. clone ( ) ;
101
- init_func_args ( & mut inputs) ;
102
-
103
104
let name = Ident :: new ( & format ! ( "zm_activate_{}" , name) , Span :: call_site ( ) ) ;
104
105
105
106
let result = quote ! {
@@ -114,18 +115,15 @@ pub fn php_rinit_function(_attr: TokenStream, input: TokenStream) -> TokenStream
114
115
}
115
116
116
117
#[ proc_macro_attribute]
117
- pub fn php_rshutdown_function ( _attr : TokenStream , input : TokenStream ) -> TokenStream {
118
+ pub fn php_rshutdown_function ( _attr : TokenStream , mut input : TokenStream ) -> TokenStream {
118
119
let input = parse_macro_input ! ( input as ItemFn ) ;
119
120
120
121
let vis = & input. vis ;
121
- let inputs = & input. sig . inputs ;
122
+ let inputs = & shutdown_func_args ( input. sig . inputs . clone ( ) ) ;
122
123
let name = & input. sig . ident ;
123
124
let body = & input. block ;
124
125
let attrs = & input. attrs ;
125
126
126
- let mut inputs = & mut inputs. clone ( ) ;
127
- shutdown_func_args ( & mut inputs) ;
128
-
129
127
let name = Ident :: new ( & format ! ( "zm_deactivate_{}" , name) , Span :: call_site ( ) ) ;
130
128
131
129
let result = quote ! {
@@ -139,34 +137,39 @@ pub fn php_rshutdown_function(_attr: TokenStream, input: TokenStream) -> TokenSt
139
137
result. into ( )
140
138
}
141
139
142
- //#[proc_macro_attribute]
143
- //pub fn zend_parse_parameters(_attr: TokenStream, input: TokenStream) -> TokenStream {
144
- // dbg!(&input);
145
- //
146
- //// let input = parse_macro_input!(input as ExprLet);
147
- //
148
- // input
149
- //}
150
-
151
- #[ proc_macro_attribute]
152
- pub fn hehe ( _attr : TokenStream , input : TokenStream ) -> TokenStream {
153
- input
154
- }
155
-
156
140
fn internal_function_parameters ( inputs : & mut Punctuated < FnArg , Comma > ) {
157
141
inputs. push ( parse_str ( "execute_data: *mut ::phper_sys::zend_execute_data" ) . unwrap ( ) ) ;
158
142
inputs. push ( parse_str ( "return_value: *mut ::phper_sys::zval" ) . unwrap ( ) ) ;
159
143
}
160
144
161
- fn init_func_args ( inputs : & mut Punctuated < FnArg , Comma > ) {
145
+ fn init_func_args ( mut inputs : Punctuated < FnArg , Comma > ) -> Punctuated < FnArg , Comma > {
162
146
inputs. push ( parse_str ( "r#type: ::std::os::raw::c_int" ) . unwrap ( ) ) ;
163
147
inputs. push ( parse_str ( "module_number: ::std::os::raw::c_int" ) . unwrap ( ) ) ;
148
+ inputs
164
149
}
165
150
166
- fn shutdown_func_args ( inputs : & mut Punctuated < FnArg , Comma > ) {
151
+ fn shutdown_func_args ( mut inputs : Punctuated < FnArg , Comma > ) -> Punctuated < FnArg , Comma > {
167
152
inputs. push ( parse_str ( "r#type: ::std::os::raw::c_int" ) . unwrap ( ) ) ;
168
153
inputs. push ( parse_str ( "module_number: ::std::os::raw::c_int" ) . unwrap ( ) ) ;
154
+ inputs
169
155
}
170
156
157
+ fn zend_module_info_func_args ( inputs : & mut Punctuated < FnArg , Comma > ) {
158
+ inputs. push ( parse_str ( "zend_module_entry: *mut ::phper_sys::zend_module" ) . unwrap ( ) ) ;
159
+ }
171
160
161
+ fn zend_module_shutdown_n ( ident : Ident ) -> Ident {
162
+ Ident :: new ( & format ! ( "zm_shutdown_{}" , ident) , ident. span ( ) )
163
+ }
172
164
165
+ fn get_context_fn_arg ( inputs : & Punctuated < FnArg , Comma > ) -> Option < & FnArg > {
166
+ inputs. iter ( ) . find ( |fn_arg| match fn_arg {
167
+ FnArg :: Typed ( pat_type) => pat_type. attrs . iter ( ) . any ( |attr| {
168
+ attr. path
169
+ . segments
170
+ . iter ( )
171
+ . any ( |seg| seg. ident . to_string ( ) == "context" . to_string ( ) )
172
+ } ) ,
173
+ _ => false ,
174
+ } )
175
+ }
0 commit comments