Skip to content

Commit

Permalink
Add is_identical for zvals (davidcole1340#217)
Browse files Browse the repository at this point in the history
  • Loading branch information
Christian-Rades authored Jan 19, 2023
1 parent 7ed31eb commit 87ac43d
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 2 deletions.
1 change: 1 addition & 0 deletions allowed_bindings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
3 changes: 3 additions & 0 deletions docsrs_bindings.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand Down
16 changes: 14 additions & 2 deletions src/types/zval.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit 87ac43d

Please sign in to comment.