]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-7.4'
authorDmitry Stogov <dmitry@zend.com>
Tue, 10 Sep 2019 08:34:08 +0000 (11:34 +0300)
committerDmitry Stogov <dmitry@zend.com>
Tue, 10 Sep 2019 08:34:08 +0000 (11:34 +0300)
* 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

1  2 
ext/ffi/ffi.c
ext/ffi/ffi.stub.php
ext/ffi/ffi_arginfo.h
ext/ffi/tests/045.phpt

diff --cc ext/ffi/ffi.c
index 765b63181e19c5de4eda9a418b10c4c8c66954b3,1d6f84b6b2234c60fac5582d2dcf6fa7ab401676..aae8b3ab2168202b1dff3bc48c6d9d9e7f178715
@@@ -4329,23 -4361,133 +4329,53 @@@ ZEND_METHOD(FFI, string) /* {{{ *
  }
  /* }}} */
  
 -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()
 -
+ 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);
+ }
+ /* }}} */
  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
  };
  
index c315c55a1cb6e046601ef84b3c5eee04cee7df66,0000000000000000000000000000000000000000..812217f99010d6ebf9d74a58697125b839fd4eb5
mode 100644,000000..100644
--- /dev/null
@@@ -1,91 -1,0 +1,96 @@@
 +<?php
 +
 +class FFI
 +{
 +    /** @return ?FFI */
 +    static function cdef(string $code = UNKNOWN, string $lib = UNKNOWN) {}
 +
 +    /** @return ?FFI */
 +    static function load(string $filename) {}
 +
 +    /** @return ?FFI */
 +    static function scope(string $scope_name) {}
 +
 +    /**
 +     * @param FFI\CType|string $type
 +     * @return ?FFI\CData
 +     */
 +    static function new($type, bool $owned = true, bool $persistent = false) {}
 +
 +    /** 
 +     * @prefer-ref $ptr
 +     * @return void
 +     */
 +    static function free(FFI\CData $ptr) {}
 +
 +    /** 
 +     * @param FFI\CType|string $type
 +     * @prefer-ref $ptr
 +     * @return ?FFI\CData
 +     */
 +    static function cast($type, $ptr) {}
 +
 +    /** @return ?FFI\CType */
 +    static function type(string $type) {}
 +
 +    /**
 +     * @prefer-ref $ptr
 +     * @return FFI\CType
 +     */
 +    static function typeof(FFI\CData $ptr) {}
 +
 +    /** @return ?FFI\CType */
 +    static function arrayType(FFI\CType $type, array $dims) {}
 +
 +    /**
 +     * @prefer-ref $ptr
 +     * @return FFI\CData
 +     */
 +    static function addr(FFI\CData $ptr) {}
 +
 +    /**
 +     * @prefer-ref $ptr
 +     * @return ?int
 +     */
 +    static function sizeof(object $ptr) {}
 +
 +    /**
 +     * @prefer-ref $ptr
 +     * @return ?int
 +     */
 +    static function alignof(object $ptr) {}
 +
 +    /**
 +     * @prefer-ref $dst
 +     * @prefer-ref $src
 +     * @param string|FFI\CData $dst
 +     * @return void
 +     */
 +    static function memcpy(FFI\CData $dst, $src, int $size) {}
 +
 +    /**
 +     * @prefer-ref $ptr1
 +     * @param string|FFI\CData $ptr1
 +     * @prefer-ref $ptr2
 +     * @param string|FFI\CData $ptr2
 +     * @return ?int
 +     */
 +    static function memcmp($ptr1, $ptr2, int $size) {}
 +
 +    /**
 +     * @prefer-ref $ptr
 +     * @return void
 +     */
 +    static function memset(FFI\CData $ptr, int $ch, int $size) {}
 +
 +    /**
 +     * @prefer-ref $ptr
 +     * @return ?string
 +     */
 +    static function string(FFI\CData $ptr, int $size = UNKNOWN) {}
++
++    /**
++     * @prefer-ref $ptr
++     */
++    static function isNull(FFI\CData $ptr) {}
 +}
