From bec51d5c0a182c72d24113884348aaa50e87afb0 Mon Sep 17 00:00:00 2001 From: Edouard DUPIN Date: Wed, 27 Jun 2018 01:15:54 +0200 Subject: [PATCH] [DEV] finish remove chaining for garbage collector --- rabbit/UserData.hpp | 3 --- rabbit/sqarray.hpp | 5 +++-- rabbit/sqclass.cpp | 7 ------- rabbit/sqclass.hpp | 2 +- rabbit/sqclosure.hpp | 38 +++++++++++++++++++++++++++----------- rabbit/sqfuncproto.hpp | 2 +- rabbit/sqobject.cpp | 3 --- rabbit/sqobject.hpp | 6 +----- rabbit/sqtable.cpp | 2 -- rabbit/sqtable.hpp | 1 - rabbit/sqvm.cpp | 2 -- rabbit/sqvm.hpp | 2 +- 12 files changed, 34 insertions(+), 39 deletions(-) diff --git a/rabbit/UserData.hpp b/rabbit/UserData.hpp index bd7a20d..17f3e03 100644 --- a/rabbit/UserData.hpp +++ b/rabbit/UserData.hpp @@ -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) { diff --git a/rabbit/sqarray.hpp b/rabbit/sqarray.hpp index 99f6bc2..7a7821e 100644 --- a/rabbit/sqarray.hpp +++ b/rabbit/sqarray.hpp @@ -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){ diff --git a/rabbit/sqclass.cpp b/rabbit/sqclass.cpp index a850949..02c21a8 100644 --- a/rabbit/sqclass.cpp +++ b/rabbit/sqclass.cpp @@ -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 } diff --git a/rabbit/sqclass.hpp b/rabbit/sqclass.hpp index 54c8795..8713140 100644 --- a/rabbit/sqclass.hpp +++ b/rabbit/sqclass.hpp @@ -30,7 +30,7 @@ typedef sqvector 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: diff --git a/rabbit/sqclosure.hpp b/rabbit/sqclosure.hpp index 8f46e02..e920c98 100644 --- a/rabbit/sqclosure.hpp +++ b/rabbit/sqclosure.hpp @@ -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); diff --git a/rabbit/sqfuncproto.hpp b/rabbit/sqfuncproto.hpp index 0790863..3f72df3 100644 --- a/rabbit/sqfuncproto.hpp +++ b/rabbit/sqfuncproto.hpp @@ -64,7 +64,7 @@ typedef sqvector SQLineInfoVec; +(localinf*sizeof(SQLocalVarInfo))+(defparams*sizeof(SQInteger))) -struct SQFunctionProto : public CHAINABLE_OBJ +struct SQFunctionProto : public SQRefCounted { private: SQFunctionProto(SQSharedState *ss); diff --git a/rabbit/sqobject.cpp b/rabbit/sqobject.cpp index ed303b3..76065cc 100644 --- a/rabbit/sqobject.cpp +++ b/rabbit/sqobject.cpp @@ -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) diff --git a/rabbit/sqobject.hpp b/rabbit/sqobject.hpp index 50f3e0c..d708d67 100644 --- a/rabbit/sqobject.hpp +++ b/rabbit/sqobject.hpp @@ -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; diff --git a/rabbit/sqtable.cpp b/rabbit/sqtable.cpp index 389fd40..cc9f1ee 100644 --- a/rabbit/sqtable.cpp +++ b/rabbit/sqtable.cpp @@ -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) diff --git a/rabbit/sqtable.hpp b/rabbit/sqtable.hpp index 6c8b3d7..0be3ddd 100644 --- a/rabbit/sqtable.hpp +++ b/rabbit/sqtable.hpp @@ -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)); } diff --git a/rabbit/sqvm.cpp b/rabbit/sqvm.cpp index 7d6ddfe..fc0aeea 100644 --- a/rabbit/sqvm.cpp +++ b/rabbit/sqvm.cpp @@ -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) diff --git a/rabbit/sqvm.hpp b/rabbit/sqvm.hpp index e5246f6..328c34e 100644 --- a/rabbit/sqvm.hpp +++ b/rabbit/sqvm.hpp @@ -37,7 +37,7 @@ struct SQExceptionTrap{ typedef sqvector ExceptionsTraps; -struct SQVM : public CHAINABLE_OBJ +struct SQVM : public SQRefCounted { struct CallInfo{ //CallInfo() { _generator = NULL;}