64892c4ad644212da3719896563170c1bec35486
[supertux.git] / src / 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 StringTable\r
13 {\r
14         StringTable();\r
15         ~StringTable();\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 };\r
25 \r
26 struct RefTable {\r
27         struct RefNode {\r
28                 SQObjectPtr obj;\r
29                 SQUnsignedInteger refs;\r
30                 struct RefNode *next;\r
31         };\r
32         RefTable();\r
33         ~RefTable();\r
34         void AddRef(SQObject &obj);\r
35         SQBool Release(SQObject &obj);\r
36 #ifndef NO_GARBAGE_COLLECTOR\r
37         void Mark(SQCollectable **chain);\r
38 #endif\r
39         void Finalize();\r
40 private:\r
41         RefNode *Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add);\r
42         RefNode *Add(SQHash mainpos,SQObject &obj);\r
43         void Resize(SQUnsignedInteger size);\r
44         void AllocNodes(SQUnsignedInteger size);\r
45         SQUnsignedInteger _numofslots;\r
46         SQUnsignedInteger _slotused;\r
47         SQUnsignedInteger _buffersize;\r
48         RefNode *_freelist;\r
49         RefNode **_buckets;\r
50 };\r
51 \r
52 #define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)\r
53 #define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)\r
54 \r
55 struct SQObjectPtr;\r
56 \r
57 struct SQSharedState\r
58 {\r
59         SQSharedState();\r
60         ~SQSharedState();\r
61         void Init();\r
62 public:\r
63         SQChar* GetScratchPad(SQInteger size);\r
64         SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);\r
65 #ifndef NO_GARBAGE_COLLECTOR\r
66         SQInteger CollectGarbage(SQVM *vm); \r
67         static void MarkObject(SQObjectPtr &o,SQCollectable **chain);\r
68 #endif\r
69         SQObjectPtrVec *_metamethods;\r
70         SQObjectPtr _metamethodsmap;\r
71         SQObjectPtrVec *_systemstrings;\r
72         SQObjectPtrVec *_types;\r
73         StringTable *_stringtable;\r
74         RefTable _refs_table;\r
75         SQObjectPtr _registry;\r
76         SQObjectPtr _constructoridx;\r
77 #ifndef NO_GARBAGE_COLLECTOR\r
78         SQCollectable *_gc_chain;\r
79 #endif\r
80         SQObjectPtr _root_vm;\r
81         SQObjectPtr _table_default_delegate;\r
82         static SQRegFunction _table_default_delegate_funcz[];\r
83         SQObjectPtr _array_default_delegate;\r
84         static SQRegFunction _array_default_delegate_funcz[];\r
85         SQObjectPtr _string_default_delegate;\r
86         static SQRegFunction _string_default_delegate_funcz[];\r
87         SQObjectPtr _number_default_delegate;\r
88         static SQRegFunction _number_default_delegate_funcz[];\r
89         SQObjectPtr _generator_default_delegate;\r
90         static SQRegFunction _generator_default_delegate_funcz[];\r
91         SQObjectPtr _closure_default_delegate;\r
92         static SQRegFunction _closure_default_delegate_funcz[];\r
93         SQObjectPtr _thread_default_delegate;\r
94         static SQRegFunction _thread_default_delegate_funcz[];\r
95         SQObjectPtr _class_default_delegate;\r
96         static SQRegFunction _class_default_delegate_funcz[];\r
97         SQObjectPtr _instance_default_delegate;\r
98         static SQRegFunction _instance_default_delegate_funcz[];\r
99         SQObjectPtr _weakref_default_delegate;\r
100         static SQRegFunction _weakref_default_delegate_funcz[];\r
101         \r
102         SQCOMPILERERROR _compilererrorhandler;\r
103         SQPRINTFUNCTION _printfunc;\r
104         bool _debuginfo;\r
105         bool _notifyallexceptions;\r
106 private:\r
107         SQChar *_scratchpad;\r
108         SQInteger _scratchpadsize;\r
109 };\r
110 \r
111 #define _sp(s) (_sharedstate->GetScratchPad(s))\r
112 #define _spval (_sharedstate->GetScratchPad(-1))\r
113 \r
114 #define _table_ddel             _table(_sharedstate->_table_default_delegate) \r
115 #define _array_ddel             _table(_sharedstate->_array_default_delegate) \r
116 #define _string_ddel    _table(_sharedstate->_string_default_delegate) \r
117 #define _number_ddel    _table(_sharedstate->_number_default_delegate) \r
118 #define _generator_ddel _table(_sharedstate->_generator_default_delegate) \r
119 #define _closure_ddel   _table(_sharedstate->_closure_default_delegate) \r
120 #define _thread_ddel    _table(_sharedstate->_thread_default_delegate) \r
121 #define _class_ddel             _table(_sharedstate->_class_default_delegate) \r
122 #define _instance_ddel  _table(_sharedstate->_instance_default_delegate) \r
123 #define _weakref_ddel   _table(_sharedstate->_weakref_default_delegate) \r
124 \r
125 #ifdef SQUNICODE //rsl REAL STRING LEN\r
126 #define rsl(l) ((l)<<1)\r
127 #else\r
128 #define rsl(l) (l)\r
129 #endif\r
130 \r
131 extern SQObjectPtr _null_;\r
132 extern SQObjectPtr _true_;\r
133 extern SQObjectPtr _false_;\r
134 extern SQObjectPtr _one_;\r
135 extern SQObjectPtr _minusone_;\r
136 \r
137 bool CompileTypemask(SQIntVec &res,const SQChar *typemask);\r
138 \r
139 void *sq_vm_malloc(SQUnsignedInteger size);\r
140 void *sq_vm_realloc(void *p,SQUnsignedInteger oldsize,SQUnsignedInteger size);\r
141 void sq_vm_free(void *p,SQUnsignedInteger size);\r
142 #endif //_SQSTATE_H_\r