bool CompileTypemask(SQIntVec &res,const SQChar *typemask)
{
SQInteger i = 0;
-
+
SQInteger mask = 0;
while(typemask[i] != 0) {
-
+
switch(typemask[i]){
case 'o': mask |= _RT_NULL; break;
case 'i': mask |= _RT_INTEGER; break;
return false;
}
i++;
- if(typemask[i] == '|') {
- i++;
+ if(typemask[i] == '|') {
+ i++;
if(typemask[i] == 0)
return false;
- continue;
+ continue;
}
res.push_back(mask);
mask = 0;
-
+
}
return true;
}
}
void SQSharedState::Init()
-{
+{
_scratchpad=NULL;
_scratchpadsize=0;
#ifndef NO_GARBAGE_COLLECTOR
_constructoridx = SQString::Create(this,_SC("constructor"));
_registry = SQTable::Create(this,0);
- _table_default_delegate=CreateDefaultDelegate(this,_table_default_delegate_funcz);
- _array_default_delegate=CreateDefaultDelegate(this,_array_default_delegate_funcz);
- _string_default_delegate=CreateDefaultDelegate(this,_string_default_delegate_funcz);
- _number_default_delegate=CreateDefaultDelegate(this,_number_default_delegate_funcz);
- _closure_default_delegate=CreateDefaultDelegate(this,_closure_default_delegate_funcz);
- _generator_default_delegate=CreateDefaultDelegate(this,_generator_default_delegate_funcz);
- _thread_default_delegate=CreateDefaultDelegate(this,_thread_default_delegate_funcz);
- _class_default_delegate=CreateDefaultDelegate(this,_class_default_delegate_funcz);
- _instance_default_delegate=CreateDefaultDelegate(this,_instance_default_delegate_funcz);
- _weakref_default_delegate=CreateDefaultDelegate(this,_weakref_default_delegate_funcz);
+ _consts = SQTable::Create(this,0);
+ _table_default_delegate = CreateDefaultDelegate(this,_table_default_delegate_funcz);
+ _array_default_delegate = CreateDefaultDelegate(this,_array_default_delegate_funcz);
+ _string_default_delegate = CreateDefaultDelegate(this,_string_default_delegate_funcz);
+ _number_default_delegate = CreateDefaultDelegate(this,_number_default_delegate_funcz);
+ _closure_default_delegate = CreateDefaultDelegate(this,_closure_default_delegate_funcz);
+ _generator_default_delegate = CreateDefaultDelegate(this,_generator_default_delegate_funcz);
+ _thread_default_delegate = CreateDefaultDelegate(this,_thread_default_delegate_funcz);
+ _class_default_delegate = CreateDefaultDelegate(this,_class_default_delegate_funcz);
+ _instance_default_delegate = CreateDefaultDelegate(this,_instance_default_delegate_funcz);
+ _weakref_default_delegate = CreateDefaultDelegate(this,_weakref_default_delegate_funcz);
}
SQSharedState::~SQSharedState()
{
_constructoridx = _null_;
- _refs_table.Finalize();
_table(_registry)->Finalize();
+ _table(_consts)->Finalize();
_table(_metamethodsmap)->Finalize();
-// _refs_table = _null_;
_registry = _null_;
+ _consts = _null_;
_metamethodsmap = _null_;
- while(!_systemstrings->empty()){
+ while(!_systemstrings->empty()) {
_systemstrings->back()=_null_;
_systemstrings->pop_back();
}
_thread(_root_vm)->Finalize();
_root_vm = _null_;
- _table_default_delegate=_null_;
- _array_default_delegate=_null_;
- _string_default_delegate=_null_;
- _number_default_delegate=_null_;
- _closure_default_delegate=_null_;
- _generator_default_delegate=_null_;
- _thread_default_delegate=_null_;
- _class_default_delegate=_null_;
- _instance_default_delegate=_null_;
- _weakref_default_delegate=_null_;
-
+ _table_default_delegate = _null_;
+ _array_default_delegate = _null_;
+ _string_default_delegate = _null_;
+ _number_default_delegate = _null_;
+ _closure_default_delegate = _null_;
+ _generator_default_delegate = _null_;
+ _thread_default_delegate = _null_;
+ _class_default_delegate = _null_;
+ _instance_default_delegate = _null_;
+ _weakref_default_delegate = _null_;
+ _refs_table.Finalize();
#ifndef NO_GARBAGE_COLLECTOR
-
-
- SQCollectable *t=_gc_chain;
- SQCollectable *nx=NULL;
- while(t){
+ SQCollectable *t = _gc_chain;
+ SQCollectable *nx = NULL;
+ while(t) {
t->_uiRef++;
t->Finalize();
- nx=t->_next;
- if(--t->_uiRef==0)
+ nx = t->_next;
+ if(--t->_uiRef == 0)
t->Release();
t=nx;
}
_gc_chain->Release();
}
#endif
+
sq_delete(_types,SQObjectPtrVec);
sq_delete(_systemstrings,SQObjectPtrVec);
sq_delete(_metamethods,SQObjectPtrVec);
{
SQInteger n=0;
SQCollectable *tchain=NULL;
- SQVM *vms=_thread(_root_vm);
-
+ SQVM *vms = _thread(_root_vm);
+
vms->Mark(&tchain);
SQInteger x = _table(_thread(_root_vm)->_roottable)->CountUsed();
_refs_table.Mark(&tchain);
MarkObject(_registry,&tchain);
+ MarkObject(_consts,&tchain);
MarkObject(_metamethodsmap,&tchain);
MarkObject(_table_default_delegate,&tchain);
MarkObject(_array_default_delegate,&tchain);
MarkObject(_class_default_delegate,&tchain);
MarkObject(_instance_default_delegate,&tchain);
MarkObject(_weakref_default_delegate,&tchain);
-
- SQCollectable *t=_gc_chain;
- SQCollectable *nx=NULL;
- while(t){
+
+ SQCollectable *t = _gc_chain;
+ SQCollectable *nx = NULL;
+ while(t) {
t->_uiRef++;
t->Finalize();
- nx=t->_next;
- if(--t->_uiRef==0)
+ nx = t->_next;
+ if(--t->_uiRef == 0)
t->Release();
- t=nx;
+ t = nx;
n++;
}
- t=tchain;
- while(t){
+ t = tchain;
+ while(t) {
t->UnMark();
- t=t->_next;
+ t = t->_next;
}
- _gc_chain=tchain;
+ _gc_chain = tchain;
SQInteger z = _table(_thread(_root_vm)->_roottable)->CountUsed();
assert(z == x);
return n;
#ifndef NO_GARBAGE_COLLECTOR
void SQCollectable::AddToChain(SQCollectable **chain,SQCollectable *c)
{
- c->_prev=NULL;
- c->_next=*chain;
- if(*chain) (*chain)->_prev=c;
- *chain=c;
+ c->_prev = NULL;
+ c->_next = *chain;
+ if(*chain) (*chain)->_prev = c;
+ *chain = c;
}
void SQCollectable::RemoveFromChain(SQCollectable **chain,SQCollectable *c)
{
- if(c->_prev) c->_prev->_next=c->_next;
- else *chain=c->_next;
+ if(c->_prev) c->_prev->_next = c->_next;
+ else *chain = c->_next;
if(c->_next)
- c->_next->_prev=c->_prev;
- c->_next=NULL;
- c->_prev=NULL;
+ c->_next->_prev = c->_prev;
+ c->_next = NULL;
+ c->_prev = NULL;
}
#endif
SQChar* SQSharedState::GetScratchPad(SQInteger size)
{
SQInteger newsize;
- if(size>0){
- if(_scratchpadsize<size){
- newsize=size+(size>>1);
- _scratchpad=(SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
- _scratchpadsize=newsize;
-
- }else if(_scratchpadsize>=(size<<5)){
- newsize=_scratchpadsize>>1;
- _scratchpad=(SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
- _scratchpadsize=newsize;
+ if(size>0) {
+ if(_scratchpadsize < size) {
+ newsize = size + (size>>1);
+ _scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
+ _scratchpadsize = newsize;
+
+ }else if(_scratchpadsize >= (size<<5)) {
+ newsize = _scratchpadsize >> 1;
+ _scratchpad = (SQChar *)SQ_REALLOC(_scratchpad,_scratchpadsize,newsize);
+ _scratchpadsize = newsize;
}
}
return _scratchpad;
void RefTable::Finalize()
{
- RefNode *nodes = (RefNode *)&_buckets[_numofslots];
+ RefNode *nodes = _nodes;
for(SQUnsignedInteger n = 0; n < _numofslots; n++) {
nodes->obj = _null_;
nodes++;
RefTable::~RefTable()
{
- SQ_FREE(_buckets,_buffersize);
+ SQ_FREE(_buckets,(_numofslots * sizeof(RefNode *)) + (_numofslots * sizeof(RefNode)));
}
+
#ifndef NO_GARBAGE_COLLECTOR
void RefTable::Mark(SQCollectable **chain)
{
- RefNode *nodes = (RefNode *)&_buckets[_numofslots];
+ RefNode *nodes = (RefNode *)_nodes;
for(SQUnsignedInteger n = 0; n < _numofslots; n++) {
if(type(nodes->obj) != OT_NULL) {
SQSharedState::MarkObject(nodes->obj,chain);
}
}
#endif
+
void RefTable::AddRef(SQObject &obj)
{
SQHash mainpos;
RefNode *ref = Get(obj,mainpos,&prev,false);
if(ref) {
if(--ref->refs == 0) {
- ref->obj = _null_;
+ SQObjectPtr o = ref->obj;
if(prev) {
prev->next = ref->next;
}
ref->next = _freelist;
_freelist = ref;
_slotused--;
+ ref->obj = _null_;
//<<FIXME>>test for shrink?
return SQTrue;
}
}
+ else {
+ assert(0);
+ }
return SQFalse;
}
void RefTable::Resize(SQUnsignedInteger size)
{
- RefNode **oldbuffer = _buckets;
- RefNode *oldnodes = (RefNode *)&_buckets[_numofslots];
+ RefNode **oldbucks = _buckets;
+ RefNode *t = _nodes;
SQUnsignedInteger oldnumofslots = _numofslots;
- SQUnsignedInteger oldbuffersize = _buffersize;
AllocNodes(size);
//rehash
+ SQUnsignedInteger nfound = 0;
for(SQUnsignedInteger n = 0; n < oldnumofslots; n++) {
- if(type(oldnodes->obj) != OT_NULL) {
+ if(type(t->obj) != OT_NULL) {
//add back;
- assert(oldnodes->refs != 0);
- RefNode *nn = Add(::HashObj(oldnodes->obj)&(_numofslots-1),oldnodes->obj);
- nn->refs = oldnodes->refs;
- oldnodes->obj = _null_;
+ assert(t->refs != 0);
+ RefNode *nn = Add(::HashObj(t->obj)&(_numofslots-1),t->obj);
+ nn->refs = t->refs;
+ t->obj = _null_;
+ nfound++;
}
- oldnodes++;
+ t++;
}
- SQ_FREE(oldbuffer,oldbuffersize);
+ assert(nfound == oldnumofslots);
+ SQ_FREE(oldbucks,(oldnumofslots * sizeof(RefNode *)) + (oldnumofslots * sizeof(RefNode)));
}
RefTable::RefNode *RefTable::Add(SQHash mainpos,SQObject &obj)
}
if(ref == NULL && add) {
if(_numofslots == _slotused) {
+ assert(_freelist == 0);
Resize(_numofslots*2);
+ mainpos = ::HashObj(obj)&(_numofslots-1);
}
ref = Add(mainpos,obj);
}
void RefTable::AllocNodes(SQUnsignedInteger size)
{
RefNode **bucks;
- RefNode *firstnode;
- _buffersize = size * sizeof(RefNode *) + size * sizeof(RefNode);
- bucks = (RefNode **)SQ_MALLOC(_buffersize);
- firstnode = (RefNode *)&bucks[size];
- RefNode *temp = firstnode;
+ RefNode *nodes;
+ bucks = (RefNode **)SQ_MALLOC((size * sizeof(RefNode *)) + (size * sizeof(RefNode)));
+ nodes = (RefNode *)&bucks[size];
+ RefNode *temp = nodes;
SQUnsignedInteger n;
for(n = 0; n < size - 1; n++) {
bucks[n] = NULL;
temp->refs = 0;
new (&temp->obj) SQObjectPtr;
temp->next = NULL;
- _freelist = firstnode;
+ _freelist = nodes;
+ _nodes = nodes;
_buckets = bucks;
_slotused = 0;
_numofslots = size;
StringTable::~StringTable()
{
SQ_FREE(_strings,sizeof(SQString*)*_numofslots);
- _strings=NULL;
+ _strings = NULL;
}
void StringTable::AllocNodes(SQInteger size)
{
- _numofslots=size;
- //_slotused=0;
- _strings=(SQString**)SQ_MALLOC(sizeof(SQString*)*_numofslots);
+ _numofslots = size;
+ _strings = (SQString**)SQ_MALLOC(sizeof(SQString*)*_numofslots);
memset(_strings,0,sizeof(SQString*)*_numofslots);
}
SQString *s;
SQString *prev=NULL;
SQHash h = bs->_hash&(_numofslots - 1);
-
+
for (s = _strings[h]; s; ){
if(s == bs){
if(prev)