Skip to content

Commit 27d96cd

Browse files
committed
feat: Add interface bindings
1 parent 95bebee commit 27d96cd

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},
@@ -306,16 +306,24 @@ impl ClassBuilder {
306306
let func = Box::into_raw(methods.into_boxed_slice()) as *const FunctionEntry;
307307
self.ce.info.internal.builtin_functions = func;
308308

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

321329
// disable serialization if the class has an associated object
@@ -467,6 +475,14 @@ mod tests {
467475
assert!(class.register.is_some());
468476
}
469477

478+
#[test]
479+
fn test_registration_interface() {
480+
let class = ClassBuilder::new("Foo")
481+
.flags(ClassFlags::Interface)
482+
.registration(|_| {});
483+
assert!(class.register.is_some());
484+
}
485+
470486
#[test]
471487
fn test_docs() {
472488
let class = ClassBuilder::new("Foo").docs(&["Doc 1"]);

0 commit comments

Comments
 (0)