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
|
@ -155,7 +155,7 @@ defineClass(mrb_state *mrb, const char *name)
|
|||
#define DEF_PROP_OBJ_VAL(Klass, PropKlass, PropName, prop_iv) \
|
||||
MRB_METHOD(Klass##Get##PropName) \
|
||||
{ \
|
||||
checkDisposed(mrb, self); \
|
||||
checkDisposed<Klass>(mrb, self); \
|
||||
return getProperty(mrb, self, prop_iv); \
|
||||
} \
|
||||
MRB_METHOD(Klass##Set##PropName) \
|
||||
|
@ -194,7 +194,9 @@ defineClass(mrb_state *mrb, const char *name)
|
|||
MRB_METHOD(Klass##Get##PropName) \
|
||||
{ \
|
||||
Klass *k = getPrivateData<Klass>(mrb, self); \
|
||||
return mrb_##conv_t##_value(k->get##PropName()); \
|
||||
mrb_type value; \
|
||||
GUARD_EXC( value = k->get##PropName(); ) \
|
||||
return mrb_##conv_t##_value(value); \
|
||||
} \
|
||||
MRB_METHOD(Klass##Set##PropName) \
|
||||
{ \
|
||||
|
@ -256,21 +258,12 @@ getSym(mrb_state *mrb, CommonSymbol sym)
|
|||
void
|
||||
raiseDisposedAccess(mrb_state *mrb, mrb_value self);
|
||||
|
||||
inline void checkDisposed(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
if (!DATA_PTR(self))
|
||||
raiseDisposedAccess(mrb, self);
|
||||
}
|
||||
|
||||
template<class C>
|
||||
inline C *
|
||||
getPrivateData(mrb_state *mrb, mrb_value self)
|
||||
getPrivateData(mrb_state *, mrb_value self)
|
||||
{
|
||||
C *c = static_cast<C*>(DATA_PTR(self));
|
||||
|
||||
if (!c)
|
||||
raiseDisposedAccess(mrb, self);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
|
|
|
@ -114,7 +114,7 @@ MRB_METHOD(bitmapBlt)
|
|||
src = getPrivateDataCheck<Bitmap>(mrb, srcObj, BitmapType);
|
||||
srcRect = getPrivateDataCheck<Rect>(mrb, srcRectObj, RectType);
|
||||
|
||||
GUARD_EXC( b->blt(x, y, src, srcRect->toIntRect(), opacity); )
|
||||
GUARD_EXC( b->blt(x, y, *src, srcRect->toIntRect(), opacity); )
|
||||
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
@ -137,7 +137,7 @@ MRB_METHOD(bitmapStretchBlt)
|
|||
destRect = getPrivateDataCheck<Rect>(mrb, destRectObj, RectType);
|
||||
srcRect = getPrivateDataCheck<Rect>(mrb, srcRectObj, RectType);
|
||||
|
||||
GUARD_EXC( b->stretchBlt(destRect->toIntRect(), src, srcRect->toIntRect(), opacity); )
|
||||
GUARD_EXC( b->stretchBlt(destRect->toIntRect(), *src, srcRect->toIntRect(), opacity); )
|
||||
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
@ -280,7 +280,7 @@ MRB_METHOD(bitmapTextSize)
|
|||
|
||||
MRB_METHOD(bitmapGetFont)
|
||||
{
|
||||
checkDisposed(mrb, self);
|
||||
checkDisposed<Bitmap>(mrb, self);
|
||||
|
||||
return getProperty(mrb, self, CSfont);
|
||||
}
|
||||
|
|
|
@ -66,33 +66,47 @@ disposableDisposeChildren(mrb_state *mrb, mrb_value disp)
|
|||
template<class C>
|
||||
MRB_METHOD(disposableDispose)
|
||||
{
|
||||
C *c = static_cast<C*>(DATA_PTR(self));
|
||||
C *d = static_cast<C*>(DATA_PTR(self));
|
||||
|
||||
/* Nothing to do if already disposed */
|
||||
if (!c)
|
||||
if (!d)
|
||||
return mrb_nil_value();
|
||||
|
||||
if (d->isDisposed())
|
||||
return mrb_nil_value();
|
||||
|
||||
disposableDisposeChildren(mrb, self);
|
||||
|
||||
delete c;
|
||||
DATA_PTR(self) = 0;
|
||||
d->dispose();
|
||||
|
||||
return mrb_nil_value();
|
||||
}
|
||||
|
||||
template<class C>
|
||||
MRB_METHOD(disposableDisposed)
|
||||
MRB_METHOD(disposableIsDisposed)
|
||||
{
|
||||
MRB_UNUSED_PARAM;
|
||||
|
||||
return mrb_bool_value(DATA_PTR(self) == 0);
|
||||
C *d = static_cast<C*>(DATA_PTR(self));
|
||||
|
||||
if (!d)
|
||||
return mrb_true_value();
|
||||
|
||||
return mrb_bool_value(d->isDisposed());
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static void disposableBindingInit(mrb_state *mrb, RClass *klass)
|
||||
{
|
||||
mrb_define_method(mrb, klass, "dispose", disposableDispose<C>, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, klass, "disposed?", disposableDisposed<C>, MRB_ARGS_NONE());
|
||||
mrb_define_method(mrb, klass, "disposed?", disposableIsDisposed<C>, MRB_ARGS_NONE());
|
||||
}
|
||||
|
||||
template<class C>
|
||||
inline void
|
||||
checkDisposed(mrb_state *mrb, mrb_value self)
|
||||
{
|
||||
if (mrb_test(disposableIsDisposed<C>(0, self)))
|
||||
raiseDisposedAccess(mrb, self);
|
||||
}
|
||||
|
||||
#endif // DISPOSABLEBINDING_H
|
||||
|
|
|
@ -103,6 +103,9 @@ MRB_METHOD(FontSetName)
|
|||
return name;
|
||||
}
|
||||
|
||||
template<class C>
|
||||
static void checkDisposed(mrb_state *, mrb_value) {}
|
||||
|
||||
DEF_PROP_I(Font, Size)
|
||||
DEF_PROP_B(Font, Bold)
|
||||
DEF_PROP_B(Font, Italic)
|
||||
|
|
|
@ -106,6 +106,8 @@ MRB_METHOD(tilemapInitialize)
|
|||
|
||||
MRB_METHOD(tilemapGetAutotiles)
|
||||
{
|
||||
checkDisposed<Tilemap>(mrb, self);
|
||||
|
||||
return getProperty(mrb, self, CSautotiles);
|
||||
}
|
||||
|
||||
|
@ -120,7 +122,7 @@ MRB_METHOD(tilemapUpdate)
|
|||
|
||||
MRB_METHOD(tilemapGetViewport)
|
||||
{
|
||||
checkDisposed(mrb, self);
|
||||
checkDisposed<Tilemap>(mrb, self);
|
||||
|
||||
return getProperty(mrb, self, CSviewport);
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
template<class C>
|
||||
MRB_METHOD(viewportElementGetViewport)
|
||||
{
|
||||
checkDisposed(mrb, self);
|
||||
checkDisposed<C>(mrb, self);
|
||||
|
||||
return getProperty(mrb, self, CSviewport);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue