Revert Disposable concept back into core
Pretty much a revert of
e858bbdcf5
.
We need this in core to properly implement F12 reset.
This commit is contained in:
parent
3983fe66e9
commit
81ac0780f8
36 changed files with 476 additions and 210 deletions
|
@ -101,22 +101,12 @@ static void freeInstance(void *inst)
|
|||
void
|
||||
raiseDisposedAccess(VALUE self);
|
||||
|
||||
inline void
|
||||
checkDisposed(VALUE self)
|
||||
{
|
||||
if (!RTYPEDDATA_DATA(self))
|
||||
raiseDisposedAccess(self);
|
||||
}
|
||||
|
||||
template<class C>
|
||||
inline C *
|
||||
getPrivateData(VALUE self)
|
||||
{
|
||||
C *c = static_cast<C*>(RTYPEDDATA_DATA(self));
|
||||
|
||||
if (!c)
|
||||
raiseDisposedAccess(self);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
@ -124,8 +114,6 @@ template<class C>
|
|||
static inline C *
|
||||
getPrivateDataCheck(VALUE self, const rb_data_type_t &type)
|
||||
{
|
||||
/* We don't check for disposed here because any disposable
|
||||
* property is always also nullable */
|
||||
void *obj = Check_TypedStruct(self, &type);
|
||||
return static_cast<C*>(obj);
|
||||
}
|
||||
|
@ -341,7 +329,7 @@ rb_check_argc(int actual, int expected)
|
|||
RB_METHOD(Klass##Get##PropName) \
|
||||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
checkDisposed(self); \
|
||||
checkDisposed<Klass>(self); \
|
||||
return rb_iv_get(self, prop_iv); \
|
||||
} \
|
||||
RB_METHOD(Klass##Set##PropName) \
|
||||
|
@ -360,7 +348,9 @@ rb_check_argc(int actual, int expected)
|
|||
{ \
|
||||
RB_UNUSED_PARAM; \
|
||||
Klass *k = getPrivateData<Klass>(self); \
|
||||
return value_fun(k->get##PropName()); \
|
||||
type value; \
|
||||
GUARD_EXC( value = k->get##PropName(); ) \
|
||||
return value_fun(value); \
|
||||
} \
|
||||
RB_METHOD(Klass##Set##PropName) \
|
||||
{ \
|
||||
|
|
|
@ -128,7 +128,7 @@ RB_METHOD(bitmapBlt)
|
|||
src = getPrivateDataCheck<Bitmap>(srcObj, BitmapType);
|
||||
srcRect = getPrivateDataCheck<Rect>(srcRectObj, RectType);
|
||||
|
||||
GUARD_EXC( b->blt(x, y, src, srcRect->toIntRect(), opacity); );
|
||||
GUARD_EXC( b->blt(x, y, *src, srcRect->toIntRect(), opacity); );
|
||||
|
||||
return self;
|
||||
}
|
||||
|
@ -151,7 +151,7 @@ RB_METHOD(bitmapStretchBlt)
|
|||
destRect = getPrivateDataCheck<Rect>(destRectObj, RectType);
|
||||
srcRect = getPrivateDataCheck<Rect>(srcRectObj, RectType);
|
||||
|
||||
GUARD_EXC( b->stretchBlt(destRect->toIntRect(), src, srcRect->toIntRect(), opacity); );
|
||||
GUARD_EXC( b->stretchBlt(destRect->toIntRect(), *src, srcRect->toIntRect(), opacity); );
|
||||
|
||||
return self;
|
||||
}
|
||||
|
|
|
@ -64,32 +64,48 @@ RB_METHOD(disposableDispose)
|
|||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
C *c = static_cast<C*>(RTYPEDDATA_DATA(self));
|
||||
C *d = getPrivateData<C>(self);
|
||||
|
||||
if (!d)
|
||||
return Qnil;
|
||||
|
||||
/* Nothing to do if already disposed */
|
||||
if (!c)
|
||||
if (d->isDisposed())
|
||||
return Qnil;
|
||||
|
||||
disposableDisposeChildren(self);
|
||||
|
||||
delete c;
|
||||
setPrivateData(self, 0);
|
||||
d->dispose();
|
||||
|
||||
return Qnil;
|
||||
}
|
||||
|
||||
template<class C>
|
||||
RB_METHOD(disposableIsDisposed)
|
||||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
return rb_bool_new(RTYPEDDATA_DATA(self) == 0);
|
||||
C *d = getPrivateData<C>(self);
|
||||
|
||||
if (!d)
|
||||
return Qtrue;
|
||||
|
||||
return rb_bool_new(d->isDisposed());
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static void disposableBindingInit(VALUE klass)
|
||||
{
|
||||
_rb_define_method(klass, "dispose", disposableDispose<C>);
|
||||
_rb_define_method(klass, "disposed?", disposableIsDisposed);
|
||||
_rb_define_method(klass, "disposed?", disposableIsDisposed<C>);
|
||||
}
|
||||
|
||||
template<class C>
|
||||
inline void
|
||||
checkDisposed(VALUE self)
|
||||
{
|
||||
if (disposableIsDisposed<C>(0, 0, self) == Qtrue)
|
||||
raiseDisposedAccess(self);
|
||||
}
|
||||
|
||||
#endif // DISPOSABLEBINDING_H
|
||||
|
|
|
@ -160,6 +160,9 @@ RB_METHOD(FontSetName)
|
|||
return argv[0];
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static void checkDisposed(VALUE) {}
|
||||
|
||||
DEF_PROP_OBJ_VAL(Font, Color, Color, "color")
|
||||
DEF_PROP_OBJ_VAL(Font, Color, OutColor, "out_color")
|
||||
|
||||
|
|
|
@ -101,6 +101,8 @@ RB_METHOD(tilemapGetAutotiles)
|
|||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
checkDisposed<Tilemap>(self);
|
||||
|
||||
return rb_iv_get(self, "autotiles");
|
||||
}
|
||||
|
||||
|
@ -119,7 +121,7 @@ RB_METHOD(tilemapGetViewport)
|
|||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
checkDisposed(self);
|
||||
checkDisposed<Tilemap>(self);
|
||||
|
||||
return rb_iv_get(self, "viewport");
|
||||
}
|
||||
|
|
|
@ -71,6 +71,8 @@ RB_METHOD(tilemapVXGetBitmapArray)
|
|||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
checkDisposed<TilemapVX>(self);
|
||||
|
||||
return rb_iv_get(self, "bitmap_array");
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ RB_METHOD(viewportElementGetViewport)
|
|||
{
|
||||
RB_UNUSED_PARAM;
|
||||
|
||||
checkDisposed(self);
|
||||
checkDisposed<C>(self);
|
||||
|
||||
return rb_iv_get(self, "viewport");
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue