diff --git a/allowed_bindings.rs b/allowed_bindings.rs index 6afa7ca35..d07be358a 100644 --- a/allowed_bindings.rs +++ b/allowed_bindings.rs @@ -88,6 +88,7 @@ bind! { zend_hash_str_update, zend_internal_arg_info, zend_is_callable, + zend_is_identical, zend_long, zend_lookup_class_ex, zend_module_entry, diff --git a/docsrs_bindings.rs b/docsrs_bindings.rs index a2ecbc71f..61272e223 100644 --- a/docsrs_bindings.rs +++ b/docsrs_bindings.rs @@ -834,6 +834,9 @@ extern "C" { cache_slot: *mut *mut ::std::os::raw::c_void, ) -> ::std::os::raw::c_int; } +extern "C" { + pub fn zend_is_identical(op1: *mut zval, op2: *mut zval) -> bool; +} extern "C" { pub fn zend_is_true(op: *mut zval) -> ::std::os::raw::c_int; } diff --git a/src/types/zval.rs b/src/types/zval.rs index 34c8c81a1..6141043fb 100644 --- a/src/types/zval.rs +++ b/src/types/zval.rs @@ -11,8 +11,8 @@ use crate::{ convert::{FromZval, FromZvalMut, IntoZval, IntoZvalDyn}, error::{Error, Result}, ffi::{ - _zval_struct__bindgen_ty_1, _zval_struct__bindgen_ty_2, zend_is_callable, zend_resource, - zend_value, zval, zval_ptr_dtor, + _zval_struct__bindgen_ty_1, _zval_struct__bindgen_ty_2, zend_is_callable, + zend_is_identical, zend_resource, zend_value, zval, zval_ptr_dtor, }, flags::DataType, flags::ZvalTypeFlags, @@ -327,6 +327,18 @@ impl Zval { unsafe { zend_is_callable(ptr as *mut Self, 0, std::ptr::null_mut()) } } + /// Checks if the zval is identical to another one. + /// This works like `===` in php. + /// + /// # Parameters + /// + /// * `other` - The the zval to check identity against. + pub fn is_identical(&self, other: &Self) -> bool { + let self_p: *const Self = self; + let other_p: *const Self = other; + unsafe { zend_is_identical(self_p as *mut Self, other_p as *mut Self) } + } + /// Returns true if the zval contains a pointer, false otherwise. pub fn is_ptr(&self) -> bool { self.get_type() == DataType::Ptr