Revert "Update to SQUIRREL 3.0.4"
[supertux.git] / external / squirrel / squirrel / sqstate.cpp
old mode 100644 (file)
new mode 100755 (executable)
index bfea9c4..fd84b0a
 #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
@@ -84,7 +83,7 @@ SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz)
        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
@@ -102,8 +101,7 @@ void SQSharedState::Init()
 #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
@@ -163,29 +161,29 @@ void SQSharedState::Init()
 \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
@@ -241,98 +239,34 @@ void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain)
        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
@@ -354,7 +288,8 @@ SQInteger SQSharedState::CollectGarbage(SQVM *vm)
                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
@@ -406,7 +341,7 @@ void RefTable::Finalize()
 {\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
@@ -437,15 +372,6 @@ void RefTable::AddRef(SQObject &obj)
        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
@@ -463,7 +389,7 @@ SQBool RefTable::Release(SQObject &obj)
                        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
@@ -488,7 +414,7 @@ void RefTable::Resize(SQUnsignedInteger size)
                        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
@@ -565,9 +491,8 @@ void RefTable::AllocNodes(SQUnsignedInteger size)
 * 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
@@ -589,21 +514,19 @@ SQString *SQStringTable::Add(const SQChar *news,SQInteger len)
 {\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