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 	//return a string obj if exists
17 	//so when there is a table query, if the string doesn't exists in the global state
18 	//it cannot be in a table so the result will be always null
19 	//SQString *get(const SQChar *news);
20 	SQString *Add(const SQChar *,SQInteger len);
21 	void Remove(SQString *);
22 private:
23 	void Resize(SQInteger size);
24 	void AllocNodes(SQInteger size);
25 	SQString **_strings;
26 	SQUnsignedInteger _numofslots;
27 	SQUnsignedInteger _slotused;
28 };
29 
30 #define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)
31 #define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)
32 
33 struct SQObjectPtr;
34 
35 struct SQSharedState
36 {
37 	SQSharedState();
38 	~SQSharedState();
39 	void Init();
40 public:
41 	SQChar* GetScratchPad(SQInteger size);
42 	SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);
43 #ifndef NO_GARBAGE_COLLECTOR
44 	SQInteger CollectGarbage(SQVM *vm);
45 	static void MarkObject(SQObjectPtr &o,SQCollectable **chain);
46 #endif
47 	SQObjectPtrVec *_metamethods;
48 	SQObjectPtr _metamethodsmap;
49 	SQObjectPtrVec *_systemstrings;
50 	SQObjectPtrVec *_types;
51 	StringTable *_stringtable;
52 	SQObjectPtr _refs_table;
53 	SQObjectPtr _registry;
54 	SQObjectPtr _constructoridx;
55 #ifndef NO_GARBAGE_COLLECTOR
56 	SQCollectable *_gc_chain;
57 #endif
58 	SQObjectPtr _root_vm;
59 	SQObjectPtr _table_default_delegate;
60 	static SQRegFunction _table_default_delegate_funcz[];
61 	SQObjectPtr _array_default_delegate;
62 	static SQRegFunction _array_default_delegate_funcz[];
63 	SQObjectPtr _string_default_delegate;
64 	static SQRegFunction _string_default_delegate_funcz[];
65 	SQObjectPtr _number_default_delegate;
66 	static SQRegFunction _number_default_delegate_funcz[];
67 	SQObjectPtr _generator_default_delegate;
68 	static SQRegFunction _generator_default_delegate_funcz[];
69 	SQObjectPtr _closure_default_delegate;
70 	static SQRegFunction _closure_default_delegate_funcz[];
71 	SQObjectPtr _thread_default_delegate;
72 	static SQRegFunction _thread_default_delegate_funcz[];
73 	SQObjectPtr _class_default_delegate;
74 	static SQRegFunction _class_default_delegate_funcz[];
75 	SQObjectPtr _instance_default_delegate;
76 	static SQRegFunction _instance_default_delegate_funcz[];
77 	SQObjectPtr _weakref_default_delegate;
78 	static SQRegFunction _weakref_default_delegate_funcz[];
79 
80 	SQCOMPILERERROR _compilererrorhandler;
81 	SQPRINTFUNCTION _printfunc;
82 	bool _debuginfo;
83 private:
84 	SQChar *_scratchpad;
85 	SQInteger _scratchpadsize;
86 };
87 
88 #define _sp(s) (_sharedstate->GetScratchPad(s))
89 #define _spval (_sharedstate->GetScratchPad(-1))
90 
91 #define _table_ddel		_table(_sharedstate->_table_default_delegate)
92 #define _array_ddel		_table(_sharedstate->_array_default_delegate)
93 #define _string_ddel	_table(_sharedstate->_string_default_delegate)
94 #define _number_ddel	_table(_sharedstate->_number_default_delegate)
95 #define _generator_ddel	_table(_sharedstate->_generator_default_delegate)
96 #define _closure_ddel	_table(_sharedstate->_closure_default_delegate)
97 #define _thread_ddel	_table(_sharedstate->_thread_default_delegate)
98 #define _class_ddel		_table(_sharedstate->_class_default_delegate)
99 #define _instance_ddel	_table(_sharedstate->_instance_default_delegate)
100 #define _weakref_ddel	_table(_sharedstate->_weakref_default_delegate)
101 
102 #ifdef SQUNICODE //rsl REAL STRING LEN
103 #define rsl(l) ((l)<<1)
104 #else
105 #define rsl(l) (l)
106 #endif
107 
108 extern SQObjectPtr _null_;
109 extern SQObjectPtr _true_;
110 extern SQObjectPtr _false_;
111 extern SQObjectPtr _one_;
112 extern SQObjectPtr _minusone_;
113 
114 bool CompileTypemask(SQIntVec &res,const SQChar *typemask);
115 
116 #endif //_SQSTATE_H_
117