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