File tree 5 files changed +119
-0
lines changed
5 files changed +119
-0
lines changed Original file line number Diff line number Diff line change 24
24
#include "php_scandir.h"
25
25
#include "zend_exceptions.h"
26
26
#include "zend_closures.h"
27
+ #include "zend_weakrefs.h"
27
28
#include "main/SAPI.h"
28
29
29
30
#include <ffi.h>
@@ -2189,6 +2190,10 @@ static void zend_ffi_ctype_free_obj(zend_object *object) /* {{{ */
2189
2190
zend_ffi_ctype * ctype = (zend_ffi_ctype * )object ;
2190
2191
2191
2192
zend_ffi_type_dtor (ctype -> type );
2193
+
2194
+ if (UNEXPECTED (GC_FLAGS (object ) & IS_OBJ_WEAKLY_REFERENCED )) {
2195
+ zend_weakrefs_notify (object );
2196
+ }
2192
2197
}
2193
2198
/* }}} */
2194
2199
@@ -2415,6 +2420,10 @@ static void zend_ffi_free_obj(zend_object *object) /* {{{ */
2415
2420
zend_hash_destroy (ffi -> tags );
2416
2421
efree (ffi -> tags );
2417
2422
}
2423
+
2424
+ if (UNEXPECTED (GC_FLAGS (object ) & IS_OBJ_WEAKLY_REFERENCED )) {
2425
+ zend_weakrefs_notify (object );
2426
+ }
2418
2427
}
2419
2428
/* }}} */
2420
2429
@@ -2423,6 +2432,10 @@ static void zend_ffi_cdata_free_obj(zend_object *object) /* {{{ */
2423
2432
zend_ffi_cdata * cdata = (zend_ffi_cdata * )object ;
2424
2433
2425
2434
zend_ffi_cdata_dtor (cdata );
2435
+
2436
+ if (UNEXPECTED (GC_FLAGS (object ) & IS_OBJ_WEAKLY_REFERENCED )) {
2437
+ zend_weakrefs_notify (object );
2438
+ }
2426
2439
}
2427
2440
/* }}} */
2428
2441
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ Weak reference to \FFI
3
+ --EXTENSIONS--
4
+ ffi
5
+ --INI--
6
+ ffi.enable=1
7
+ --FILE--
8
+ <?php
9
+ $ ffi = \FFI ::cdef ('' );
10
+ $ ref = \WeakReference::create ($ ffi );
11
+ var_dump ($ ref ->get () === $ ffi );
12
+ unset($ ffi );
13
+ var_dump ($ ref ->get () === null );
14
+ ?>
15
+ --EXPECTF--
16
+ bool(true)
17
+ bool(true)
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ Weak reference to \FFI\CData
3
+ --EXTENSIONS--
4
+ ffi
5
+ --INI--
6
+ ffi.enable=1
7
+ --FILE--
8
+ <?php
9
+ $ cdata_value = \FFI ::new ('int ' );
10
+ $ cdata_array = \FFI ::new ('int[1] ' );
11
+ $ cdata_free = \FFI ::new ('int[1] ' , false );
12
+ \FFI ::free ($ cdata_free );
13
+
14
+ $ ref_value = \WeakReference::create ($ cdata_value );
15
+ $ ref_array = \WeakReference::create ($ cdata_array );
16
+ $ ref_free = \WeakReference::create ($ cdata_free );
17
+
18
+ var_dump ($ ref_value ->get () === $ cdata_value );
19
+ var_dump ($ ref_array ->get () === $ cdata_array );
20
+ var_dump ($ ref_free ->get () === $ cdata_free );
21
+
22
+ unset($ cdata_value );
23
+ unset($ cdata_array );
24
+ unset($ cdata_free );
25
+
26
+ var_dump ($ ref_value ->get () === null );
27
+ var_dump ($ ref_array ->get () === null );
28
+ var_dump ($ ref_free ->get () === null );
29
+ ?>
30
+ --EXPECTF--
31
+ bool(true)
32
+ bool(true)
33
+ bool(true)
34
+ bool(true)
35
+ bool(true)
36
+ bool(true)
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ Weak reference to \FFI\CType
3
+ --EXTENSIONS--
4
+ ffi
5
+ --INI--
6
+ ffi.enable=1
7
+ --FILE--
8
+ <?php
9
+ $ ctype = \FFI ::type ('int ' );
10
+ $ ref = \WeakReference::create ($ ctype );
11
+ var_dump ($ ref ->get () === $ ctype );
12
+ unset($ ctype );
13
+ var_dump ($ ref ->get () === null );
14
+ ?>
15
+ --EXPECTF--
16
+ bool(true)
17
+ bool(true)
Original file line number Diff line number Diff line change
1
+ --TEST--
2
+ Using FFI Types for keys of a WeakMap
3
+ --EXTENSIONS--
4
+ ffi
5
+ --INI--
6
+ ffi.enable=1
7
+ --FILE--
8
+ <?php
9
+ $ map = new WeakMap ();
10
+
11
+ $ ffi = \FFI ::cdef ('' );
12
+ $ cdata_value = \FFI ::new ('int ' );
13
+ $ cdata_array = \FFI ::new ('int[1] ' );
14
+ $ cdata_free = \FFI ::new ('int[1] ' , false );
15
+ \FFI ::free ($ cdata_free );
16
+ $ ctype = \FFI ::type ('int ' );
17
+
18
+ $ map [$ ffi ] = 'ffi ' ;
19
+ $ map [$ cdata_value ] = 'cdata_value ' ;
20
+ $ map [$ cdata_array ] = 'cdata_array ' ;
21
+ $ map [$ cdata_free ] = 'cdata_free ' ;
22
+ $ map [$ ctype ] = 'ctype ' ;
23
+
24
+ var_dump (count ($ map ) === 5 );
25
+
26
+ unset($ ffi );
27
+ unset($ cdata_value );
28
+ unset($ cdata_array );
29
+ unset($ cdata_free );
30
+ unset($ ctype );
31
+
32
+ var_dump (count ($ map ) === 0 );
33
+ ?>
34
+ --EXPECTF--
35
+ bool(true)
36
+ bool(true)
You can’t perform that action at this time.
0 commit comments