Skip to content

Commit e0777a3

Browse files
committed
update bindings
1 parent 6869625 commit e0777a3

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
@@ -118,6 +118,7 @@ bind! {
118118
zend_register_double_constant,
119119
zend_register_ini_entries,
120120
zend_register_internal_enum,
121+
zend_register_internal_interface,
121122
zend_ini_entry_def,
122123
zend_register_internal_class_ex,
123124
zend_register_long_constant,

docsrs_bindings.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1898,6 +1898,11 @@ extern "C" {
18981898
parent_ce: *mut zend_class_entry,
18991899
) -> *mut zend_class_entry;
19001900
}
1901+
extern "C" {
1902+
pub fn zend_register_internal_interface(
1903+
orig_class_entry: *mut zend_class_entry,
1904+
) -> *mut zend_class_entry;
1905+
}
19011906
extern "C" {
19021907
pub fn zend_is_callable(
19031908
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)