Skip to content

Commit f6ff7eb

Browse files
pilifdstogov
authored andcommitted
add FFI::isNull() to check whether a FFI\CData is a null pointer
1 parent ea92b9b commit f6ff7eb

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

ext/ffi/ffi.c

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4361,6 +4361,35 @@ ZEND_METHOD(FFI, string) /* {{{ */
43614361
}
43624362
/* }}} */
43634363

4364+
ZEND_METHOD(FFI, isNull) /* {{{ */
4365+
{
4366+
zval *zv;
4367+
zend_ffi_type *type;
4368+
void *ptr = NULL;
4369+
4370+
ZEND_FFI_VALIDATE_API_RESTRICTION();
4371+
ZEND_PARSE_PARAMETERS_START(1, 1)
4372+
Z_PARAM_ZVAL(zv);
4373+
ZEND_PARSE_PARAMETERS_END();
4374+
4375+
ZVAL_DEREF(zv);
4376+
if (Z_TYPE_P(zv) == IS_OBJECT && Z_OBJCE_P(zv) == zend_ffi_cdata_ce) {
4377+
zend_ffi_cdata *cdata = (zend_ffi_cdata*)Z_OBJ_P(zv);
4378+
type = ZEND_FFI_TYPE(cdata->type);
4379+
ptr = cdata->ptr;
4380+
} else {
4381+
zend_wrong_parameter_class_error(1, "FFI\\CData", zv);
4382+
return;
4383+
}
4384+
4385+
if (type->kind != ZEND_FFI_TYPE_POINTER){
4386+
zend_throw_error(zend_ffi_exception_ce, "FFI\\Cdata is not a pointer");
4387+
}
4388+
4389+
RETURN_BOOL(*(void**)ptr == NULL);
4390+
}
4391+
/* }}} */
4392+
43644393
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_cdef, 0, 0, 0)
43654394
ZEND_ARG_INFO(0, code)
43664395
ZEND_ARG_INFO(0, lib)
@@ -4437,6 +4466,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_func_string, 0, 0, 1)
44374466
ZEND_ARG_INFO(0, size)
44384467
ZEND_END_ARG_INFO()
44394468

4469+
ZEND_BEGIN_ARG_INFO_EX(arginfo_func_isnull, 0, 0, 1)
4470+
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr)
4471+
ZEND_END_ARG_INFO()
4472+
44404473
static const zend_function_entry zend_ffi_functions[] = {
44414474
ZEND_ME(FFI, cdef, arginfo_func_cdef, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
44424475
ZEND_ME(FFI, load, arginfo_func_load, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
@@ -4454,6 +4487,7 @@ static const zend_function_entry zend_ffi_functions[] = {
44544487
ZEND_ME(FFI, memcmp, arginfo_func_memcmp, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
44554488
ZEND_ME(FFI, memset, arginfo_func_memset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
44564489
ZEND_ME(FFI, string, arginfo_func_string, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
4490+
ZEND_ME(FFI, isNull, arginfo_func_isnull, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC)
44574491
ZEND_FE_END
44584492
};
44594493

0 commit comments

Comments
 (0)