Add is_identical for zvals (#217)

This commit is contained in:
Christian Rades 2023-01-19 12:40:24 +01:00 committed by GitHub
parent 7ed31ebda9
commit 87ac43d05e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 18 additions and 2 deletions

View File

@ -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,

View File

@ -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;
}

View File

@ -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