From 35984790e5706de0a914dbceec38680d15340253 Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Sun, 9 Jun 2013 02:42:33 -0300 Subject: [PATCH] Added a way for love's reference-counted objects to be released more safely in some situations (e.g. setters) --- src/common/Object.h | 27 +++++++++++++++++++ src/modules/graphics/opengl/Graphics.cpp | 3 +-- .../graphics/opengl/ParticleSystem.cpp | 3 +-- src/modules/graphics/opengl/SpriteBatch.cpp | 3 ++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/common/Object.h b/src/common/Object.h index e062fb478..99e64919e 100644 --- a/src/common/Object.h +++ b/src/common/Object.h @@ -65,6 +65,33 @@ public: **/ virtual void release(); + /** + * Meant to be used as a temporary object. Facilitates safer and cleaner + * code to release objects by doing so when the AutoRelease object is + * destroyed (e.g. goes out of scope.) + **/ + class AutoRelease + { + public: + + AutoRelease(Object *obj) + : object(obj) + { + } + + ~AutoRelease() + { + if (object) + object->release(); + } + + private: + + AutoRelease() {} + Object *object; + + }; // AutoRelease + private: // The reference count. diff --git a/src/modules/graphics/opengl/Graphics.cpp b/src/modules/graphics/opengl/Graphics.cpp index 52c91d9ce..3dc593299 100644 --- a/src/modules/graphics/opengl/Graphics.cpp +++ b/src/modules/graphics/opengl/Graphics.cpp @@ -543,8 +543,7 @@ Color Graphics::getBackgroundColor() const void Graphics::setFont(Font *font) { - if (currentFont != 0) - currentFont->release(); + Object::AutoRelease fontrelease(currentFont); currentFont = font; diff --git a/src/modules/graphics/opengl/ParticleSystem.cpp b/src/modules/graphics/opengl/ParticleSystem.cpp index 6fbbb546f..0a8471569 100644 --- a/src/modules/graphics/opengl/ParticleSystem.cpp +++ b/src/modules/graphics/opengl/ParticleSystem.cpp @@ -193,8 +193,7 @@ void ParticleSystem::remove(particle *p) void ParticleSystem::setImage(Image *image) { - if (this->image != 0) - this->image->release(); + Object::AutoRelease imagerelease(this->image); this->image = image; this->image->retain(); diff --git a/src/modules/graphics/opengl/SpriteBatch.cpp b/src/modules/graphics/opengl/SpriteBatch.cpp index 24fdb2d47..f3af67bd8 100644 --- a/src/modules/graphics/opengl/SpriteBatch.cpp +++ b/src/modules/graphics/opengl/SpriteBatch.cpp @@ -176,8 +176,9 @@ void SpriteBatch::unlock() void SpriteBatch::setImage(Image *newimage) { + Object::AutoRelease imagerelease(image); + newimage->retain(); - image->release(); image = newimage; }