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:
Jonas Kulla 2014-09-23 21:12:58 +02:00
parent 3983fe66e9
commit 81ac0780f8
36 changed files with 476 additions and 210 deletions

View file

@ -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;
}

View file

@ -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);
}

View file

@ -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

View file

@ -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)

View file

@ -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);
}

View file

@ -32,7 +32,7 @@
template<class C>
MRB_METHOD(viewportElementGetViewport)
{
checkDisposed(mrb, self);
checkDisposed<C>(mrb, self);
return getProperty(mrb, self, CSviewport);
}