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
#include "ffi_arginfo.h"
29
30
@@ -2143,6 +2144,10 @@ static void zend_ffi_ctype_free_obj(zend_object *object) /* {{{ */
2143
2144
zend_ffi_ctype * ctype = (zend_ffi_ctype * )object ;
2144
2145
2145
2146
zend_ffi_type_dtor (ctype -> type );
2147
+
2148
+ if (UNEXPECTED (GC_FLAGS (object ) & IS_OBJ_WEAKLY_REFERENCED )) {
2149
+ zend_weakrefs_notify (object );
2150
+ }
2146
2151
}
2147
2152
/* }}} */
2148
2153
@@ -2369,6 +2374,10 @@ static void zend_ffi_free_obj(zend_object *object) /* {{{ */
2369
2374
zend_hash_destroy (ffi -> tags );
2370
2375
efree (ffi -> tags );
2371
2376
}
2377
+
2378
+ if (UNEXPECTED (GC_FLAGS (object ) & IS_OBJ_WEAKLY_REFERENCED )) {
2379
+ zend_weakrefs_notify (object );
2380
+ }
2372
2381
}
2373
2382
/* }}} */
2374
2383
@@ -2377,6 +2386,10 @@ static void zend_ffi_cdata_free_obj(zend_object *object) /* {{{ */
2377
2386
zend_ffi_cdata * cdata = (zend_ffi_cdata * )object ;
2378
2387
2379
2388
zend_ffi_cdata_dtor (cdata );
2389
+
2390
+ if (UNEXPECTED (GC_FLAGS (object ) & IS_OBJ_WEAKLY_REFERENCED )) {
2391
+ zend_weakrefs_notify (object );
2392
+ }
2380
2393
}
2381
2394
/* }}} */
2382
2395
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