[DEV] finish remove chaining for garbage collector
This commit is contained in:
parent
73000df2bb
commit
bec51d5c0a
@ -13,11 +13,8 @@ namespace rabbit {
|
||||
UserData(SQSharedState *ss) {
|
||||
_delegate = 0;
|
||||
m_hook = NULL;
|
||||
INIT_CHAIN();
|
||||
ADD_TO_CHAIN(&_ss(this)->_gc_chain, this);
|
||||
}
|
||||
~UserData() {
|
||||
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain, this);
|
||||
SetDelegate(NULL);
|
||||
}
|
||||
static UserData* Create(SQSharedState *ss, SQInteger size) {
|
||||
|
@ -10,10 +10,11 @@
|
||||
struct SQArray : public CHAINABLE_OBJ
|
||||
{
|
||||
private:
|
||||
SQArray(SQSharedState *ss,SQInteger nsize){_values.resize(nsize); INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
|
||||
SQArray(SQSharedState *ss,SQInteger nsize) {
|
||||
_values.resize(nsize);
|
||||
}
|
||||
~SQArray()
|
||||
{
|
||||
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
|
||||
}
|
||||
public:
|
||||
static SQArray* Create(SQSharedState *ss,SQInteger nInitialSize){
|
||||
|
@ -32,9 +32,6 @@ SQClass::SQClass(SQSharedState *ss,SQClass *base)
|
||||
}
|
||||
_members = base?base->_members->Clone() : SQTable::Create(ss,0);
|
||||
__ObjAddRef(_members);
|
||||
|
||||
INIT_CHAIN();
|
||||
ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
|
||||
}
|
||||
|
||||
void SQClass::Finalize() {
|
||||
@ -50,7 +47,6 @@ void SQClass::Finalize() {
|
||||
|
||||
SQClass::~SQClass()
|
||||
{
|
||||
REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
|
||||
Finalize();
|
||||
}
|
||||
|
||||
@ -154,8 +150,6 @@ void SQInstance::Init(SQSharedState *ss)
|
||||
_hook = NULL;
|
||||
__ObjAddRef(_class);
|
||||
_delegate = _class->_members;
|
||||
INIT_CHAIN();
|
||||
ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
|
||||
}
|
||||
|
||||
SQInstance::SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize)
|
||||
@ -189,7 +183,6 @@ void SQInstance::Finalize()
|
||||
|
||||
SQInstance::~SQInstance()
|
||||
{
|
||||
REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
|
||||
if(_class){ Finalize(); } //if _class is null it was already finalized by the GC
|
||||
}
|
||||
|
||||
|
@ -30,7 +30,7 @@ typedef sqvector<SQClassMember> SQClassMemberVec;
|
||||
#define _member_type(o) (_integer(o)&0xFF000000)
|
||||
#define _member_idx(o) (_integer(o)&0x00FFFFFF)
|
||||
|
||||
struct SQClass : public CHAINABLE_OBJ
|
||||
struct SQClass : public SQRefCounted
|
||||
{
|
||||
SQClass(SQSharedState *ss,SQClass *base);
|
||||
public:
|
||||
|
@ -11,10 +11,15 @@
|
||||
|
||||
struct SQFunctionProto;
|
||||
struct SQClass;
|
||||
struct SQClosure : public CHAINABLE_OBJ
|
||||
struct SQClosure : public SQRefCounted
|
||||
{
|
||||
private:
|
||||
SQClosure(SQSharedState *ss,SQFunctionProto *func){_function = func; __ObjAddRef(_function); _base = NULL; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); _env = NULL; _root=NULL;}
|
||||
SQClosure(SQSharedState *ss,SQFunctionProto *func){
|
||||
_function = func;
|
||||
__ObjAddRef(_function); _base = NULL;
|
||||
_env = NULL;
|
||||
_root=NULL;
|
||||
}
|
||||
public:
|
||||
static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func,SQWeakRef *root){
|
||||
SQInteger size = _CALC_CLOSURE_SIZE(func);
|
||||
@ -66,11 +71,14 @@ public:
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////
|
||||
struct SQOuter : public CHAINABLE_OBJ
|
||||
struct SQOuter : public SQRefCounted
|
||||
{
|
||||
|
||||
private:
|
||||
SQOuter(SQSharedState *ss, SQObjectPtr *outer){_valptr = outer; _next = NULL; INIT_CHAIN(); ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
|
||||
SQOuter(SQSharedState *ss, SQObjectPtr *outer){
|
||||
_valptr = outer;
|
||||
_next = NULL;
|
||||
}
|
||||
|
||||
public:
|
||||
static SQOuter *Create(SQSharedState *ss, SQObjectPtr *outer)
|
||||
@ -79,7 +87,9 @@ public:
|
||||
new (nc) SQOuter(ss, outer);
|
||||
return nc;
|
||||
}
|
||||
~SQOuter() { REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this); }
|
||||
~SQOuter() {
|
||||
|
||||
}
|
||||
|
||||
void Release()
|
||||
{
|
||||
@ -94,11 +104,15 @@ public:
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////
|
||||
struct SQGenerator : public CHAINABLE_OBJ
|
||||
struct SQGenerator : public SQRefCounted
|
||||
{
|
||||
enum SQGeneratorState{eRunning,eSuspended,eDead};
|
||||
private:
|
||||
SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=NULL;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
|
||||
SQGenerator(SQSharedState *ss,SQClosure *closure){
|
||||
_closure=closure;
|
||||
_state=eRunning;
|
||||
_ci._generator=NULL;
|
||||
}
|
||||
public:
|
||||
static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
|
||||
SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
|
||||
@ -107,7 +121,7 @@ public:
|
||||
}
|
||||
~SQGenerator()
|
||||
{
|
||||
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
|
||||
|
||||
}
|
||||
void Kill(){
|
||||
_state=eDead;
|
||||
@ -128,10 +142,13 @@ public:
|
||||
|
||||
#define _CALC_NATVIVECLOSURE_SIZE(noutervalues) (sizeof(SQNativeClosure) + (noutervalues*sizeof(SQObjectPtr)))
|
||||
|
||||
struct SQNativeClosure : public CHAINABLE_OBJ
|
||||
struct SQNativeClosure : public SQRefCounted
|
||||
{
|
||||
private:
|
||||
SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); _env = NULL;}
|
||||
SQNativeClosure(SQSharedState *ss,SQFUNCTION func){
|
||||
_function=func;
|
||||
_env = NULL;
|
||||
}
|
||||
public:
|
||||
static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func,SQInteger nouters)
|
||||
{
|
||||
@ -157,7 +174,6 @@ public:
|
||||
~SQNativeClosure()
|
||||
{
|
||||
__ObjRelease(_env);
|
||||
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
|
||||
}
|
||||
void Release(){
|
||||
SQInteger size = _CALC_NATVIVECLOSURE_SIZE(_noutervalues);
|
||||
|
@ -64,7 +64,7 @@ typedef sqvector<SQLineInfo> SQLineInfoVec;
|
||||
+(localinf*sizeof(SQLocalVarInfo))+(defparams*sizeof(SQInteger)))
|
||||
|
||||
|
||||
struct SQFunctionProto : public CHAINABLE_OBJ
|
||||
struct SQFunctionProto : public SQRefCounted
|
||||
{
|
||||
private:
|
||||
SQFunctionProto(SQSharedState *ss);
|
||||
|
@ -276,7 +276,6 @@ SQClosure::~SQClosure()
|
||||
__ObjRelease(_root);
|
||||
__ObjRelease(_env);
|
||||
__ObjRelease(_base);
|
||||
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
|
||||
}
|
||||
|
||||
#define _CHECK_IO(exp) { if(!exp)return false; }
|
||||
@ -401,12 +400,10 @@ SQFunctionProto::SQFunctionProto(SQSharedState *ss)
|
||||
{
|
||||
_stacksize=0;
|
||||
_bgenerator=false;
|
||||
INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
|
||||
}
|
||||
|
||||
SQFunctionProto::~SQFunctionProto()
|
||||
{
|
||||
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
|
||||
}
|
||||
|
||||
bool SQFunctionProto::Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write)
|
||||
|
@ -312,12 +312,8 @@ inline void _Swap(SQObject &a,SQObject &b)
|
||||
b._unVal = unOldVal;
|
||||
}
|
||||
|
||||
#define ADD_TO_CHAIN(chain,obj) ((void)0)
|
||||
#define REMOVE_FROM_CHAIN(chain,obj) ((void)0)
|
||||
#define CHAINABLE_OBJ SQRefCounted
|
||||
#define INIT_CHAIN() ((void)0)
|
||||
|
||||
struct SQDelegable : public CHAINABLE_OBJ {
|
||||
struct SQDelegable : public SQRefCounted {
|
||||
bool SetDelegate(SQTable *m);
|
||||
virtual bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
|
||||
SQTable *_delegate;
|
||||
|
@ -19,8 +19,6 @@ SQTable::SQTable(SQSharedState *ss,SQInteger nInitialSize)
|
||||
AllocNodes(pow2size);
|
||||
_usednodes = 0;
|
||||
_delegate = NULL;
|
||||
INIT_CHAIN();
|
||||
ADD_TO_CHAIN(&_sharedstate->_gc_chain,this);
|
||||
}
|
||||
|
||||
void SQTable::Remove(const SQObjectPtr &key)
|
||||
|
@ -61,7 +61,6 @@ public:
|
||||
~SQTable()
|
||||
{
|
||||
SetDelegate(NULL);
|
||||
REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
|
||||
for (SQInteger i = 0; i < _numofnodes; i++) _nodes[i].~_HashNode();
|
||||
SQ_FREE(_nodes, _numofnodes * sizeof(_HashNode));
|
||||
}
|
||||
|
@ -129,7 +129,6 @@ SQVM::SQVM(SQSharedState *ss)
|
||||
_openouters = NULL;
|
||||
ci = NULL;
|
||||
_releasehook = NULL;
|
||||
INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);
|
||||
}
|
||||
|
||||
void SQVM::Finalize()
|
||||
@ -152,7 +151,6 @@ void SQVM::Finalize()
|
||||
SQVM::~SQVM()
|
||||
{
|
||||
Finalize();
|
||||
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
|
||||
}
|
||||
|
||||
bool SQVM::ArithMetaMethod(SQInteger op,const SQObjectPtr &o1,const SQObjectPtr &o2,SQObjectPtr &dest)
|
||||
|
@ -37,7 +37,7 @@ struct SQExceptionTrap{
|
||||
|
||||
typedef sqvector<SQExceptionTrap> ExceptionsTraps;
|
||||
|
||||
struct SQVM : public CHAINABLE_OBJ
|
||||
struct SQVM : public SQRefCounted
|
||||
{
|
||||
struct CallInfo{
|
||||
//CallInfo() { _generator = NULL;}
|
||||
|
Loading…
x
Reference in New Issue
Block a user