Made Mr_Tree graphic smaller, from 99 to 85 pixels.
[supertux.git] / src / squirrel / squirrel / sqstate.cpp
index e352e25..e209095 100644 (file)
@@ -36,12 +36,13 @@ SQSharedState::SQSharedState()
 \r
 bool CompileTypemask(SQIntVec &res,const SQChar *typemask)\r
 {\r
-       int i = 0;\r
+       SQInteger i = 0;\r
        \r
-       int mask = 0;\r
+       SQInteger mask = 0;\r
        while(typemask[i] != 0) {\r
                \r
                switch(typemask[i]){\r
+                               case 'o': mask |= _RT_NULL; break;\r
                                case 'i': mask |= _RT_INTEGER; break;\r
                                case 'f': mask |= _RT_FLOAT; break;\r
                                case 'n': mask |= (_RT_FLOAT | _RT_INTEGER); break;\r
@@ -56,6 +57,7 @@ bool CompileTypemask(SQIntVec &res,const SQChar *typemask)
                                case 'v': mask |= _RT_THREAD; break;\r
                                case 'x': mask |= _RT_INSTANCE; break;\r
                                case 'y': mask |= _RT_CLASS; break;\r
+                               case 'r': mask |= _RT_WEAKREF; break;\r
                                case '.': mask = -1; res.push_back(mask); i++; mask = 0; continue;\r
                                case ' ': i++; continue; //ignores spaces\r
                                default:\r
@@ -77,7 +79,7 @@ bool CompileTypemask(SQIntVec &res,const SQChar *typemask)
 \r
 SQTable *CreateDefaultDelegate(SQSharedState *ss,SQRegFunction *funcz)\r
 {\r
-       int i=0;\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);\r
@@ -136,6 +138,7 @@ void SQSharedState::Init()
        newmetamethod(MM_CLONED);\r
        newmetamethod(MM_NEWSLOT);\r
        newmetamethod(MM_DELSLOT);\r
+       newmetamethod(MM_TOSTRING);\r
 \r
        _constructoridx = SQString::Create(this,_SC("constructor"));\r
        _refs_table = SQTable::Create(this,0);\r
@@ -149,6 +152,7 @@ void SQSharedState::Init()
        _thread_default_delegate=CreateDefaultDelegate(this,_thread_default_delegate_funcz);\r
        _class_default_delegate=CreateDefaultDelegate(this,_class_default_delegate_funcz);\r
        _instance_default_delegate=CreateDefaultDelegate(this,_instance_default_delegate_funcz);\r
+       _weakref_default_delegate=CreateDefaultDelegate(this,_weakref_default_delegate_funcz);\r
 \r
 }\r
 \r
@@ -176,6 +180,7 @@ SQSharedState::~SQSharedState()
        _thread_default_delegate=_null_;\r
        _class_default_delegate=_null_;\r
        _instance_default_delegate=_null_;\r
+       _weakref_default_delegate=_null_;\r
        \r
 #ifndef NO_GARBAGE_COLLECTOR\r
        \r
@@ -233,14 +238,14 @@ void SQSharedState::MarkObject(SQObjectPtr &o,SQCollectable **chain)
 }\r
 \r
 \r
-int SQSharedState::CollectGarbage(SQVM *vm)\r
+SQInteger SQSharedState::CollectGarbage(SQVM *vm)\r
 {\r
-       int n=0;\r
+       SQInteger n=0;\r
        SQCollectable *tchain=NULL;\r
        SQVM *vms=_thread(_root_vm);\r
        \r
        vms->Mark(&tchain);\r
-       int x = _table(_thread(_root_vm)->_roottable)->CountUsed();\r
+       SQInteger x = _table(_thread(_root_vm)->_roottable)->CountUsed();\r
        MarkObject(_refs_table,&tchain);\r
        MarkObject(_registry,&tchain);\r
        MarkObject(_metamethodsmap,&tchain);\r
@@ -253,6 +258,7 @@ int SQSharedState::CollectGarbage(SQVM *vm)
        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
        SQCollectable *t=_gc_chain;\r
        SQCollectable *nx=NULL;\r
@@ -272,7 +278,7 @@ int SQSharedState::CollectGarbage(SQVM *vm)
                t=t->_next;\r
        }\r
        _gc_chain=tchain;\r
-       int z = _table(_thread(_root_vm)->_roottable)->CountUsed();\r
+       SQInteger z = _table(_thread(_root_vm)->_roottable)->CountUsed();\r
        assert(z == x);\r
        return n;\r
 }\r
