From: Dmitry Stogov Date: Tue, 10 Sep 2019 08:34:08 +0000 (+0300) Subject: Merge branch 'PHP-7.4' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0128f6eb8466cacfac5141382490bc385c9db8c0;p=php Merge branch 'PHP-7.4' * PHP-7.4: NEWS entry, test and minor cleanup for FFI::isNull() add FFI::isNull() to check whether a FFI\CData is a null pointer --- 0128f6eb8466cacfac5141382490bc385c9db8c0 diff --cc ext/ffi/ffi.c index 765b63181e,1d6f84b6b2..aae8b3ab21 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@@ -4329,23 -4361,133 +4329,53 @@@ ZEND_METHOD(FFI, string) /* {{{ * } /* }}} */ + ZEND_METHOD(FFI, isNull) /* {{{ */ + { + zval *zv; + zend_ffi_cdata *cdata; + zend_ffi_type *type; + + 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_wrong_parameter_class_error(1, "FFI\\CData", zv); + return; + } + + cdata = (zend_ffi_cdata*)Z_OBJ_P(zv); + type = ZEND_FFI_TYPE(cdata->type); + + if (type->kind != ZEND_FFI_TYPE_POINTER){ + zend_throw_error(zend_ffi_exception_ce, "FFI\\Cdata is not a pointer"); + return; + } + + RETURN_BOOL(*(void**)cdata->ptr == NULL); + } + /* }}} */ + -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_cdef, 0, 0, 0) - ZEND_ARG_INFO(0, code) - ZEND_ARG_INFO(0, lib) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_load, 0, 0, 1) - ZEND_ARG_INFO(0, filename) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_scope, 0, 0, 1) - ZEND_ARG_INFO(0, scope_name) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_new, 0, 0, 1) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, owned) - ZEND_ARG_INFO(0, persistent) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_free, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_cast, 0, 0, 2) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_type, 0, 0, 1) - ZEND_ARG_INFO(0, type) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_typeof, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_array, 0, 0, 2) - ZEND_ARG_INFO(0, type) - ZEND_ARG_INFO(0, dims) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_addr, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_sizeof, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_alignof, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memcpy, 0, 0, 3) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, dst) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, src) - ZEND_ARG_INFO(0, size) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memcmp, 0, 0, 3) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr2) - ZEND_ARG_INFO(0, size) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_memset, 0, 0, 3) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) - ZEND_ARG_INFO(0, ch) - ZEND_ARG_INFO(0, size) -ZEND_END_ARG_INFO() - -ZEND_BEGIN_ARG_INFO_EX(arginfo_func_string, 0, 0, 1) - ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr) - 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) - ZEND_ME(FFI, scope, arginfo_func_scope, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, new, arginfo_func_new, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, free, arginfo_func_free, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, cast, arginfo_func_cast, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, type, arginfo_func_type, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, typeof, arginfo_func_typeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, arrayType, arginfo_func_array, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, addr, arginfo_func_addr, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, sizeof, arginfo_func_sizeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, alignof, arginfo_func_alignof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - ZEND_ME(FFI, memcpy, arginfo_func_memcpy, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) - 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_ME(FFI, cdef, arginfo_class_FFI_cdef, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, load, arginfo_class_FFI_load, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, scope, arginfo_class_FFI_scope, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, new, arginfo_class_FFI_new, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, free, arginfo_class_FFI_free, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, cast, arginfo_class_FFI_cast, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, type, arginfo_class_FFI_type, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, typeof, arginfo_class_FFI_typeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, arrayType, arginfo_class_FFI_arrayType, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, addr, arginfo_class_FFI_addr, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, sizeof, arginfo_class_FFI_sizeof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, alignof, arginfo_class_FFI_alignof, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, memcpy, arginfo_class_FFI_memcpy, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, memcmp, arginfo_class_FFI_memcmp, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, memset, arginfo_class_FFI_memset, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) + ZEND_ME(FFI, string, arginfo_class_FFI_string, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ++ ZEND_ME(FFI, isNull, arginfo_class_FFI_isNull, ZEND_ACC_PUBLIC|ZEND_ACC_STATIC) ZEND_FE_END }; diff --cc ext/ffi/ffi.stub.php index c315c55a1c,0000000000..812217f990 mode 100644,000000..100644 --- a/ext/ffi/ffi.stub.php +++ b/ext/ffi/ffi.stub.php @@@ -1,91 -1,0 +1,96 @@@ + + --INI-- + ffi.enable=1 + --FILE-- + getMessage()."\n"; + } + try { + var_dump(FFI::isNull(FFI::new("int[0]"))); + } catch (Throwable $e) { + echo get_class($e) . ": " . $e->getMessage()."\n"; + } + ?> + --EXPECTF-- + bool(true) + bool(false) - -Warning: FFI::isNull() expects parameter 1 to be FFI\CData, null given in %s045.php on line %d -NULL ++TypeError: FFI::isNull() expects parameter 1 to be FFI\CData, null given + FFI\Exception: FFI\Cdata is not a pointer