Browse Source
bpo-43901: Fix refleaks in test_module (GH-25754)
pull/25759/head
Pablo Galindo
5 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with
13 additions and
5 deletions
-
Lib/test/test_module.py
-
Objects/moduleobject.c
|
|
|
@ -2,6 +2,7 @@ |
|
|
|
import unittest |
|
|
|
import weakref |
|
|
|
from test.support import gc_collect |
|
|
|
from test.support import import_helper |
|
|
|
from test.support.script_helper import assert_python_ok |
|
|
|
|
|
|
|
import sys |
|
|
|
@ -334,7 +335,7 @@ a = A(destroyed)""" |
|
|
|
del foo.__annotations__ |
|
|
|
|
|
|
|
def test_annotations_are_created_correctly(self): |
|
|
|
from test import ann_module4 |
|
|
|
ann_module4 = import_helper.import_fresh_module('test.ann_module4') |
|
|
|
self.assertTrue("__annotations__" in ann_module4.__dict__) |
|
|
|
del ann_module4.__annotations__ |
|
|
|
self.assertFalse("__annotations__" in ann_module4.__dict__) |
|
|
|
|
|
|
|
@ -845,6 +845,7 @@ module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored)) |
|
|
|
|
|
|
|
if ((dict == NULL) || !PyDict_Check(dict)) { |
|
|
|
PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary"); |
|
|
|
Py_XDECREF(dict); |
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
@ -876,25 +877,31 @@ module_get_annotations(PyModuleObject *m, void *Py_UNUSED(ignored)) |
|
|
|
static int |
|
|
|
module_set_annotations(PyModuleObject *m, PyObject *value, void *Py_UNUSED(ignored)) |
|
|
|
{ |
|
|
|
int ret = -1; |
|
|
|
PyObject *dict = _PyObject_GetAttrId((PyObject *)m, &PyId___dict__); |
|
|
|
|
|
|
|
if ((dict == NULL) || !PyDict_Check(dict)) { |
|
|
|
PyErr_Format(PyExc_TypeError, "<module>.__dict__ is not a dictionary"); |
|
|
|
return -1; |
|
|
|
goto exit; |
|
|
|
} |
|
|
|
|
|
|
|
if (value != NULL) { |
|
|
|
/* set */ |
|
|
|
return _PyDict_SetItemId(dict, &PyId___annotations__, value); |
|
|
|
ret = _PyDict_SetItemId(dict, &PyId___annotations__, value); |
|
|
|
goto exit; |
|
|
|
} |
|
|
|
|
|
|
|
/* delete */ |
|
|
|
if (!_PyDict_ContainsId(dict, &PyId___annotations__)) { |
|
|
|
PyErr_Format(PyExc_AttributeError, "__annotations__"); |
|
|
|
return -1; |
|
|
|
goto exit; |
|
|
|
} |
|
|
|
|
|
|
|
return _PyDict_DelItemId(dict, &PyId___annotations__); |
|
|
|
ret = _PyDict_DelItemId(dict, &PyId___annotations__); |
|
|
|
|
|
|
|
exit: |
|
|
|
Py_XDECREF(dict); |
|
|
|
return ret; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|