@@ -298,9 +304,9 @@ void SQCollectable::RemoveFromChain(SQCollectable **chain,SQCollectable *c)
 }\r
 #endif\r
 \r
-SQChar* SQSharedState::GetScratchPad(int size)\r
+SQChar* SQSharedState::GetScratchPad(SQInteger size)\r
 {\r
-       int newsize;\r
+       SQInteger newsize;\r
        if(size>0){\r
                if(_scratchpadsize<size){\r
                        newsize=size+(size>>1);\r
@@ -324,9 +330,9 @@ SQChar* SQSharedState::GetScratchPad(int size)
 * http://www.lua.org/source/4.0.1/src_lstring.c.html\r
 */\r
 \r
-int SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)\r
+SQInteger SQString::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)\r
 {\r
-       int idx = (int)TranslateIndex(refpos);\r
+       SQInteger idx = (SQInteger)TranslateIndex(refpos);\r
        while(idx < _len){\r
                outkey = (SQInteger)idx;\r
                outval = SQInteger(_val[idx]);\r
@@ -349,7 +355,7 @@ StringTable::~StringTable()
        _strings=NULL;\r
 }\r
 \r
-void StringTable::AllocNodes(int size)\r
+void StringTable::AllocNodes(SQInteger size)\r
 {\r
        _numofslots=size;\r
        //_slotused=0;\r
@@ -357,11 +363,11 @@ void StringTable::AllocNodes(int size)
        memset(_strings,0,sizeof(SQString*)*_numofslots);\r
 }\r
 \r
-SQString *StringTable::Add(const SQChar *news,int len)\r
+SQString *StringTable::Add(const SQChar *news,SQInteger len)\r
 {\r
        if(len<0)\r
                len=scstrlen(news);\r
-       unsigned int h=::_hashstr(news,len)&(_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
@@ -371,31 +377,30 @@ SQString *StringTable::Add(const SQChar *news,int len)
        SQString *t=(SQString *)SQ_MALLOC(rsl(len)+sizeof(SQString));\r
        new (t) SQString;\r
        memcpy(t->_val,news,rsl(len));\r
-       t->_val[len]=_SC('\0');\r
-       t->_len=len;\r
-       t->_hash=::_hashstr(news,len);\r
-       t->_next=_strings[h];\r
-       t->_uiRef=0;\r
-       _strings[h]=t;\r
+       t->_val[len] = _SC('\0');\r
+       t->_len = len;\r
+       t->_hash = ::_hashstr(news,len);\r
+       t->_next = _strings[h];\r
+       _strings[h] = t;\r
        _slotused++;\r
        if (_slotused > _numofslots)  /* too crowded? */\r
                Resize(_numofslots*2);\r
        return t;\r
 }\r
 \r
-void StringTable::Resize(int size)\r
+void StringTable::Resize(SQInteger size)\r
 {\r
-       int oldsize=_numofslots;\r
+       SQInteger oldsize=_numofslots;\r
        SQString **oldtable=_strings;\r
        AllocNodes(size);\r
-       for (int i=0; i<oldsize; i++){\r
+       for (SQInteger i=0; i<oldsize; i++){\r
                SQString *p = oldtable[i];\r
                while(p){\r
                        SQString *next = p->_next;\r
-                       unsigned int h=p->_hash&(_numofslots-1);\r
-                       p->_next=_strings[h];\r
+                       SQHash h = p->_hash&(_numofslots-1);\r
+                       p->_next = _strings[h];\r
                        _strings[h] = p;\r
-                       p=next;\r
+                       p = next;\r
                }\r
        }\r
        SQ_FREE(oldtable,oldsize*sizeof(SQString*));\r
@@ -405,7 +410,7 @@ void StringTable::Remove(SQString *bs)
 {\r
        SQString *s;\r
        SQString *prev=NULL;\r
-       unsigned int h=bs->_hash&(_numofslots-1);\r
+       SQHash h = bs->_hash&(_numofslots - 1);\r
        \r
        for (s = _strings[h]; s; ){\r
                if(s == bs){\r
@@ -414,9 +419,9 @@ void StringTable::Remove(SQString *bs)
                        else\r
                                _strings[h] = s->_next;\r
                        _slotused--;\r
-                       int slen=s->_len;\r
+                       SQInteger slen = s->_len;\r
                        s->~SQString();\r
-                       SQ_FREE(s,sizeof(SQString)+rsl(slen));\r
+                       SQ_FREE(s,sizeof(SQString) + rsl(slen));\r
                        return;\r
                }\r
                prev = s;\r