@@ -718,11 +718,22 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
718718#ifdef HAVE_FFI
719719 if (ce1 == zend_ffi_cdata_ce ) {
720720 zend_ffi_cdata * cdata = (zend_ffi_cdata * )Z_OBJ_P (zv );
721- if (! ZEND_FFI_TYPE_IS_OWNED ( cdata -> type )) {
722- zend_ffi_type * ffi_type = ZEND_FFI_TYPE ( cdata -> type );
721+ zend_ffi_type * ffi_type = cdata -> type ;
722+ if (! ZEND_FFI_TYPE_IS_OWNED ( ffi_type )) {
723723 if (ffi_type -> attr & ZEND_FFI_ATTR_PERSISTENT ) {
724724 op1_ffi_type = ffi_type ;
725725 }
726+ } else {
727+ ffi_type = ZEND_FFI_TYPE (ffi_type );
728+ if (ffi_type -> kind == ZEND_FFI_TYPE_POINTER ) {
729+ ffi_type = ffi_type -> pointer .type ;
730+ if (!ZEND_FFI_TYPE_IS_OWNED (ffi_type )) {
731+ if (ffi_type -> attr & ZEND_FFI_ATTR_PERSISTENT ) {
732+ /* OWNED flag means POINTER TO */
733+ op1_ffi_type = ZEND_FFI_TYPE_MAKE_OWNED (ffi_type );
734+ }
735+ }
736+ }
726737 }
727738 } else if (ce1 == zend_ffi_ce ) {
728739 zend_ffi * ffi = (zend_ffi * )Z_OBJ_P (zv );
@@ -783,11 +794,22 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
783794#ifdef HAVE_FFI
784795 if (ce2 == zend_ffi_cdata_ce ) {
785796 zend_ffi_cdata * cdata = (zend_ffi_cdata * )Z_OBJ_P (zv );
786- if (! ZEND_FFI_TYPE_IS_OWNED ( cdata -> type )) {
787- zend_ffi_type * ffi_type = ZEND_FFI_TYPE ( cdata -> type );
797+ zend_ffi_type * ffi_type = cdata -> type ;
798+ if (! ZEND_FFI_TYPE_IS_OWNED ( ffi_type )) {
788799 if (ffi_type -> attr & ZEND_FFI_ATTR_PERSISTENT ) {
789800 op2_ffi_type = ffi_type ;
790801 }
802+ } else {
803+ ffi_type = ZEND_FFI_TYPE (ffi_type );
804+ if (ffi_type -> kind == ZEND_FFI_TYPE_POINTER ) {
805+ ffi_type = ffi_type -> pointer .type ;
806+ if (!ZEND_FFI_TYPE_IS_OWNED (ffi_type )) {
807+ if (ffi_type -> attr & ZEND_FFI_ATTR_PERSISTENT ) {
808+ /* OWNED flag means POINTER TO */
809+ op2_ffi_type = ZEND_FFI_TYPE_MAKE_OWNED (ffi_type );
810+ }
811+ }
812+ }
791813 }
792814 }
793815#endif
@@ -822,11 +844,22 @@ zend_jit_trace_stop ZEND_FASTCALL zend_jit_trace_execute(zend_execute_data *ex,
822844#ifdef HAVE_FFI
823845 if (ce3 == zend_ffi_cdata_ce ) {
824846 zend_ffi_cdata * cdata = (zend_ffi_cdata * )Z_OBJ_P (zv );
825- if (! ZEND_FFI_TYPE_IS_OWNED ( cdata -> type )) {
826- zend_ffi_type * ffi_type = ZEND_FFI_TYPE ( cdata -> type );
847+ zend_ffi_type * ffi_type = cdata -> type ;
848+ if (! ZEND_FFI_TYPE_IS_OWNED ( ffi_type )) {
827849 if (ffi_type -> attr & ZEND_FFI_ATTR_PERSISTENT ) {
828850 op3_ffi_type = ffi_type ;
829851 }
852+ } else {
853+ ffi_type = ZEND_FFI_TYPE (ffi_type );
854+ if (ffi_type -> kind == ZEND_FFI_TYPE_POINTER ) {
855+ ffi_type = ffi_type -> pointer .type ;
856+ if (!ZEND_FFI_TYPE_IS_OWNED (ffi_type )) {
857+ if (ffi_type -> attr & ZEND_FFI_ATTR_PERSISTENT ) {
858+ /* OWNED flag means POINTER TO */
859+ op3_ffi_type = ZEND_FFI_TYPE_MAKE_OWNED (ffi_type );
860+ }
861+ }
862+ }
830863 }
831864 }
832865#endif
0 commit comments