Tilemap/VX: Ensure proxy objects don't outlive their parents

Either of these would previously crash (same for VX):

tm = Tilemap.new
at = tm.autotiles
tm = nil
GC.start
at[0] = Bitmap.new(1, 1)

tm = Tilemap.new
at = tm.autotiles
tm.dispose
at[0] = Bitmap.new(1, 1)

Funnily, this makes RMXP itself crash too, but crashing is
never acceptable except for possibly resource exhaustion.
This commit is contained in:
Jonas Kulla 2014-09-26 18:21:50 +02:00
parent e9d0d0566b
commit 9758e660c4
9 changed files with 41 additions and 12 deletions

View file

@ -41,7 +41,6 @@
struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
{
TilemapVX::BitmapArray bitmapsProxy;
Bitmap *bitmaps[BM_COUNT];
Table *mapData;
@ -358,6 +357,9 @@ struct TilemapVXPrivate : public ViewportElement, TileAtlasVX::Reader
void TilemapVX::BitmapArray::set(int i, Bitmap *bitmap)
{
if (!p)
return;
if (i < 0 || i >= BM_COUNT)
return;
@ -378,6 +380,9 @@ void TilemapVX::BitmapArray::set(int i, Bitmap *bitmap)
Bitmap *TilemapVX::BitmapArray::get(int i) const
{
if (!p)
return 0;
if (i < 0 || i >= BM_COUNT)
return 0;
@ -387,7 +392,7 @@ Bitmap *TilemapVX::BitmapArray::get(int i) const
TilemapVX::TilemapVX(Viewport *viewport)
{
p = new TilemapVXPrivate(viewport);
p->bitmapsProxy.p = p;
bmProxy.p = p;
}
TilemapVX::~TilemapVX()
@ -413,11 +418,11 @@ void TilemapVX::update()
p->aniOffset = Vec2(aniIdxA * 2 * 32, aniIdxC * 32);
}
TilemapVX::BitmapArray &TilemapVX::getBitmapArray() const
TilemapVX::BitmapArray &TilemapVX::getBitmapArray()
{
guardDisposed();
return p->bitmapsProxy;
return bmProxy;
}
DEF_ATTR_RD_SIMPLE(TilemapVX, MapData, Table*, p->mapData)
@ -521,4 +526,5 @@ void TilemapVX::setOY(int value)
void TilemapVX::releaseResources()
{
delete p;
bmProxy.p = 0;
}