restore trunk
[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 _constructoridx;
77 #ifndef NO_GARBAGE_COLLECTOR
78         SQCollectable *_gc_chain;
79 #endif
80         SQObjectPtr _root_vm;
81         SQObjectPtr _table_default_delegate;
82         static SQRegFunction _table_default_delegate_funcz[];
83         SQObjectPtr _array_default_delegate;
84         static SQRegFunction _array_default_delegate_funcz[];
85         SQObjectPtr _string_default_delegate;
86         static SQRegFunction _string_default_delegate_funcz[];
87         SQObjectPtr _number_default_delegate;
88         static SQRegFunction _number_default_delegate_funcz[];
89         SQObjectPtr _generator_default_delegate;
90         static SQRegFunction _generator_default_delegate_funcz[];
91         SQObjectPtr _closure_default_delegate;
92         static SQRegFunction _closure_default_delegate_funcz[];
93         SQObjectPtr _thread_default_delegate;
94         static SQRegFunction _thread_default_delegate_funcz[];
95         SQObjectPtr _class_default_delegate;
96         static SQRegFunction _class_default_delegate_funcz[];
97         SQObjectPtr _instance_default_delegate;
98         static SQRegFunction _instance_default_delegate_funcz[];
99         SQObjectPtr _weakref_default_delegate;
100         static SQRegFunction _weakref_default_delegate_funcz[];
101         
102         SQCOMPILERERROR _compilererrorhandler;
103         SQPRINTFUNCTION _printfunc;
104         bool _debuginfo;
105         bool _notifyallexceptions;
106 private:
107         SQChar *_scratchpad;
108         SQInteger _scratchpadsize;
109 };
110
111 #define _sp(s) (_sharedstate->GetScratchPad(s))
112 #define _spval (_sharedstate->GetScratchPad(-1))
113
114 #define _table_ddel             _table(_sharedstate->_table_default_delegate) 
115 #define _array_ddel             _table(_sharedstate->_array_default_delegate) 
116 #define _string_ddel    _table(_sharedstate->_string_default_delegate) 
117 #define _number_ddel    _table(_sharedstate->_number_default_delegate) 
118 #define _generator_ddel _table(_sharedstate->_generator_default_delegate) 
119 #define _closure_ddel   _table(_sharedstate->_closure_default_delegate) 
120 #define _thread_ddel    _table(_sharedstate->_thread_default_delegate) 
121 #define _class_ddel             _table(_sharedstate->_class_default_delegate) 
122 #define _instance_ddel  _table(_sharedstate->_instance_default_delegate) 
123 #define _weakref_ddel   _table(_sharedstate->_weakref_default_delegate) 
124
125 #ifdef SQUNICODE //rsl REAL STRING LEN
126 #define rsl(l) ((l)<<1)
127 #else
128 #define rsl(l) (l)
129 #endif
130
131 extern SQObjectPtr _null_;
132 extern SQObjectPtr _true_;
133 extern SQObjectPtr _false_;
134 extern SQObjectPtr _one_;
135 extern SQObjectPtr _minusone_;
136
137 bool CompileTypemask(SQIntVec &res,const SQChar *typemask);
138
139 void *sq_vm_malloc(SQUnsignedInteger size);
140 void *sq_vm_realloc(void *p,SQUnsignedInteger oldsize,SQUnsignedInteger size);
141 void sq_vm_free(void *p,SQUnsignedInteger size);
142 #endif //_SQSTATE_H_