index 0dfcd858aedd10e3f41dd3a2d61301105554fb74,0000000000000000000000000000000000000000..48fc90c2cd7a8f196a9ee3619600ddacca4d9eed
mode 100644,000000..100644
--- /dev/null
@@@ -1,71 -1,0 +1,73 @@@
 +/* This is a generated file, edit the .stub.php file instead. */
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_cdef, 0, 0, 0)
 +      ZEND_ARG_TYPE_INFO(0, code, IS_STRING, 0)
 +      ZEND_ARG_TYPE_INFO(0, lib, IS_STRING, 0)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_load, 0, 0, 1)
 +      ZEND_ARG_TYPE_INFO(0, filename, IS_STRING, 0)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_scope, 0, 0, 1)
 +      ZEND_ARG_TYPE_INFO(0, scope_name, IS_STRING, 0)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_new, 0, 0, 1)
 +      ZEND_ARG_INFO(0, type)
 +      ZEND_ARG_TYPE_INFO(0, owned, _IS_BOOL, 0)
 +      ZEND_ARG_TYPE_INFO(0, persistent, _IS_BOOL, 0)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_free, 0, 0, 1)
 +      ZEND_ARG_OBJ_INFO(ZEND_SEND_PREFER_REF, ptr, FFI\\CData, 0)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_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_class_FFI_type, 0, 0, 1)
 +      ZEND_ARG_TYPE_INFO(0, type, IS_STRING, 0)
 +ZEND_END_ARG_INFO()
 +
 +#define arginfo_class_FFI_typeof arginfo_class_FFI_free
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_arrayType, 0, 0, 2)
 +      ZEND_ARG_OBJ_INFO(0, type, FFI\\CType, 0)
 +      ZEND_ARG_TYPE_INFO(0, dims, IS_ARRAY, 0)
 +ZEND_END_ARG_INFO()
 +
 +#define arginfo_class_FFI_addr arginfo_class_FFI_free
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_sizeof, 0, 0, 1)
 +      ZEND_ARG_TYPE_INFO(ZEND_SEND_PREFER_REF, ptr, IS_OBJECT, 0)
 +ZEND_END_ARG_INFO()
 +
 +#define arginfo_class_FFI_alignof arginfo_class_FFI_sizeof
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memcpy, 0, 0, 3)
 +      ZEND_ARG_OBJ_INFO(ZEND_SEND_PREFER_REF, dst, FFI\\CData, 0)
 +      ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, src)
 +      ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memcmp, 0, 0, 3)
 +      ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr1)
 +      ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, ptr2)
 +      ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_memset, 0, 0, 3)
 +      ZEND_ARG_OBJ_INFO(ZEND_SEND_PREFER_REF, ptr, FFI\\CData, 0)
 +      ZEND_ARG_TYPE_INFO(0, ch, IS_LONG, 0)
 +      ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
 +ZEND_END_ARG_INFO()
 +
 +ZEND_BEGIN_ARG_INFO_EX(arginfo_class_FFI_string, 0, 0, 1)
 +      ZEND_ARG_OBJ_INFO(ZEND_SEND_PREFER_REF, ptr, FFI\\CData, 0)
 +      ZEND_ARG_TYPE_INFO(0, size, IS_LONG, 0)
 +ZEND_END_ARG_INFO()
++
++#define arginfo_class_FFI_isNull arginfo_class_FFI_free
index 0000000000000000000000000000000000000000,7118df9eb7bb09ca49c4ddc01fe3bda2ce1e171c..8d4558e0d3a9b1857140c097efaa863f98ec6583
mode 000000,100644..100644
--- /dev/null
@@@ -1,0 -1,29 +1,27 @@@
 -
 -Warning: FFI::isNull() expects parameter 1 to be FFI\CData, null given in %s045.php on line %d
 -NULL
+ --TEST--
+ FFI 045: FFI::isNull()
+ --SKIPIF--
+ <?php require_once('skipif.inc'); ?>
+ --INI--
+ ffi.enable=1
+ --FILE--
+ <?php
+ var_dump(FFI::isNull(FFI::new("int*")));
+ $i = FFI::new("int");
+ var_dump(FFI::isNull(FFI::addr($i)));
+ try {
+       var_dump(FFI::isNull(null));
+ } catch (Throwable $e) {
+       echo get_class($e) . ": " . $e->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)
++TypeError: FFI::isNull() expects parameter 1 to be FFI\CData, null given
+ FFI\Exception: FFI\Cdata is not a pointer