Skip to content

Commit 084ec7d

Browse files
committed
Working on ini setting.
1 parent ce46880 commit 084ec7d

File tree

6 files changed

+114
-45
lines changed

6 files changed

+114
-45
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
# PHPer
22

3-
A library that allows us to write PHP extensions in pure Rust, using safe Rust where possible, and also a PHP Binding library.
3+
A library that allows us to write PHP extensions using pure Rust and using safe Rust whenever possible.
44

5-
(一个让我们可以用纯Rust写PHP扩展的库,并且尽可能使用safe Rust,同时也是一个PHP的Binding库。)
5+
(一个让我们可以使用纯Rust并且尽可能使用safe Rust写PHP扩展的库。)
66

77
***Now the peojct is still under development.***
88

phper-macros/src/lib.rs

Lines changed: 89 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -39,23 +39,26 @@ pub fn php_function(_attr: TokenStream, input: TokenStream) -> TokenStream {
3939
pub fn php_minit_function(_attr: TokenStream, input: TokenStream) -> TokenStream {
4040
let input = parse_macro_input!(input as ItemFn);
4141

42-
use syn::export::quote::ToTokens;
43-
44-
let fn_arg = get_context_fn_arg(&input.sig.inputs);
45-
46-
let vis = &input.vis;
42+
let name = &zend_module_startup_n(input.sig.ident.clone());
4743
let inputs = &init_func_args(Punctuated::new());
48-
let name = &input.sig.ident;
44+
let inner_inputs = &input.sig.inputs;
45+
let ret = &input.sig.output;
4946
let body = &input.block;
5047
let attrs = &input.attrs;
5148

52-
let name = Ident::new(&format!("zm_startup_{}", name), Span::call_site());
53-
5449
let result = quote! {
5550
#[no_mangle]
5651
#(#attrs)*
57-
#vis extern "C" fn #name(#inputs) -> ::std::os::raw::c_int {
58-
#body
52+
pub extern "C" fn #name(#inputs) -> ::std::os::raw::c_int {
53+
let f = |#inner_inputs| #ret {
54+
#body
55+
};
56+
let b: bool = f();
57+
if b {
58+
::phper_sys::ZEND_RESULT_CODE_SUCCESS
59+
} else {
60+
::phper_sys::ZEND_RESULT_CODE_FAILURE
61+
}
5962
}
6063
};
6164

@@ -67,19 +70,20 @@ pub fn php_mshutdown_function(_attr: TokenStream, input: TokenStream) -> TokenSt
6770
let input = parse_macro_input!(input as ItemFn);
6871

6972
let name = &zend_module_shutdown_n(input.sig.ident.clone());
73+
let inputs = &shutdown_func_args(Punctuated::new());
74+
let inner_inputs = &input.sig.inputs;
7075
let ret = &input.sig.output;
71-
let inputs = shutdown_func_args(Punctuated::new());
7276
let body = &input.block;
7377
let attrs = &input.attrs;
7478

7579
let result = quote! {
7680
#[no_mangle]
81+
#(#attrs)*
7782
pub extern "C" fn #name(#inputs) -> ::std::os::raw::c_int {
78-
#(#attrs)*
79-
fn #name() #ret {
83+
let f = |#inner_inputs| #ret {
8084
#body
81-
}
82-
let b: bool = #name();
85+
};
86+
let b: bool = f();
8387
if b {
8488
::phper_sys::ZEND_RESULT_CODE_SUCCESS
8589
} else {
@@ -95,19 +99,26 @@ pub fn php_mshutdown_function(_attr: TokenStream, input: TokenStream) -> TokenSt
9599
pub fn php_rinit_function(_attr: TokenStream, input: TokenStream) -> TokenStream {
96100
let input = parse_macro_input!(input as ItemFn);
97101

98-
let vis = &input.vis;
99-
let inputs = &init_func_args(input.sig.inputs.clone());
100-
let name = &input.sig.ident;
102+
let name = &zend_module_activate_n(input.sig.ident.clone());
103+
let inputs = &init_func_args(Punctuated::new());
104+
let inner_inputs = &input.sig.inputs;
105+
let ret = &input.sig.output;
101106
let body = &input.block;
102107
let attrs = &input.attrs;
103108

104-
let name = Ident::new(&format!("zm_activate_{}", name), Span::call_site());
105-
106109
let result = quote! {
107110
#[no_mangle]
108-
#(#attrs)*
109-
#vis extern "C" fn #name(#inputs) -> ::std::os::raw::c_int {
110-
#body
111+
pub extern "C" fn #name(#inputs) -> ::std::os::raw::c_int {
112+
#(#attrs)*
113+
fn #name(#inner_inputs) #ret {
114+
#body
115+
}
116+
let b: bool = #name();
117+
if b {
118+
::phper_sys::ZEND_RESULT_CODE_SUCCESS
119+
} else {
120+
::phper_sys::ZEND_RESULT_CODE_FAILURE
121+
}
111122
}
112123
};
113124

