Skip to content

Commit ce46880

Browse files
committed
Working on hook functions.
1 parent 6344e42 commit ce46880

File tree

8 files changed

+71
-146
lines changed

8 files changed

+71
-146
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ First you have to install `cargo-generate`:
1414
cargo install cargo-generate
1515
```
1616

17-
Then create a PHP extension project from template:
17+
Then create a PHP extension project from the [template](https://github.com/jmjoy/phper-ext-skel.git):
1818

1919
```bash
2020
cargo generate --git https://github.com/jmjoy/phper-ext-skel.git

phper-macros/src/lib.rs

Lines changed: 45 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ extern crate proc_macro;
22
extern crate syn;
33

44
use proc_macro::TokenStream;
5-
use syn::{parse_macro_input, ItemFn, FnArg, parse_str, ExprLet};
6-
use quote::quote;
75
use proc_macro2::{Ident, Span};
6+
use quote::quote;
87
use syn::punctuated::Punctuated;
98
use syn::token::Comma;
9+
use syn::{parse_macro_input, parse_str, FnArg, ItemFn};
1010

1111
#[proc_macro_attribute]
1212
pub fn php_function(_attr: TokenStream, input: TokenStream) -> TokenStream {
@@ -39,15 +39,16 @@ 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+
4246
let vis = &input.vis;
43-
let inputs = &input.sig.inputs;
47+
let inputs = &init_func_args(Punctuated::new());
4448
let name = &input.sig.ident;
4549
let body = &input.block;
4650
let attrs = &input.attrs;
4751

48-
let mut inputs = &mut inputs.clone();
49-
init_func_args(&mut inputs);
50-
5152
let name = Ident::new(&format!("zm_startup_{}", name), Span::call_site());
5253

5354
let result = quote! {
@@ -65,22 +66,25 @@ pub fn php_minit_function(_attr: TokenStream, input: TokenStream) -> TokenStream
6566
pub fn php_mshutdown_function(_attr: TokenStream, input: TokenStream) -> TokenStream {
6667
let input = parse_macro_input!(input as ItemFn);
6768

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());
7172
let body = &input.block;
7273
let attrs = &input.attrs;
7374

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-
7975
let result = quote! {
8076
#[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+
}
8488
}
8589
};
8690

@@ -92,14 +96,11 @@ pub fn php_rinit_function(_attr: TokenStream, input: TokenStream) -> TokenStream
9296
let input = parse_macro_input!(input as ItemFn);
9397

9498
let vis = &input.vis;
95-
let inputs = &input.sig.inputs;
99+
let inputs = &init_func_args(input.sig.inputs.clone());
96100
let name = &input.sig.ident;
97101
let body = &input.block;
98102
let attrs = &input.attrs;
99103

100-
let mut inputs = &mut inputs.clone();
101-
init_func_args(&mut inputs);
102-
103104
let name = Ident::new(&format!("zm_activate_{}", name), Span::call_site());
104105

105106
let result = quote! {
@@ -114,18 +115,15 @@ pub fn php_rinit_function(_attr: TokenStream, input: TokenStream) -> TokenStream
114115
}
115116

116117
#[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 {
118119
let input = parse_macro_input!(input as ItemFn);
119120

120121
let vis = &input.vis;
121-
let inputs = &input.sig.inputs;
122+
let inputs = &shutdown_func_args(input.sig.inputs.clone());
122123
let name = &input.sig.ident;
123124
let body = &input.block;
124125
let attrs = &input.attrs;
125126

126-
let mut inputs = &mut inputs.clone();
127-
shutdown_func_args(&mut inputs);
128-
129127
let name = Ident::new(&format!("zm_deactivate_{}", name), Span::call_site());
130128

131129
let result = quote! {
@@ -139,34 +137,39 @@ pub fn php_rshutdown_function(_attr: TokenStream, input: TokenStream) -> TokenSt
139137
result.into()
140138
}
141139

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-
156140
fn internal_function_parameters(inputs: &mut Punctuated<FnArg, Comma>) {
157141
inputs.push(parse_str("execute_data: *mut ::phper_sys::zend_execute_data").unwrap());
158142
inputs.push(parse_str("return_value: *mut ::phper_sys::zval").unwrap());
159143
}
160144

