?? ??? ????, PHP 7.4.0RC2
- FFI:
+ . Added missing FFI::isNull(). (Philip Hofstetter)
. Fixed bug #78488 (OOB in ZEND_FUNCTION(ffi_trampoline)). (Dmitry)
- Opcache:
ZEND_METHOD(FFI, isNull) /* {{{ */
{
zval *zv;
+ zend_ffi_cdata *cdata;
zend_ffi_type *type;
- void *ptr = NULL;
ZEND_FFI_VALIDATE_API_RESTRICTION();
ZEND_PARSE_PARAMETERS_START(1, 1)
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 {
+ 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**)ptr == NULL);
+ RETURN_BOOL(*(void**)cdata->ptr == NULL);
}
/* }}} */
--- /dev/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)
+
+Warning: FFI::isNull() expects parameter 1 to be FFI\CData, null given in %s045.php on line %d
+NULL
+FFI\Exception: FFI\Cdata is not a pointer