ed9d6fc8a3192cbdffb2ebea6225bdc6d5322c76
[supertux.git] / external / squirrel / squirrel / sqstate.h
1 /*      see copyright notice in squirrel.h */\r
2 #ifndef _SQSTATE_H_\r
3 #define _SQSTATE_H_\r
4 \r
5 #include "squtils.h"\r
6 #include "sqobject.h"\r
7 struct SQString;\r
8 struct SQTable;\r
9 //max number of character for a printed number\r
10 #define NUMBER_MAX_CHAR 50\r
11 \r
12 struct SQStringTable\r
13 {\r
14         SQStringTable(SQSharedState*ss);\r
15         ~SQStringTable();\r
16         SQString *Add(const SQChar *,SQInteger len);\r
17         void Remove(SQString *);\r
18 private:\r
19         void Resize(SQInteger size);\r
20         void AllocNodes(SQInteger size);\r
21         SQString **_strings;\r
22         SQUnsignedInteger _numofslots;\r
23         SQUnsignedInteger _slotused;\r
24         SQSharedState *_sharedstate;\r
25 };\r
26 \r
27 struct RefTable {\r
28         struct RefNode {\r
29                 SQObjectPtr obj;\r
30                 SQUnsignedInteger refs;\r
31                 struct RefNode *next;\r
32         };\r
33         RefTable();\r
34         ~RefTable();\r
35         void AddRef(SQObject &obj);\r
36         SQBool Release(SQObject &obj);\r
37         SQUnsignedInteger GetRefCount(SQObject &obj);\r
38 #ifndef NO_GARBAGE_COLLECTOR\r
39         void Mark(SQCollectable **chain);\r
40 #endif\r
41         void Finalize();\r
42 private:\r
43         RefNode *Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add);\r
44         RefNode *Add(SQHash mainpos,SQObject &obj);\r
45         void Resize(SQUnsignedInteger size);\r
46         void AllocNodes(SQUnsignedInteger size);\r
47         SQUnsignedInteger _numofslots;\r
48         SQUnsignedInteger _slotused;\r
49         RefNode *_nodes;\r
50         RefNode *_freelist;\r
51         RefNode **_buckets;\r
52 };\r
53 \r
54 #define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)\r
55 #define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)\r
56 \r
57 struct SQObjectPtr;\r
58 \r
59 struct SQSharedState\r
60 {\r
61         SQSharedState();\r
62         ~SQSharedState();\r
63         void Init();\r
64 public:\r
65         SQChar* GetScratchPad(SQInteger size);\r
66         SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);\r
67 #ifndef NO_GARBAGE_COLLECTOR\r
68         SQInteger CollectGarbage(SQVM *vm);\r
69         void RunMark(SQVM *vm,SQCollectable **tchain);\r
70         SQInteger ResurrectUnreachable(SQVM *vm);\r
71         static void MarkObject(SQObjectPtr &o,SQCollectable **chain);\r
72 #endif\r
73         SQObjectPtrVec *_metamethods;\r
74         SQObjectPtr _metamethodsmap;\r
75         SQObjectPtrVec *_systemstrings;\r
76         SQObjectPtrVec *_types;\r
77         SQStringTable *_stringtable;\r
78         RefTable _refs_table;\r
79         SQObjectPtr _registry;\r
80         SQObjectPtr _consts;\r
81         SQObjectPtr _constructoridx;\r
82 #ifndef NO_GARBAGE_COLLECTOR\r
83         SQCollectable *_gc_chain;\r
84 #endif\r
85         SQObjectPtr _root_vm;\r
86         SQObjectPtr _table_default_delegate;\r
87         static SQRegFunction _table_default_delegate_funcz[];\r
88         SQObjectPtr _array_default_delegate;\r
89         static SQRegFunction _array_default_delegate_funcz[];\r
90         SQObjectPtr _string_default_delegate;\r
91         static SQRegFunction _string_default_delegate_funcz[];\r
92         SQObjectPtr _number_default_delegate;\r
93         static SQRegFunction _number_default_delegate_funcz[];\r
94         SQObjectPtr _generator_default_delegate;\r
95         static SQRegFunction _generator_default_delegate_funcz[];\r
96         SQObjectPtr _closure_default_delegate;\r
97         static SQRegFunction _closure_default_delegate_funcz[];\r
98         SQObjectPtr _thread_default_delegate;\r
99         static SQRegFunction _thread_default_delegate_funcz[];\r
100         SQObjectPtr _class_default_delegate;\r
101         static SQRegFunction _class_default_delegate_funcz[];\r
102         SQObjectPtr _instance_default_delegate;\r
103         static SQRegFunction _instance_default_delegate_funcz[];\r
104         SQObjectPtr _weakref_default_delegate;\r
105         static SQRegFunction _weakref_default_delegate_funcz[];\r
106         \r
107         SQCOMPILERERROR _compilererrorhandler;\r
108         SQPRINTFUNCTION _printfunc;\r
109         SQPRINTFUNCTION _errorfunc;\r
110         bool _debuginfo;\r
111         bool _notifyallexceptions;\r
112 private:\r
113         SQChar *_scratchpad;\r
114         SQInteger _scratchpadsize;\r
115 };\r
116 \r
117 #define _sp(s) (_sharedstate->GetScratchPad(s))\r
118 #define _spval (_sharedstate->GetScratchPad(-1))\r
119 \r
120 #define _table_ddel             _table(_sharedstate->_table_default_delegate) \r
121 #define _array_ddel             _table(_sharedstate->_array_default_delegate) \r
122 #define _string_ddel    _table(_sharedstate->_string_default_delegate) \r
123 #define _number_ddel    _table(_sharedstate->_number_default_delegate) \r
124 #define _generator_ddel _table(_sharedstate->_generator_default_delegate) \r
125 #define _closure_ddel   _table(_sharedstate->_closure_default_delegate) \r
126 #define _thread_ddel    _table(_sharedstate->_thread_default_delegate) \r
127 #define _class_ddel             _table(_sharedstate->_class_default_delegate) \r
128 #define _instance_ddel  _table(_sharedstate->_instance_default_delegate) \r
129 #define _weakref_ddel   _table(_sharedstate->_weakref_default_delegate) \r
130 \r
131 #ifdef SQUNICODE //rsl REAL STRING LEN\r
132 #define rsl(l) ((l)<<1)\r
133 #else\r
134 #define rsl(l) (l)\r
135 #endif\r
136 \r
137 //extern SQObjectPtr _null_;\r
138 \r
139 bool CompileTypemask(SQIntVec &res,const SQChar *typemask);\r
140 \r
141 \r
142 #endif //_SQSTATE_H_\r