Skip to content

Commit 0f84eef

Browse files
committed
update bindings
1 parent 43ed2ca commit 0f84eef

File tree

3 files changed

+33
-11
lines changed

3 files changed

+33
-11
lines changed

allowed_bindings.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ bind! {
114114
zend_register_bool_constant,
115115
zend_register_double_constant,
116116
zend_register_ini_entries,
117+
zend_register_internal_interface,
117118
zend_ini_entry_def,
118119
zend_register_internal_class_ex,
119120
zend_register_long_constant,

docsrs_bindings.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1897,6 +1897,11 @@ extern "C" {
18971897
parent_ce: *mut zend_class_entry,
18981898
) -> *mut zend_class_entry;
18991899
}
1900+
extern "C" {
1901+
pub fn zend_register_internal_interface(
1902+
orig_class_entry: *mut zend_class_entry,
1903+
) -> *mut zend_class_entry;
1904+
}
19001905
extern "C" {
19011906
pub fn zend_is_callable(
19021907
callable: *mut zval,

src/builders/class.rs

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::{
99
exception::PhpException,
1010
ffi::{
1111
zend_declare_class_constant, zend_declare_property, zend_do_implement_interface,
12-
zend_register_internal_class_ex,
12+
zend_register_internal_class_ex, zend_register_internal_interface,
1313
},
1414
flags::{ClassFlags, MethodFlags, PropertyFlags},
1515
types::{ZendClassObject, ZendObject, ZendStr, Zval},
@@ -301,16 +301,24 @@ impl ClassBuilder {
301301
let func = Box::into_raw(methods.into_boxed_slice()) as *const FunctionEntry;
302302
self.ce.info.internal.builtin_functions = func;
303303

304-
let class = unsafe {
305-
zend_register_internal_class_ex(
306-
&raw mut self.ce,
307-
match self.extends {
308-
Some((ptr, _)) => ptr::from_ref(ptr()).cast_mut(),
309-
None => std::ptr::null_mut(),
310-
},
311-
)
312-
.as_mut()
313-
.ok_or(Error::InvalidPointer)?
304+
let class = if self.ce.flags().contains(ClassFlags::Interface) {
305+
unsafe {
306+
zend_register_internal_interface(&mut self.ce)
307+
.as_mut()
308+
.ok_or(Error::InvalidPointer)?
309+
}
310+
} else {
311+
unsafe {
312+
zend_register_internal_class_ex(
313+
&raw mut self.ce,
314+
match self.extends {
315+
Some((ptr, _)) => ptr::from_ref(ptr()).cast_mut(),
316+
None => std::ptr::null_mut(),
317+
},
318+
)
319+
.as_mut()
320+
.ok_or(Error::InvalidPointer)?
321+
}
314322
};
315323

316324
// disable serialization if the class has an associated object
@@ -461,6 +469,14 @@ mod tests {
461469
assert!(class.register.is_some());
462470
}
463471

472+
#[test]
473+
fn test_registration_interface() {
474+
let class = ClassBuilder::new("Foo")
475+
.flags(ClassFlags::Interface)
476+
.registration(|_| {});
477+
assert!(class.register.is_some());
478+
}
479+
464480
#[test]
465481
fn test_docs() {
466482
let class = ClassBuilder::new("Foo").docs(&["Doc 1"]);

0 commit comments

Comments
 (0)