@@ -118,19 +129,51 @@ pub fn php_rinit_function(_attr: TokenStream, input: TokenStream) -> TokenStream
118129
pub fn php_rshutdown_function(_attr: TokenStream, mut input: TokenStream) -> TokenStream {
119130
let input = parse_macro_input!(input as ItemFn);
120131

121-
let vis = &input.vis;
122-
let inputs = &shutdown_func_args(input.sig.inputs.clone());
123-
let name = &input.sig.ident;
132+
let name = &zend_module_deactivate_n(input.sig.ident.clone());
133+
let inputs = &init_func_args(Punctuated::new());
134+
let inner_inputs = &input.sig.inputs;
135+
let ret = &input.sig.output;
124136
let body = &input.block;
125137
let attrs = &input.attrs;
126138

127-
let name = Ident::new(&format!("zm_deactivate_{}", name), Span::call_site());
139+
let result = quote! {
140+
#[no_mangle]
141+
pub extern "C" fn #name(#inputs) -> ::std::os::raw::c_int {
142+
#(#attrs)*
143+
fn #name(#inner_inputs) #ret {
144+
#body
145+
}
146+
let b: bool = #name();
147+
if b {
148+
::phper_sys::ZEND_RESULT_CODE_SUCCESS
149+
} else {
150+
::phper_sys::ZEND_RESULT_CODE_FAILURE
151+
}
152+
}
153+
};
154+
155+
result.into()
156+
}
157+
158+
#[proc_macro_attribute]
159+
pub fn php_minfo_function(_attr: TokenStream, input: TokenStream) -> TokenStream {
160+
let input = parse_macro_input!(input as ItemFn);
161+
162+
let name = &zend_module_info_n(input.sig.ident.clone());
163+
let inputs = &zend_module_info_func_args(Punctuated::new());
164+
let inner_inputs = &input.sig.inputs;
165+
let ret = &input.sig.output;
166+
let body = &input.block;
167+
let attrs = &input.attrs;
128168

129169
let result = quote! {
130170
#[no_mangle]
131171
#(#attrs)*
132-
#vis extern "C" fn #name(#inputs) -> ::std::os::raw::c_int {
133-
#body
172+
pub extern "C" fn #name(#inputs) {
173+
let f = |#inner_inputs| #ret {
174+
#body
175+
};
176+
let _: () = f();
134177
}
135178
};
136179

@@ -154,22 +197,27 @@ fn shutdown_func_args(mut inputs: Punctuated<FnArg, Comma>) -> Punctuated<FnArg,
154197
inputs
155198
}
156199

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());
200+
fn zend_module_info_func_args(mut inputs: Punctuated<FnArg, Comma>) -> Punctuated<FnArg, Comma> {
201+
inputs.push(parse_str("zend_module: *mut ::phper_sys::zend_module_entry").unwrap());
202+
inputs
203+
}
204+
205+
fn zend_module_startup_n(ident: Ident) -> Ident {
206+
Ident::new(&format!("zm_startup_{}", ident), ident.span())
159207
}
160208

161209
fn zend_module_shutdown_n(ident: Ident) -> Ident {
162210
Ident::new(&format!("zm_shutdown_{}", ident), ident.span())
163211
}
164212

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-
})
213+
fn zend_module_activate_n(ident: Ident) -> Ident {
214+
Ident::new(&format!("zm_activate_{}", ident), ident.span())
215+
}
216+
217+
fn zend_module_deactivate_n(ident: Ident) -> Ident {
218+
Ident::new(&format!("zm_deactivate_{}", ident), ident.span())
219+
}
220+
221+
fn zend_module_info_n(ident: Ident) -> Ident {
222+
Ident::new(&format!("zm_info_{}", ident), ident.span())
175223
}

phper-sys/php_wrapper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,7 @@
66
#define PHPER_PHP_WRAPPER_H
77

88
#include <php.h>
9+
#include <php_ini.h>
10+
#include <ext/standard/info.h>
911

1012
#endif //PHPER_PHP_WRAPPER_H

phper-sys/src/zend/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
pub_use_mod!(zend_alloc);
22
pub_use_mod!(zend_api);
33
pub_use_mod!(zend_compile);
4+
pub_use_mod!(zend_ini);
45
pub_use_mod!(zend_string);
56
pub_use_mod!(zend_types);

phper-sys/src/zend/zend_api.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22
macro_rules! zend_fe_end {
33
() => {
44
$crate::zend_function_entry {
5-
fname: 0 as *const c_char,
5+
fname: std::ptr::null(),
66
handler: None,
7-
arg_info: 0 as *const $crate::zend_internal_arg_info,
7+
arg_info: std::ptr::null(),
88
num_args: 0,
99
flags: 0,
1010
}

phper-sys/src/zend/zend_ini.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
#[macro_export]
2+
macro_rules! zend_ini_end {
3+
() => {
4+
$crate::zend_ini_entry_def {
5+
name: std::ptr::null_mut(),
6+
on_modify: None,
7+
mh_arg1: std::ptr::null_mut(),
8+
mh_arg2: std::ptr::null_mut(),
9+
mh_arg3: std::ptr::null_mut(),
10+
value: std::ptr::null_mut(),
11+
displayer: None,
12+
modifiable: 0,
13+
name_length: 0,
14+
value_length: 0,
15+
}
16+
};
17+
}
18+

0 commit comments

Comments
 (0)