From: Dmitry Stogov Date: Tue, 28 May 2019 14:14:28 +0000 (+0300) Subject: Merge branch 'PHP-7.4' X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=51ddc59d9fa41dd26af3ced0f93e9d365d7cc30c;p=php Merge branch 'PHP-7.4' * PHP-7.4: Avoid usage of internal get/set object handlers. They are going to be removed in PHP-8. Scalar FFI values now should be accessed through special "cdata" property. --- 51ddc59d9fa41dd26af3ced0f93e9d365d7cc30c diff --cc ext/ffi/ffi.c index 7310a7c4c2,4b08c9cf2a..1452be4f14 --- a/ext/ffi/ffi.c +++ b/ext/ffi/ffi.c @@@ -882,9 -882,9 +882,9 @@@ static void *zend_ffi_create_callback(z /* }}} */ #endif - static zval* zend_ffi_cdata_get(zend_object *obj, zval *rv) /* {{{ */ -static zval *zend_ffi_cdata_get(zval *object, zval *member, int read_type, void **cache_slot, zval *rv) /* {{{ */ ++static zval *zend_ffi_cdata_get(zend_object *obj, zend_string *member, int read_type, void **cache_slot, zval *rv) /* {{{ */ { - zend_ffi_cdata *cdata = (zend_ffi_cdata*)Z_OBJ_P(object); + zend_ffi_cdata *cdata = (zend_ffi_cdata*)obj; zend_ffi_type *type = ZEND_FFI_TYPE(cdata->type); #if 0 @@@ -894,14 -894,20 +894,19 @@@ } #endif - if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING) - || UNEXPECTED(!zend_string_equals_literal(Z_STR_P(member), "cdata"))) { ++ if (UNEXPECTED(!zend_string_equals_literal(member, "cdata"))) { + zend_throw_error(zend_ffi_exception_ce, "only 'cdata' property may be read"); + return &EG(uninitialized_zval);; + } + zend_ffi_cdata_to_zval(cdata, cdata->ptr, type, BP_VAR_R, rv, 0, 0); return rv; } /* }}} */ - static void zend_ffi_cdata_set(zend_object *obj, zval *value) /* {{{ */ -static zval *zend_ffi_cdata_set(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ ++static zval *zend_ffi_cdata_set(zend_object *obj, zend_string *member, zval *value, void **cache_slot) /* {{{ */ { - zend_ffi_cdata *cdata = (zend_ffi_cdata*)Z_OBJ_P(object); + zend_ffi_cdata *cdata = (zend_ffi_cdata*)obj; zend_ffi_type *type = ZEND_FFI_TYPE(cdata->type); #if 0 @@@ -911,12 -917,88 +916,87 @@@ } #endif - if (UNEXPECTED(Z_TYPE_P(member) != IS_STRING) - || UNEXPECTED(!zend_string_equals_literal(Z_STR_P(member), "cdata"))) { ++ if (UNEXPECTED(!zend_string_equals_literal(member, "cdata"))) { + zend_throw_error(zend_ffi_exception_ce, "only 'cdata' property may be set"); + return &EG(uninitialized_zval);; + } + zend_ffi_zval_to_cdata(cdata->ptr, type, value); + + return value; } /* }}} */ -static int zend_ffi_cdata_cast_object(zval *readobj, zval *writeobj, int type) /* {{{ */ +static int zend_ffi_cdata_cast_object(zend_object *readobj, zval *writeobj, int type) /* {{{ */ { + if (type == IS_STRING) { - zend_ffi_cdata *cdata = (zend_ffi_cdata*)Z_OBJ_P(readobj); ++ zend_ffi_cdata *cdata = (zend_ffi_cdata*)readobj; + zend_ffi_type *ctype = ZEND_FFI_TYPE(cdata->type); + void *ptr = cdata->ptr; + zend_ffi_type_kind kind = ctype->kind; + + again: + switch (kind) { + case ZEND_FFI_TYPE_FLOAT: + ZVAL_DOUBLE(writeobj, *(float*)ptr); + break; + case ZEND_FFI_TYPE_DOUBLE: + ZVAL_DOUBLE(writeobj, *(double*)ptr); + break; + #ifdef HAVE_LONG_DOUBLE + case ZEND_FFI_TYPE_LONGDOUBLE: + ZVAL_DOUBLE(writeobj, *(long double*)ptr); + break; + #endif + case ZEND_FFI_TYPE_UINT8: + ZVAL_LONG(writeobj, *(uint8_t*)ptr); + break; + case ZEND_FFI_TYPE_SINT8: + ZVAL_LONG(writeobj, *(int8_t*)ptr); + break; + case ZEND_FFI_TYPE_UINT16: + ZVAL_LONG(writeobj, *(uint16_t*)ptr); + break; + case ZEND_FFI_TYPE_SINT16: + ZVAL_LONG(writeobj, *(int16_t*)ptr); + break; + case ZEND_FFI_TYPE_UINT32: + ZVAL_LONG(writeobj, *(uint32_t*)ptr); + break; + case ZEND_FFI_TYPE_SINT32: + ZVAL_LONG(writeobj, *(int32_t*)ptr); + break; + case ZEND_FFI_TYPE_UINT64: + ZVAL_LONG(writeobj, *(uint64_t*)ptr); + break; + case ZEND_FFI_TYPE_SINT64: + ZVAL_LONG(writeobj, *(int64_t*)ptr); + break; + case ZEND_FFI_TYPE_BOOL: + ZVAL_BOOL(writeobj, *(uint8_t*)ptr); + break; + case ZEND_FFI_TYPE_CHAR: + ZVAL_INTERNED_STR(writeobj, ZSTR_CHAR(*(unsigned char*)ptr)); + return SUCCESS; + case ZEND_FFI_TYPE_ENUM: + kind = ctype->enumeration.kind; + goto again; + case ZEND_FFI_TYPE_POINTER: + if (*(void**)ptr == NULL) { + ZVAL_NULL(writeobj); + break; + } else if ((ctype->attr & ZEND_FFI_ATTR_CONST) && ZEND_FFI_TYPE(ctype->pointer.type)->kind == ZEND_FFI_TYPE_CHAR) { + ZVAL_STRING(writeobj, *(char**)ptr); + return SUCCESS; + } + return FAILURE; + default: + return FAILURE; + } + convert_to_string(writeobj); + return SUCCESS; + } + return FAILURE; } /* }}} */