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