161-
fn init_func_args(inputs: &mut Punctuated<FnArg, Comma>) {
145+
fn init_func_args(mut inputs: Punctuated<FnArg, Comma>) -> Punctuated<FnArg, Comma> {
162146
inputs.push(parse_str("r#type: ::std::os::raw::c_int").unwrap());
163147
inputs.push(parse_str("module_number: ::std::os::raw::c_int").unwrap());
148+
inputs
164149
}
165150

166-
fn shutdown_func_args(inputs: &mut Punctuated<FnArg, Comma>) {
151+
fn shutdown_func_args(mut inputs: Punctuated<FnArg, Comma>) -> Punctuated<FnArg, Comma> {
167152
inputs.push(parse_str("r#type: ::std::os::raw::c_int").unwrap());
168153
inputs.push(parse_str("module_number: ::std::os::raw::c_int").unwrap());
154+
inputs
169155
}
170156

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+
}
171160

161+
fn zend_module_shutdown_n(ident: Ident) -> Ident {
162+
Ident::new(&format!("zm_shutdown_{}", ident), ident.span())
163+
}
172164

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+
}

phper-sys/src/macros.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ macro_rules! pub_use_mod {
33
mod $i;
44
pub use self::$i::*;
55
};
6-
}
6+
}

phper-sys/src/zend/zend_types.rs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -71,26 +71,26 @@ macro_rules! zval_true {
7171
#[macro_export]
7272
macro_rules! zval_bool {
7373
($z: expr, $b: expr) => {
74-
let $b: bool = $b;
75-
$crate::z_type_info!($z) = if $b { $crate::IS_TRUE } else { $crate::IS_FALSE };
74+
let __b: bool = $b;
75+
$crate::z_type_info!($z) = if __b { $crate::IS_TRUE } else { $crate::IS_FALSE };
7676
};
7777
}
7878

7979
#[macro_export]
8080
macro_rules! zval_long {
8181
($z: expr, $l: expr) => {
82-
let $z: *mut $crate::zval = $z;
83-
$crate::z_lval_p($z) = $l;
84-
$crate::z_type_info!($z) = $crate::IS_LONG;
82+
let __z: *mut $crate::zval = $z;
83+
$crate::z_lval_p(__z) = $l;
84+
$crate::z_type_info!(__z) = $crate::IS_LONG;
8585
};
8686
}
8787

8888
#[macro_export]
8989
macro_rules! zval_double {
9090
($z: expr, $d: expr) => {
91-
let $z: *mut $crate::zval = $z;
92-
$crate::z_lval_p($z) = $l;
93-
$crate::z_type_info!($z) = $crate::IS_DOUBLE;
91+
let __z: *mut $crate::zval = $z;
92+
$crate::z_lval_p(__z) = $l;
93+
$crate::z_type_info!(__z) = $crate::IS_DOUBLE;
9494
};
9595
}
9696

@@ -111,10 +111,10 @@ macro_rules! z_str_p {
111111
#[macro_export]
112112
macro_rules! zval_str {
113113
($z: expr, $s: expr) => {
114-
let $z: *mut $crate::zval = $z;
115-
let $s: *mut $crate::zend_string = $s;
116-
$crate::z_str_p!($z) = $s;
117-
$crate::z_type_info_p!($z) = if $crate::zstr_is_interned!(__s) {
114+
let __z: *mut $crate::zval = $z;
115+
let __s: *mut $crate::zend_string = $s;
116+
$crate::z_str_p!(__z) = __s;
117+
$crate::z_type_info_p!(__z) = if $crate::zstr_is_interned!(__s) {
118118
::phper_sys::IS_INTERNED_STRING_EX
119119
} else {
120120
::phper_sys::IS_STRING_EX

phper/src/alloc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use core::alloc::{GlobalAlloc, Layout};
22
use core::ffi::c_void;
33

4-
use crate::emalloc;
5-
use crate::efree;
4+
use phper_sys::efree;
5+
use phper_sys::emalloc;
66

77
pub struct EAllocator;
88

phper/src/context.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
pub trait ModuleContext {
2+
fn new() -> Self;
3+
4+
fn has_ini_entries(&self) -> bool {
5+
false
6+
}
7+
}
8+
9+
pub trait RequestContext {}

phper/src/lib.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
extern crate phper_macros;
22

33
pub mod alloc;
4-
mod macros;
4+
pub mod context;
55

66
pub use phper_macros::*;
7-
8-

phper/src/macros.rs

Lines changed: 0 additions & 85 deletions
This file was deleted.

0 commit comments

Comments
 (0)