diff options
-rw-r--r-- | ext/ffi/ffi.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/ext/ffi/ffi.c b/ext/ffi/ffi.c index 4b1d11bb6d..83838ae6a1 100644 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@ -4361,6 +4361,35 @@ ZEND_METHOD(FFI, string) /* {{{ */ } /* }}} */ +ZEND_METHOD(FFI, isNull) /* {{{ */ +{ + zval *zv; + zend_ffi_type *type; + void *ptr = NULL; + + ZEND_FFI_VALIDATE_API_RESTRICTION(); + ZEND_PARSE_PARAMETERS_START(1, 1) + Z_PARAM_ZVAL(zv); + ZEND_PARSE_PARAMETERS_END(); + + ZVAL_DEREF(zv); + if (Z_TYPE_P(zv) == IS_OBJECT && Z_OBJCE_P(zv) == zend_ffi_cdata_ce) { + zend_ffi_cdata *cdata = (zend_ffi_cdata*)Z_OBJ_P(zv); + type = ZEND_FFI_TYPE(cdata->type); + ptr = cdata->ptr; + } else { + zend_wrong_parameter_class_error(1, "FFI\\CData", zv); + return; + } + + if (type->kind != ZEND_FFI_TYPE_POINTER){ + zend_throw_error(zend_ffi_exception_ce, "FFI\\Cdata is not a pointer"); + } + + RETURN_BOOL(*(void**)ptr == NULL); +} +/* }}} */ + ZEND_BEGIN_ARG_INFO_EX(arginfo_func_cdef, 0, 0, 0) ZEND_ARG_INFO(0, code) ZEND_ARG_INFO(0, lib) @@ -4437,6 +4466,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_func_string, 0, 0, 1) ZEND_ARG_INFO(0, size) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_func_isnull, 0, 0, 1) + ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) +ZEND_END_ARG_INFO() + static const zend_function_entry zend_ffi_functions[] = { ZEND_ME(FFI, cdef, arginfo_func_cdef, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) 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[] = { ZEND_ME(FFI, memcmp, arginfo_func_memcmp, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME(FFI, memset, arginfo_func_memset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_ME(FFI, string, arginfo_func_string, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, isNull, arginfo_func_isnull, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_FE_END }; |