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