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