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

1  2 
ext/ffi/ffi.c

diff --cc ext/ffi/ffi.c
index 7310a7c4c2f51bc8d59183203dfbc9ec1de97b3e,4b08c9cf2aa1dc16f9e0b561648e48ad4bb4788a..1452be4f1442c88048064b716615c2c69e9c82ec
@@@ -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
        }
  #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
        }
  #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) /* {{{ */
  {
 -              zend_ffi_cdata *cdata = (zend_ffi_cdata*)Z_OBJ_P(readobj);
+       if (type == IS_STRING) {
++              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;
  }
  /* }}} */