#include "squserdata.h"\r
#include "sqclass.h"\r
\r
-//SQObjectPtr _null_;\r
-//SQObjectPtr _true_(true);\r
-//SQObjectPtr _false_(false);\r
-//SQObjectPtr _one_((SQInteger)1);\r
-//SQObjectPtr _minusone_((SQInteger)-1);\r
+SQObjectPtr _null_;\r
+SQObjectPtr _true_(true);\r
+SQObjectPtr _false_(false);\r
+SQObjectPtr _one_((SQInteger)1);\r
+SQObjectPtr _minusone_((SQInteger)-1);\r
\r
SQSharedState::SQSharedState()\r
{\r
_compilererrorhandler = NULL;\r
_printfunc = NULL;\r
- _errorfunc = NULL;\r
_debuginfo = false;\r
_notifyallexceptions = false;\r
}\r
SQInteger i=0;\r
SQTable *t=SQTable::Create(ss,0);\r
while(funcz[i].name!=0){\r
- SQNativeClosure *nc = SQNativeClosure::Create(ss,funcz[i].f,0);\r
+ SQNativeClosure *nc = SQNativeClosure::Create(ss,funcz[i].f);\r
nc->_nparamscheck = funcz[i].nparamscheck;\r
nc->_name = SQString::Create(ss,funcz[i].name);\r
if(funcz[i].typemask && !CompileTypemask(nc->_typecheck,funcz[i].typemask))\r
#ifndef NO_GARBAGE_COLLECTOR\r
_gc_chain=NULL;\r
#endif\r
- _stringtable = (SQStringTable*)SQ_MALLOC(sizeof(SQStringTable));\r
- new (_stringtable) SQStringTable(this);\r
+ sq_new(_stringtable,SQStringTable);\r
sq_new(_metamethods,SQObjectPtrVec);\r
sq_new(_systemstrings,SQObjectPtrVec);\r
sq_new(_types,SQObjectPtrVec);\r
\r
SQSharedState::~SQSharedState()\r
{\r
- _constructoridx.Null();\r
+ _constructoridx = _null_;\r
_table(_registry)->Finalize();\r
_table(_consts)->Finalize();\r
_table(_metamethodsmap)->Finalize();\r
- _registry.Null();\r
- _consts.Null();\r
- _metamethodsmap.Null();\r
+ _registry = _null_;\r
+ _consts = _null_;\r
+ _metamethodsmap = _null_;\r
while(!_systemstrings->empty()) {\r
- _systemstrings->back().Null();\r
+ _systemstrings->back()=_null_;\r
_systemstrings->pop_back();\r
}\r
_thread(_root_vm)->Finalize();\r
- _root_vm.Null();\r
- _table_default_delegate.Null();\r
- _array_default_delegate.Null();\r
- _string_default_delegate.Null();\r
- _number_default_delegate.Null();\r
- _closure_default_delegate.Null();\r
- _generator_default_delegate.Null();\r
- _thread_default_delegate.Null();\r
- _class_default_delegate.Null();\r
- _instance_default_delegate.Null();\r
- _weakref_default_delegate.Null();\r
+ _root_vm = _null_;\r
+ _table_default_delegate = _null_;\r
+ _array_default_delegate = _null_;\r
+ _string_default_delegate = _null_;\r
+ _number_default_delegate = _null_;\r
+ _closure_default_delegate = _null_;\r
+ _generator_default_delegate = _null_;\r
+ _thread_default_delegate = _null_;\r
+ _class_default_delegate = _null_;\r
+ _instance_default_delegate = _null_;\r
+ _weakref_default_delegate = _null_;\r
_refs_table.Finalize();\r
#ifndef NO_GARBAGE_COLLECTOR\r
SQCollectable *t = _gc_chain;\r
case OT_THREAD:_thread(o)->Mark(chain);break;\r
case OT_CLASS:_class(o)->Mark(chain);break;\r
case OT_INSTANCE:_instance(o)->Mark(chain);break;\r
- case OT_OUTER:_outer(o)->Mark(chain);break;\r
- case OT_FUNCPROTO:_funcproto(o)->Mark(chain);break;\r
default: break; //shutup compiler\r
}\r
}\r
\r
\r
-void SQSharedState::RunMark(SQVM *vm,SQCollectable **tchain)\r
+SQInteger SQSharedState::CollectGarbage(SQVM *vm)\r
{\r
+ SQInteger n=0;\r
+ SQCollectable *tchain=NULL;\r
SQVM *vms = _thread(_root_vm);\r
\r
- vms->Mark(tchain);\r
+ vms->Mark(&tchain);\r
+ SQInteger x = _table(_thread(_root_vm)->_roottable)->CountUsed();\r
+ _refs_table.Mark(&tchain);\r
+ MarkObject(_registry,&tchain);\r
+ MarkObject(_consts,&tchain);\r
+ MarkObject(_metamethodsmap,&tchain);\r
+ MarkObject(_table_default_delegate,&tchain);\r
+ MarkObject(_array_default_delegate,&tchain);\r
+ MarkObject(_string_default_delegate,&tchain);\r
+ MarkObject(_number_default_delegate,&tchain);\r
+ MarkObject(_generator_default_delegate,&tchain);\r
+ MarkObject(_thread_default_delegate,&tchain);\r
+ MarkObject(_closure_default_delegate,&tchain);\r
+ MarkObject(_class_default_delegate,&tchain);\r
+ MarkObject(_instance_default_delegate,&tchain);\r
+ MarkObject(_weakref_default_delegate,&tchain);\r
\r
- _refs_table.Mark(tchain);\r
- MarkObject(_registry,tchain);\r
- MarkObject(_consts,tchain);\r
- MarkObject(_metamethodsmap,tchain);\r
- MarkObject(_table_default_delegate,tchain);\r
- MarkObject(_array_default_delegate,tchain);\r
- MarkObject(_string_default_delegate,tchain);\r
- MarkObject(_number_default_delegate,tchain);\r
- MarkObject(_generator_default_delegate,tchain);\r
- MarkObject(_thread_default_delegate,tchain);\r
- MarkObject(_closure_default_delegate,tchain);\r
- MarkObject(_class_default_delegate,tchain);\r
- MarkObject(_instance_default_delegate,tchain);\r
- MarkObject(_weakref_default_delegate,tchain);\r
-\r
-}\r
-\r
-SQInteger SQSharedState::ResurrectUnreachable(SQVM *vm)\r
-{\r
- SQInteger n=0;\r
- SQCollectable *tchain=NULL;\r
-\r
- RunMark(vm,&tchain);\r
-\r
- SQCollectable *resurrected = _gc_chain;\r
- SQCollectable *t = resurrected;\r
- //SQCollectable *nx = NULL;\r
-\r
- _gc_chain = tchain;\r
-\r
- SQArray *ret = NULL;\r
- if(resurrected) {\r
- ret = SQArray::Create(this,0);\r
- SQCollectable *rlast = NULL;\r
- while(t) {\r
- rlast = t;\r
- SQObjectType type = t->GetType();\r
- if(type != OT_FUNCPROTO && type != OT_OUTER) {\r
- SQObject sqo;\r
- sqo._type = type;\r
- sqo._unVal.pRefCounted = t;\r
- ret->Append(sqo);\r
- }\r
- t = t->_next;\r
- n++;\r
- }\r
-\r
- assert(rlast->_next == NULL);\r
- rlast->_next = _gc_chain;\r
- if(_gc_chain)\r
- {\r
- _gc_chain->_prev = rlast;\r
- }\r
- _gc_chain = resurrected;\r
- }\r
-\r
- t = _gc_chain;\r
- while(t) {\r
- t->UnMark();\r
- t = t->_next;\r
- }\r
-\r
- if(ret) {\r
- SQObjectPtr temp = ret;\r
- vm->Push(temp);\r
- }\r
- else {\r
- vm->PushNull();\r
- }\r
- return n;\r
-}\r
-\r
-SQInteger SQSharedState::CollectGarbage(SQVM *vm)\r
-{\r
- SQInteger n = 0;\r
- SQCollectable *tchain = NULL;\r
-\r
- RunMark(vm,&tchain);\r
-\r
SQCollectable *t = _gc_chain;\r
SQCollectable *nx = NULL;\r
if(t) {\r
t = t->_next;\r
}\r
_gc_chain = tchain;\r
- \r
+ SQInteger z = _table(_thread(_root_vm)->_roottable)->CountUsed();\r
+ assert(z == x);\r
return n;\r
}\r
#endif\r
{\r
RefNode *nodes = _nodes;\r
for(SQUnsignedInteger n = 0; n < _numofslots; n++) {\r
- nodes->obj.Null();\r
+ nodes->obj = _null_;\r
nodes++;\r
}\r
}\r
ref->refs++;\r
}\r
\r
-SQUnsignedInteger RefTable::GetRefCount(SQObject &obj)\r
-{\r
- SQHash mainpos;\r
- RefNode *prev;\r
- RefNode *ref = Get(obj,mainpos,&prev,true);\r
- return ref->refs;\r
-}\r
-\r
-\r
SQBool RefTable::Release(SQObject &obj)\r
{\r
SQHash mainpos;\r
ref->next = _freelist;\r
_freelist = ref;\r
_slotused--;\r
- ref->obj.Null();\r
+ ref->obj = _null_;\r
//<<FIXME>>test for shrink?\r
return SQTrue;\r
}\r
assert(t->refs != 0);\r
RefNode *nn = Add(::HashObj(t->obj)&(_numofslots-1),t->obj);\r
nn->refs = t->refs; \r
- t->obj.Null();\r
+ t->obj = _null_;\r
nfound++;\r
}\r
t++;\r
* http://www.lua.org/source/4.0.1/src_lstring.c.html\r
*/\r
\r
-SQStringTable::SQStringTable(SQSharedState *ss)\r
+SQStringTable::SQStringTable()\r
{\r
- _sharedstate = ss;\r
AllocNodes(4);\r
_slotused = 0;\r
}\r
{\r
if(len<0)\r
len = (SQInteger)scstrlen(news);\r
- SQHash newhash = ::_hashstr(news,len);\r
- SQHash h = newhash&(_numofslots-1);\r
+ SQHash h = ::_hashstr(news,len)&(_numofslots-1);\r
SQString *s;\r
for (s = _strings[h]; s; s = s->_next){\r
if(s->_len == len && (!memcmp(news,s->_val,rsl(len))))\r
return s; //found\r
}\r
\r
- SQString *t = (SQString *)SQ_MALLOC(rsl(len)+sizeof(SQString));\r
+ SQString *t=(SQString *)SQ_MALLOC(rsl(len)+sizeof(SQString));\r
new (t) SQString;\r
- t->_sharedstate = _sharedstate;\r
memcpy(t->_val,news,rsl(len));\r
t->_val[len] = _SC('\0');\r
t->_len = len;\r
- t->_hash = newhash;\r
+ t->_hash = ::_hashstr(news,len);\r
t->_next = _strings[h];\r
_strings[h] = t;\r
_slotused++;\r