{\r
StringTable();\r
~StringTable();\r
- //return a string obj if exists\r
- //so when there is a table query, if the string doesn't exists in the global state\r
- //it cannot be in a table so the result will be always null\r
- //SQString *get(const SQChar *news);\r
SQString *Add(const SQChar *,SQInteger len);\r
void Remove(SQString *);\r
private:\r
SQUnsignedInteger _slotused;\r
};\r
\r
+struct RefTable {\r
+ struct RefNode {\r
+ SQObjectPtr obj;\r
+ SQUnsignedInteger refs;\r
+ struct RefNode *next;\r
+ };\r
+ RefTable();\r
+ ~RefTable();\r
+ void AddRef(SQObject &obj);\r
+ SQBool Release(SQObject &obj);\r
+#ifndef NO_GARBAGE_COLLECTOR\r
+ void Mark(SQCollectable **chain);\r
+#endif\r
+ void Finalize();\r
+private:\r
+ RefNode *Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add);\r
+ RefNode *Add(SQHash mainpos,SQObject &obj);\r
+ void Resize(SQUnsignedInteger size);\r
+ void AllocNodes(SQUnsignedInteger size);\r
+ SQUnsignedInteger _numofslots;\r
+ SQUnsignedInteger _slotused;\r
+ SQUnsignedInteger _buffersize;\r
+ RefNode *_freelist;\r
+ RefNode **_buckets;\r
+};\r
+\r
#define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)\r
#define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)\r
\r
SQObjectPtrVec *_systemstrings;\r
SQObjectPtrVec *_types;\r
StringTable *_stringtable;\r
- SQObjectPtr _refs_table;\r
+ RefTable _refs_table;\r
SQObjectPtr _registry;\r
SQObjectPtr _constructoridx;\r
#ifndef NO_GARBAGE_COLLECTOR\r
SQCOMPILERERROR _compilererrorhandler;\r
SQPRINTFUNCTION _printfunc;\r
bool _debuginfo;\r
+ bool _notifyallexceptions;\r
private:\r
SQChar *_scratchpad;\r
SQInteger _scratchpadsize;\r