diff options
| author | Tavmjong Bah <tavmjong@free.fr> | 2019-10-18 12:54:47 +0000 |
|---|---|---|
| committer | Tavmjong Bah <tavmjong@free.fr> | 2019-10-18 12:54:47 +0000 |
| commit | ca8f8f8e647393e937e4c8f7ff5a029d30fbbd18 (patch) | |
| tree | 252dba87bab464165633210f892fd4c8a9a578c9 /src | |
| parent | fix heap-use-after-free (diff) | |
| download | inkscape-ca8f8f8e647393e937e4c8f7ff5a029d30fbbd18.tar.gz inkscape-ca8f8f8e647393e937e4c8f7ff5a029d30fbbd18.zip | |
Make href and unhref member functions of SPObject.
Diffstat (limited to 'src')
| -rw-r--r-- | src/object/sp-object.cpp | 32 | ||||
| -rw-r--r-- | src/object/sp-object.h | 46 | ||||
| -rw-r--r-- | src/object/sp-shape.cpp | 12 | ||||
| -rw-r--r-- | src/object/uri-references.cpp | 4 | ||||
| -rw-r--r-- | src/object/uri-references.h | 2 |
5 files changed, 43 insertions, 53 deletions
diff --git a/src/object/sp-object.cpp b/src/object/sp-object.cpp index dabf5219a..e82329d1b 100644 --- a/src/object/sp-object.cpp +++ b/src/object/sp-object.cpp @@ -242,8 +242,9 @@ SPObject *sp_object_ref(SPObject *object, SPObject *owner) g_return_val_if_fail(!owner || SP_IS_OBJECT(owner), NULL); Inkscape::Debug::EventTracker<RefEvent> tracker(object); - //g_object_ref(G_OBJECT(object)); + object->refCount++; + return object; } @@ -254,7 +255,7 @@ SPObject *sp_object_unref(SPObject *object, SPObject *owner) g_return_val_if_fail(!owner || SP_IS_OBJECT(owner), NULL); Inkscape::Debug::EventTracker<UnrefEvent> tracker(object); - //g_object_unref(G_OBJECT(object)); + object->refCount--; if (object->refCount <= 0) { @@ -264,33 +265,24 @@ SPObject *sp_object_unref(SPObject *object, SPObject *owner) return nullptr; } -SPObject *sp_object_href(SPObject *object, SPObject* owner) +void SPObject::hrefObject(SPObject* owner) { - g_return_val_if_fail(object != nullptr, NULL); - g_return_val_if_fail(SP_IS_OBJECT(object), NULL); - - object->hrefcount++; - object->_updateTotalHRefCount(1); + hrefcount++; + _updateTotalHRefCount(1); if(owner) - object->hrefList.push_front(owner); - - return object; + hrefList.push_front(owner); } -SPObject *sp_object_hunref(SPObject *object, SPObject* owner) +void SPObject::unhrefObject(SPObject* owner) { - g_return_val_if_fail(object != nullptr, NULL); - g_return_val_if_fail(SP_IS_OBJECT(object), NULL); - g_return_val_if_fail(object->hrefcount > 0, NULL); + g_return_if_fail(hrefcount > 0); - object->hrefcount--; - object->_updateTotalHRefCount(-1); + hrefcount--; + _updateTotalHRefCount(-1); if(owner) - object->hrefList.remove(owner); - - return nullptr; + hrefList.remove(owner); } void SPObject::_updateTotalHRefCount(int increment) { diff --git a/src/object/sp-object.h b/src/object/sp-object.h index 190f24253..77e5947ad 100644 --- a/src/object/sp-object.h +++ b/src/object/sp-object.h @@ -154,31 +154,6 @@ SPObject *sp_object_ref(SPObject *object, SPObject *owner=nullptr); SPObject *sp_object_unref(SPObject *object, SPObject *owner=nullptr); /** - * Increase weak refcount. - * - * Hrefcount is used for weak references, for example, to - * determine whether any graphical element references a certain gradient - * node. - * @param owner Ignored. - * @return object, NULL is error - * \pre object points to real object - * @todo need to move this to be a member of SPObject. - */ -SPObject *sp_object_href(SPObject *object, SPObject* owner); - -/** - * Decrease weak refcount. - * - * Hrefcount is used for weak references, for example, to determine whether - * any graphical element references a certain gradient node. - * @param owner Ignored. - * @return always NULL - * \pre object points to real object and hrefcount>0 - * @todo need to move this to be a member of SPObject. - */ -SPObject *sp_object_hunref(SPObject *object, SPObject* owner); - -/** * SPObject is an abstract base class of all of the document nodes at the * SVG document level. Each SPObject subclass implements a certain SVG * element node type, or is an abstract base class for different node @@ -447,6 +422,27 @@ public: } /** + * Increase weak refcount. + * + * Hrefcount is used for weak references, for example, to + * determine whether any graphical element references a certain gradient + * node. + * It keeps a list of "owners". + * @param owner Used to track who uses this object. + */ + void hrefObject(SPObject* owner = nullptr); + + /** + * Decrease weak refcount. + * + * Hrefcount is used for weak references, for example, to determine whether + * any graphical element references a certain gradient node. + * @param owner Used to track who uses this object. + * \pre hrefcount>0 + */ + void unhrefObject(SPObject* owner = nullptr); + + /** * Check if object is referenced by any other object. */ bool isReferenced() { return ( _total_hrefcount > 0 ); } diff --git a/src/object/sp-shape.cpp b/src/object/sp-shape.cpp index 30e841dc0..c186b176c 100644 --- a/src/object/sp-shape.cpp +++ b/src/object/sp-shape.cpp @@ -92,7 +92,8 @@ void SPShape::release() { this->_release_connect[i].disconnect(); this->_modified_connect[i].disconnect(); - _marker[i] = static_cast<SPMarker *>(sp_object_hunref(_marker[i], this)); + _marker[i]->unhrefObject(this); + _marker[i] = nullptr; } } @@ -1002,7 +1003,8 @@ sp_shape_marker_release (SPObject *marker, SPShape *shape) /* Detach marker */ shape->_release_connect[i].disconnect(); shape->_modified_connect[i].disconnect(); - shape->_marker[i] = static_cast<SPMarker *>(sp_object_hunref(shape->_marker[i], item)); + shape->_marker[i]->unhrefObject(item); + shape->_marker[i] = nullptr; } } } @@ -1051,10 +1053,12 @@ sp_shape_set_marker (SPObject *object, unsigned int key, const gchar *value) } /* Unref marker */ - shape->_marker[key] = static_cast<SPMarker *>(sp_object_hunref(shape->_marker[key], object)); + shape->_marker[key]->unhrefObject(object); + shape->_marker[key] = nullptr; } if (marker) { - shape->_marker[key] = static_cast<SPMarker *>(sp_object_href(marker, object)); + shape->_marker[key] = marker; + shape->_marker[key]->hrefObject(object); shape->_release_connect[key] = marker->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_shape_marker_release), shape)); shape->_modified_connect[key] = marker->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_shape_marker_modified), shape)); } diff --git a/src/object/uri-references.cpp b/src/object/uri-references.cpp index d3550d940..35c1d7e17 100644 --- a/src/object/uri-references.cpp +++ b/src/object/uri-references.cpp @@ -214,13 +214,13 @@ void URIReference::_setObject(SPObject *obj) _release_connection.disconnect(); if (_obj) { - sp_object_href(_obj, _owner); + _obj->hrefObject(_owner); _release_connection = _obj->connectRelease(sigc::mem_fun(*this, &URIReference::_release)); } _changed_signal.emit(old_obj, _obj); if (old_obj) { /* release the old object _after_ the signal emission */ - sp_object_hunref(old_obj, _owner); + old_obj->unhrefObject(_owner); } } diff --git a/src/object/uri-references.h b/src/object/uri-references.h index 730f2534a..fe12ddc50 100644 --- a/src/object/uri-references.h +++ b/src/object/uri-references.h @@ -36,8 +36,6 @@ class URI; * automatically. * * @see SPObject - * @see sp_object_href - * @see sp_object_hunref */ class URIReference : public sigc::trackable { public: |
