From 99abecec282f0f727a1fb635a1dc09264552796c Mon Sep 17 00:00:00 2001 From: Christian Rades Date: Wed, 18 Jan 2023 13:57:18 +0100 Subject: [PATCH] Add is_identical for zvals --- allowed_bindings.rs | 1 + src/types/zval.rs | 16 ++++++++++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) 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/src/types/zval.rs b/src/types/zval.rs index 34c8c81a1..2809a03a9 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