|
|
@ -101,7 +101,7 @@ void SQSharedState::Init()
|
|
|
|
#ifndef NO_GARBAGE_COLLECTOR
|
|
|
|
#ifndef NO_GARBAGE_COLLECTOR
|
|
|
|
_gc_chain=NULL;
|
|
|
|
_gc_chain=NULL;
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
sq_new(_stringtable,StringTable);
|
|
|
|
sq_new(_stringtable,SQStringTable);
|
|
|
|
sq_new(_metamethods,SQObjectPtrVec);
|
|
|
|
sq_new(_metamethods,SQObjectPtrVec);
|
|
|
|
sq_new(_systemstrings,SQObjectPtrVec);
|
|
|
|
sq_new(_systemstrings,SQObjectPtrVec);
|
|
|
|
sq_new(_types,SQObjectPtrVec);
|
|
|
|
sq_new(_types,SQObjectPtrVec);
|
|
|
@ -188,18 +188,16 @@ SQSharedState::~SQSharedState()
|
|
|
|
#ifndef NO_GARBAGE_COLLECTOR
|
|
|
|
#ifndef NO_GARBAGE_COLLECTOR
|
|
|
|
SQCollectable *t = _gc_chain;
|
|
|
|
SQCollectable *t = _gc_chain;
|
|
|
|
SQCollectable *nx = NULL;
|
|
|
|
SQCollectable *nx = NULL;
|
|
|
|
while(t) {
|
|
|
|
if(t) {
|
|
|
|
t->_uiRef++;
|
|
|
|
t->_uiRef++;
|
|
|
|
t = t->_next;
|
|
|
|
while(t) {
|
|
|
|
}
|
|
|
|
t->Finalize();
|
|
|
|
t = _gc_chain;
|
|
|
|
nx = t->_next;
|
|
|
|
while(t) {
|
|
|
|
if(nx) nx->_uiRef++;
|
|
|
|
t->UnMark();
|
|
|
|
if(--t->_uiRef == 0)
|
|
|
|
t->Finalize();
|
|
|
|
t->Release();
|
|
|
|
nx = t->_next;
|
|
|
|
t = nx;
|
|
|
|
if(--t->_uiRef == 0)
|
|
|
|
}
|
|
|
|
t->Release();
|
|
|
|
|
|
|
|
t=nx;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// assert(_gc_chain==NULL); //just to proove a theory
|
|
|
|
// assert(_gc_chain==NULL); //just to proove a theory
|
|
|
|
while(_gc_chain){
|
|
|
|
while(_gc_chain){
|
|
|
@ -211,7 +209,7 @@ SQSharedState::~SQSharedState()
|
|
|
|
sq_delete(_types,SQObjectPtrVec);
|
|
|
|
sq_delete(_types,SQObjectPtrVec);
|
|
|
|
sq_delete(_systemstrings,SQObjectPtrVec);
|
|
|
|
sq_delete(_systemstrings,SQObjectPtrVec);
|
|
|
|
sq_delete(_metamethods,SQObjectPtrVec);
|
|
|
|
sq_delete(_metamethods,SQObjectPtrVec);
|
|
|
|
sq_delete(_stringtable,StringTable);
|
|
|
|
sq_delete(_stringtable,SQStringTable);
|
|
|
|
if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize);
|
|
|
|
if(_scratchpad)SQ_FREE(_scratchpad,_scratchpadsize);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -271,14 +269,17 @@ SQInteger SQSharedState::CollectGarbage(SQVM *vm)
|
|
|
|
|
|
|
|
|
|
|
|
SQCollectable *t = _gc_chain;
|
|
|
|
SQCollectable *t = _gc_chain;
|
|
|
|
SQCollectable *nx = NULL;
|
|
|
|
SQCollectable *nx = NULL;
|
|
|
|
while(t) {
|
|
|
|
if(t) {
|
|
|
|
t->_uiRef++;
|
|
|
|
t->_uiRef++;
|
|
|
|
t->Finalize();
|
|
|
|
while(t) {
|
|
|
|
nx = t->_next;
|
|
|
|
t->Finalize();
|
|
|
|
if(--t->_uiRef == 0)
|
|
|
|
nx = t->_next;
|
|
|
|
t->Release();
|
|
|
|
if(nx) nx->_uiRef++;
|
|
|
|
t = nx;
|
|
|
|
if(--t->_uiRef == 0)
|
|
|
|
n++;
|
|
|
|
t->Release();
|
|
|
|
|
|
|
|
t = nx;
|
|
|
|
|
|
|
|
n++;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
t = tchain;
|
|
|
|
t = tchain;
|
|
|
@ -483,33 +484,33 @@ void RefTable::AllocNodes(SQUnsignedInteger size)
|
|
|
|
_numofslots = size;
|
|
|
|
_numofslots = size;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////////////////////////////////////////////////////////
|
|
|
|
//StringTable
|
|
|
|
//SQStringTable
|
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
|
|
|
|
* The following code is based on Lua 4.0 (Copyright 1994-2002 Tecgraf, PUC-Rio.)
|
|
|
|
* http://www.lua.org/copyright.html#4
|
|
|
|
* http://www.lua.org/copyright.html#4
|
|
|
|
* http://www.lua.org/source/4.0.1/src_lstring.c.html
|
|
|
|
* http://www.lua.org/source/4.0.1/src_lstring.c.html
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
StringTable::StringTable()
|
|
|
|
SQStringTable::SQStringTable()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
AllocNodes(4);
|
|
|
|
AllocNodes(4);
|
|
|
|
_slotused = 0;
|
|
|
|
_slotused = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
StringTable::~StringTable()
|
|
|
|
SQStringTable::~SQStringTable()
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SQ_FREE(_strings,sizeof(SQString*)*_numofslots);
|
|
|
|
SQ_FREE(_strings,sizeof(SQString*)*_numofslots);
|
|
|
|
_strings = NULL;
|
|
|
|
_strings = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void StringTable::AllocNodes(SQInteger size)
|
|
|
|
void SQStringTable::AllocNodes(SQInteger size)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
_numofslots = size;
|
|
|
|
_numofslots = size;
|
|
|
|
_strings = (SQString**)SQ_MALLOC(sizeof(SQString*)*_numofslots);
|
|
|
|
_strings = (SQString**)SQ_MALLOC(sizeof(SQString*)*_numofslots);
|
|
|
|
memset(_strings,0,sizeof(SQString*)*_numofslots);
|
|
|
|
memset(_strings,0,sizeof(SQString*)*_numofslots);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
SQString *StringTable::Add(const SQChar *news,SQInteger len)
|
|
|
|
SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
if(len<0)
|
|
|
|
if(len<0)
|
|
|
|
len = (SQInteger)scstrlen(news);
|
|
|
|
len = (SQInteger)scstrlen(news);
|
|
|
@ -534,7 +535,7 @@ SQString *StringTable::Add(const SQChar *news,SQInteger len)
|
|
|
|
return t;
|
|
|
|
return t;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void StringTable::Resize(SQInteger size)
|
|
|
|
void SQStringTable::Resize(SQInteger size)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SQInteger oldsize=_numofslots;
|
|
|
|
SQInteger oldsize=_numofslots;
|
|
|
|
SQString **oldtable=_strings;
|
|
|
|
SQString **oldtable=_strings;
|
|
|
@ -552,7 +553,7 @@ void StringTable::Resize(SQInteger size)
|
|
|
|
SQ_FREE(oldtable,oldsize*sizeof(SQString*));
|
|
|
|
SQ_FREE(oldtable,oldsize*sizeof(SQString*));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void StringTable::Remove(SQString *bs)
|
|
|
|
void SQStringTable::Remove(SQString *bs)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
SQString *s;
|
|
|
|
SQString *s;
|
|
|
|
SQString *prev=NULL;
|
|
|
|
SQString *prev=NULL;
|
|
|
|