\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
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
\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
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
_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
_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
}\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
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
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
}\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
* 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
_strings=NULL;\r
}\r
\r
-void StringTable::AllocNodes(int size)\r
+void StringTable::AllocNodes(SQInteger size)\r
{\r
_numofslots=size;\r
//_slotused=0;\r
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
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
{\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
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