Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
PyPy
cffi
Commits
e12558a3ce6b
Commit
c57ec9ce
authored
Jul 04, 2015
by
Armin Rigo
Browse files
Use the logic in cgc.c to implement ffi.gc() also for the pure Python
in-line version of FFI
parent
2763b22591f2
Changes
4
Hide whitespace changes
Inline
Side-by-side
c/_cffi_backend.c
View file @
e12558a3
...
...
@@ -5512,6 +5512,9 @@ static PyObject *b__get_types(PyObject *self, PyObject *noarg)
(
PyObject
*
)
&
CTypeDescr_Type
);
}
/* forward: implemented in ffi_obj.c */
static
PyObject
*
b_gcp
(
PyObject
*
self
,
PyObject
*
args
);
/************************************************************/
static
char
_testfunc0
(
char
a
,
char
b
)
...
...
@@ -5817,6 +5820,7 @@ static PyMethodDef FFIBackendMethods[] = {
{
"newp_handle"
,
b_newp_handle
,
METH_VARARGS
},
{
"from_handle"
,
b_from_handle
,
METH_O
},
{
"from_buffer"
,
b_from_buffer
,
METH_VARARGS
},
{
"gcp"
,
b_gcp
,
METH_VARARGS
},
#ifdef MS_WIN32
{
"getwinerror"
,
(
PyCFunction
)
b_getwinerror
,
METH_VARARGS
|
METH_KEYWORDS
},
#endif
...
...
c/ffi_obj.c
View file @
e12558a3
...
...
@@ -680,6 +680,19 @@ static PyObject *ffi_gc(FFIObject *self, PyObject *args, PyObject *kwds)
return
gc_weakrefs_build
(
self
,
cd
,
destructor
);
}
static
PyObject
*
b_gcp
(
PyObject
*
self
,
PyObject
*
args
)
{
/* for in-line mode */
static
FFIObject
*
ffi1
=
NULL
;
if
(
ffi1
==
NULL
)
{
ffi1
=
ffi_internal_new
(
&
FFI_Type
,
NULL
);
if
(
ffi1
==
NULL
)
return
NULL
;
}
return
ffi_gc
(
ffi1
,
args
,
NULL
);
}
PyDoc_STRVAR
(
ffi_callback_doc
,
"Return a callback object or a decorator making such a callback object.
\n
"
"'cdecl' must name a C function pointer type. The callback invokes the
\n
"
...
...
cffi/api.py
View file @
e12558a3
...
...
@@ -327,6 +327,13 @@ class FFI(object):
data. Later, when this new cdata object is garbage-collected,
'destructor(old_cdata_object)' will be called.
"""
try
:
gcp
=
self
.
_backend
.
gcp
except
AttributeError
:
pass
else
:
return
gcp
(
cdata
,
destructor
)
#
with
self
.
_lock
:
try
:
gc_weakrefs
=
self
.
gc_weakrefs
...
...
testing/cffi0/backend_tests.py
View file @
e12558a3
...
...
@@ -1503,16 +1503,19 @@ class BackendTests:
def
test_gc_finite_list
(
self
):
ffi
=
FFI
(
backend
=
self
.
Backend
())
public
=
not
hasattr
(
ffi
.
_backend
,
'gcp'
)
p
=
ffi
.
new
(
"int *"
,
123
)
keepalive
=
[]
for
i
in
range
(
10
):
keepalive
.
append
(
ffi
.
gc
(
p
,
lambda
p
:
None
))
assert
len
(
ffi
.
gc_weakrefs
.
data
)
==
i
+
1
#should be a private attr
if
public
:
assert
len
(
ffi
.
gc_weakrefs
.
data
)
==
i
+
1
del
keepalive
[:]
import
gc
;
gc
.
collect
();
gc
.
collect
()
for
i
in
range
(
10
):
keepalive
.
append
(
ffi
.
gc
(
p
,
lambda
p
:
None
))
assert
len
(
ffi
.
gc_weakrefs
.
data
)
==
10
if
public
:
assert
len
(
ffi
.
gc_weakrefs
.
data
)
==
10
def
test_CData_CType
(
self
):
ffi
=
FFI
(
backend
=
self
.
Backend
())
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment