Skip to content

Commit cb0e11a

Browse files
committed
Optimize zend_parse_fixed_parameters.
1 parent 9bc2a50 commit cb0e11a

File tree

2 files changed

+89
-75
lines changed

2 files changed

+89
-75
lines changed

examples/simple/src/lib.rs

Lines changed: 7 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -96,21 +96,14 @@ static ARG_INFO_TEST_SIMPLE: MultiInternalArgInfo<3> = MultiInternalArgInfo::new
9696
},
9797
]);
9898

99-
static FUNCTION_ENTRIES: FunctionEntries<3> = FunctionEntries::new([
99+
static FUNCTION_ENTRIES: FunctionEntries<2> = FunctionEntries::new([
100100
zend_function_entry {
101101
fname: c_str_ptr!("test_simple"),
102102
handler: Some(php_fn!(test_simple)),
103103
arg_info: ARG_INFO_TEST_SIMPLE.get(),
104104
num_args: 2,
105105
flags: 0,
106106
},
107-
zend_function_entry {
108-
fname: c_str_ptr!("test_parse"),
109-
handler: Some(php_fn!(test_parse)),
110-
arg_info: null(),
111-
num_args: 0,
112-
flags: 0,
113-
},
114107
function_entry_end(),
115108
]);
116109

@@ -144,33 +137,20 @@ static MY_CLASS_METHODS: FunctionEntries<2> = FunctionEntries::new([
144137

145138
#[php_function]
146139
pub fn my_class_foo(execute_data: ExecuteData) -> impl SetVal {
147-
let mut prefix: *const c_char = null_mut();
148-
let mut prefix_len = 0;
149-
150-
unsafe {
151-
if zend_parse_parameters(
152-
execute_data.num_args() as c_int,
153-
c_str_ptr!("s"),
154-
&mut prefix,
155-
&mut prefix_len,
156-
) != ZEND_RESULT_CODE_SUCCESS
157-
{
158-
return None;
159-
}
160-
161-
let prefix = CStr::from_ptr(prefix).to_str().unwrap();
162-
140+
execute_data.parse_parameters::<&str>().map(|prefix| {
163141
let this = if execute_data.get_type() == phper::sys::IS_OBJECT as zend_type {
164142
execute_data.get_this()
165143
} else {
166144
null_mut()
167145
};
168146

169-
let foo = zend_read_property(MY_CLASS_CE.get(), this, c_str_ptr!("foo"), 3, 1, null_mut());
147+
let foo = unsafe {
148+
zend_read_property(MY_CLASS_CE.get(), this, c_str_ptr!("foo"), 3, 1, null_mut())
149+
};
170150
let foo = Val::from_raw(foo);
171151
let foo = foo.as_c_str().unwrap().to_str().unwrap();
172-
Some(format!("{}{}", prefix, foo))
173-
}
152+
format!("{}{}", prefix, foo)
153+
})
174154
}
175155

176156
static MODULE_ENTRY: ModuleEntry = ModuleEntry::new(create_zend_module_entry(

phper/src/zend/types.rs

Lines changed: 82 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ impl ParseParameter for &str {
200200
}
201201

202202
macro_rules! impl_parse_parameter_for_tuple {
203-
{ $(($t:ident,$T:ident)),* } => {
203+
( $(($t:ident,$T:ident)),* ) => {
204204
impl<$($T: ParseParameter,)*> ParseParameter for ($($T,)*) {
205205
fn spec() -> Cow<'static, str> {
206206
let mut s= String::new();
@@ -248,57 +248,91 @@ impl_parse_parameter_for_tuple!((a, A), (b, B), (c, C), (d, D), (e, E), (f, F),
248248
impl_parse_parameter_for_tuple!((a, A), (b, B), (c, C), (d, D), (e, E), (f, F), (g, G), (h, H), (i, I));
249249
impl_parse_parameter_for_tuple!((a, A), (b, B), (c, C), (d, D), (e, E), (f, F), (g, G), (h, H), (i, I), (j, J));
250250

251+
macro_rules! call_zend_parse_parameters {
252+
( $num_args:expr, $type_spec:expr, $parameters:expr $(,$i:expr)* ) => {
253+
unsafe { zend_parse_parameters($num_args, $type_spec, $($parameters.get_unchecked($i).clone(),)*) }
254+
}
255+
}
256+
251257
fn zend_parse_fixed_parameters(num_args: usize, type_spec: &str, parameters: &[*mut c_void]) -> bool {
252258
assert!(parameters.len() <= 20);
253259
let type_spec = format!("{}\0", type_spec);
254260

255-
let p0 = parameters.get(0).map(Clone::clone).unwrap_or(null_mut());
256-
let p1 = parameters.get(1).map(Clone::clone).unwrap_or(null_mut());
257-
let p2 = parameters.get(2).map(Clone::clone).unwrap_or(null_mut());
258-
let p3 = parameters.get(3).map(Clone::clone).unwrap_or(null_mut());
259-
let p4 = parameters.get(4).map(Clone::clone).unwrap_or(null_mut());
260-
let p5 = parameters.get(5).map(Clone::clone).unwrap_or(null_mut());
261-
let p6 = parameters.get(6).map(Clone::clone).unwrap_or(null_mut());
262-
let p7 = parameters.get(7).map(Clone::clone).unwrap_or(null_mut());
263-
let p8 = parameters.get(8).map(Clone::clone).unwrap_or(null_mut());
264-
let p9 = parameters.get(9).map(Clone::clone).unwrap_or(null_mut());
265-
let p10 = parameters.get(10).map(Clone::clone).unwrap_or(null_mut());
266-
let p11 = parameters.get(11).map(Clone::clone).unwrap_or(null_mut());
267-
let p12 = parameters.get(12).map(Clone::clone).unwrap_or(null_mut());
268-
let p13 = parameters.get(13).map(Clone::clone).unwrap_or(null_mut());
269-
let p14 = parameters.get(14).map(Clone::clone).unwrap_or(null_mut());
270-
let p15 = parameters.get(15).map(Clone::clone).unwrap_or(null_mut());
271-
let p16 = parameters.get(16).map(Clone::clone).unwrap_or(null_mut());
272-
let p17 = parameters.get(17).map(Clone::clone).unwrap_or(null_mut());
273-
let p18 = parameters.get(18).map(Clone::clone).unwrap_or(null_mut());
274-
let p19 = parameters.get(19).map(Clone::clone).unwrap_or(null_mut());
275-
276-
unsafe {
277-
zend_parse_parameters(
278-
num_args as c_int,
279-
type_spec.as_ptr().cast(),
280-
p0 ,
281-
p1 ,
282-
p2 ,
283-
p3 ,
284-
p4 ,
285-
p5 ,
286-
p6 ,
287-
p7 ,
288-
p8 ,
289-
p9 ,
290-
p10,
291-
p11,
292-
p12,
293-
p13,
294-
p14,
295-
p15,
296-
p16,
297-
p17,
298-
p18,
299-
p19,
300-
) == ZEND_RESULT_CODE_SUCCESS
301-
}
261+
let b = match parameters.len() {
262+
0 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters),
263+
1 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0),
264+
2 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1),
265+
3 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2),
266+
4 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3),
267+
5 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4),
268+
6 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5),
269+
7 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6),
270+
8 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7),
271+
9 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8),
272+
10 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
273+
11 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
274+
12 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11),
275+
13 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12),
276+
14 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13),
277+
15 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14),
278+
16 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15),
279+
17 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16),
280+
18 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17),
281+
19 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18),
282+
20 => call_zend_parse_parameters!(num_args as c_int, type_spec.as_ptr().cast(), parameters, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19),
283+
_ => unreachable!(),
284+
};
285+
286+
b == ZEND_RESULT_CODE_SUCCESS
287+
288+
289+
// let p0 = parameters.get(0).map(Clone::clone).unwrap_or(null_mut());
290+
// let p1 = parameters.get(1).map(Clone::clone).unwrap_or(null_mut());
291+
// let p2 = parameters.get(2).map(Clone::clone).unwrap_or(null_mut());
292+
// let p3 = parameters.get(3).map(Clone::clone).unwrap_or(null_mut());
293+
// let p4 = parameters.get(4).map(Clone::clone).unwrap_or(null_mut());
294+
// let p5 = parameters.get(5).map(Clone::clone).unwrap_or(null_mut());
295+
// let p6 = parameters.get(6).map(Clone::clone).unwrap_or(null_mut());
296+
// let p7 = parameters.get(7).map(Clone::clone).unwrap_or(null_mut());
297+
// let p8 = parameters.get(8).map(Clone::clone).unwrap_or(null_mut());
298+
// let p9 = parameters.get(9).map(Clone::clone).unwrap_or(null_mut());
299+
// let p10 = parameters.get(10).map(Clone::clone).unwrap_or(null_mut());
300+
// let p11 = parameters.get(11).map(Clone::clone).unwrap_or(null_mut());
301+
// let p12 = parameters.get(12).map(Clone::clone).unwrap_or(null_mut());
302+
// let p13 = parameters.get(13).map(Clone::clone).unwrap_or(null_mut());
303+
// let p14 = parameters.get(14).map(Clone::clone).unwrap_or(null_mut());
304+
// let p15 = parameters.get(15).map(Clone::clone).unwrap_or(null_mut());
305+
// let p16 = parameters.get(16).map(Clone::clone).unwrap_or(null_mut());
306+
// let p17 = parameters.get(17).map(Clone::clone).unwrap_or(null_mut());
307+
// let p18 = parameters.get(18).map(Clone::clone).unwrap_or(null_mut());
308+
// let p19 = parameters.get(19).map(Clone::clone).unwrap_or(null_mut());
309+
//
310+
// unsafe {
311+
// zend_parse_parameters(
312+
// num_args as c_int,
313+
// type_spec.as_ptr().cast(),
314+
// p0 ,
315+
// p1 ,
316+
// p2 ,
317+
// p3 ,
318+
// p4 ,
319+
// p5 ,
320+
// p6 ,
321+
// p7 ,
322+
// p8 ,
323+
// p9 ,
324+
// p10,
325+
// p11,
326+
// p12,
327+
// p13,
328+
// p14,
329+
// p15,
330+
// p16,
331+
// p17,
332+
// p18,
333+
// p19,
334+
// ) == ZEND_RESULT_CODE_SUCCESS
335+
// }
302336
}
303337

304338
#[repr(u32)]

0 commit comments

Comments
 (0)