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