mirror of https://github.com/django/django.git
Fixed #21662 -- Kept parent reference in prepared geometry
Thanks Robert Scott for the report.
This commit is contained in:
parent
1716b7ce5a
commit
542198c1d0
|
@ -12,6 +12,10 @@ class PreparedGeometry(GEOSBase):
|
||||||
ptr_type = capi.PREPGEOM_PTR
|
ptr_type = capi.PREPGEOM_PTR
|
||||||
|
|
||||||
def __init__(self, geom):
|
def __init__(self, geom):
|
||||||
|
# Keeping a reference to the original geometry object to prevent it
|
||||||
|
# from being garbage collected which could then crash the prepared one
|
||||||
|
# See #21662
|
||||||
|
self._base_geom = geom
|
||||||
if not isinstance(geom, GEOSGeometry):
|
if not isinstance(geom, GEOSGeometry):
|
||||||
raise TypeError
|
raise TypeError
|
||||||
self.ptr = capi.geos_prepare(geom.ptr)
|
self.ptr = capi.geos_prepare(geom.ptr)
|
||||||
|
|
|
@ -1046,6 +1046,10 @@ class GEOSTest(unittest.TestCase, TestDataMixin):
|
||||||
self.assertEqual(mpoly.intersects(pnt), prep.intersects(pnt))
|
self.assertEqual(mpoly.intersects(pnt), prep.intersects(pnt))
|
||||||
self.assertEqual(c, prep.covers(pnt))
|
self.assertEqual(c, prep.covers(pnt))
|
||||||
|
|
||||||
|
# Original geometry deletion should not crash the prepared one (#21662)
|
||||||
|
del mpoly
|
||||||
|
self.assertTrue(prep.covers(Point(5, 5)))
|
||||||
|
|
||||||
def test_line_merge(self):
|
def test_line_merge(self):
|
||||||
"Testing line merge support"
|
"Testing line merge support"
|
||||||
ref_geoms = (fromstr('LINESTRING(1 1, 1 1, 3 3)'),
|
ref_geoms = (fromstr('LINESTRING(1 1, 1 1, 3 3)'),
|
||||||
|
|
Loading…
Reference in New Issue