sqstate.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. /* see copyright notice in squirrel.h */
  2. #ifndef _SQSTATE_H_
  3. #define _SQSTATE_H_
  4. #include "squtils.h"
  5. #include "sqobject.h"
  6. struct SQString;
  7. struct SQTable;
  8. //max number of character for a printed number
  9. #define NUMBER_MAX_CHAR 50
  10. struct SQStringTable
  11. {
  12. SQStringTable(SQSharedState*ss);
  13. ~SQStringTable();
  14. SQString *Add(const SQChar *,SQInteger len);
  15. SQString *Add(SQString *strBuf);
  16. SQString *NewStrBuf(SQInteger len);
  17. void DeleteStrBuf(SQString *);
  18. void Remove(SQString *);
  19. private:
  20. SQString *Contains(const SQChar *news, SQInteger &len, SQHash &newhash, SQHash &h);
  21. SQString *Add(SQString *strBuf, SQHash newhash, SQHash h);
  22. void Resize(SQInteger size);
  23. void AllocNodes(SQInteger size);
  24. SQString **_strings;
  25. SQUnsignedInteger _numofslots;
  26. SQUnsignedInteger _slotused;
  27. SQSharedState *_sharedstate;
  28. };
  29. struct RefTable {
  30. struct RefNode {
  31. SQObjectPtr obj;
  32. SQUnsignedInteger refs;
  33. struct RefNode *next;
  34. };
  35. RefTable();
  36. ~RefTable();
  37. void AddRef(SQObject &obj);
  38. SQBool Release(SQObject &obj);
  39. SQUnsignedInteger GetRefCount(SQObject &obj);
  40. #ifndef NO_GARBAGE_COLLECTOR
  41. void Mark(SQCollectable **chain);
  42. #endif
  43. void Finalize();
  44. private:
  45. RefNode *Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add);
  46. RefNode *Add(SQHash mainpos,SQObject &obj);
  47. void Resize(SQUnsignedInteger size);
  48. void AllocNodes(SQUnsignedInteger size);
  49. SQUnsignedInteger _numofslots;
  50. SQUnsignedInteger _slotused;
  51. RefNode *_nodes;
  52. RefNode *_freelist;
  53. RefNode **_buckets;
  54. };
  55. #define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)
  56. #define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)
  57. struct SQObjectPtr;
  58. #ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
  59. struct SQDelayedReleseHook {
  60. SQRELEASEHOOK hook;
  61. SQUserPointer ptr;
  62. SQInteger size;
  63. };
  64. #endif // SQ_WITH_DELAYED_RELEASE_HOOKS
  65. struct SQSharedState
  66. {
  67. SQSharedState();
  68. ~SQSharedState();
  69. void Init();
  70. public:
  71. SQChar* GetScratchPad(SQInteger size);
  72. SQChar* GetScratchStr(SQInteger size);
  73. SQString* AddScratchStr();
  74. SQBool DelScratchStr(SQChar *s);
  75. SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);
  76. #ifndef NO_GARBAGE_COLLECTOR
  77. SQInteger CollectGarbage(SQVM *vm);
  78. void RunMark(SQVM *vm,SQCollectable **tchain);
  79. SQInteger ResurrectUnreachable(SQVM *vm);
  80. static void MarkObject(SQObjectPtr &o,SQCollectable **chain);
  81. #endif
  82. SQObjectPtrVec *_metamethods;
  83. SQObjectPtr _metamethodsmap;
  84. SQObjectPtrVec *_systemstrings;
  85. SQObjectPtrVec *_types;
  86. SQObjectPtr _defined_names;
  87. SQStringTable *_stringtable;
  88. RefTable _refs_table;
  89. SQObjectPtr _registry;
  90. SQObjectPtr _consts;
  91. SQObjectPtr _constructoridx;
  92. SQObjectPtr _destructoridx;
  93. SQObjectPtr _define_squilu;
  94. SQObjectPtr _define_squilu_int_sz;
  95. SQObjectPtr _define_squilu_float_sz;
  96. SQObjectPtr _define_squilu_ptr_sz;
  97. #ifndef NO_GARBAGE_COLLECTOR
  98. SQCollectable *_gc_chain;
  99. #endif
  100. #ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
  101. void AddDelayedReleaseHook(SQRELEASEHOOK hook, SQUserPointer ptr, SQInteger size);
  102. void CallDelayedReleaseHooks(SQVM *vm, int count=0);
  103. #endif // SQ_WITH_DELAYED_RELEASE_HOOKS
  104. SQObjectPtr _root_vm;
  105. SQObjectPtr _table_default_delegate_squirrel;
  106. static SQRegFunction _table_default_delegate_squirrel_funcz[];
  107. SQObjectPtr _table_default_delegate;
  108. static SQRegFunction _table_default_delegate_funcz[];
  109. SQObjectPtr _array_default_delegate;
  110. static SQRegFunction _array_default_delegate_funcz[];
  111. SQObjectPtr _string_default_delegate;
  112. static SQRegFunction _string_default_delegate_funcz[];
  113. SQObjectPtr _number_default_delegate;
  114. static SQRegFunction _number_default_delegate_funcz[];
  115. SQObjectPtr _generator_default_delegate;
  116. static SQRegFunction _generator_default_delegate_funcz[];
  117. SQObjectPtr _closure_default_delegate;
  118. static SQRegFunction _closure_default_delegate_funcz[];
  119. SQObjectPtr _thread_default_delegate;
  120. static SQRegFunction _thread_default_delegate_funcz[];
  121. SQObjectPtr _class_default_delegate;
  122. static SQRegFunction _class_default_delegate_funcz[];
  123. SQObjectPtr _instance_default_delegate;
  124. static SQRegFunction _instance_default_delegate_funcz[];
  125. SQObjectPtr _weakref_default_delegate;
  126. static SQRegFunction _weakref_default_delegate_funcz[];
  127. SQCOMPILERERROR _compilererrorhandler;
  128. SQPRINTFUNCTION _printfunc;
  129. SQPRINTFUNCTION _errorfunc;
  130. SQUserPointer _foreignptr;
  131. SQRELEASEHOOK _releasehook;
  132. private:
  133. SQChar *_scratchpad;
  134. SQString *_scratchstr;
  135. SQInteger _scratchpadsize;
  136. #ifdef SQ_WITH_DELAYED_RELEASE_HOOKS
  137. bool _already_in_CallDelayedReleaseHooks;
  138. sqvector<SQDelayedReleseHook> _delayed_release_hook;
  139. #endif // SQ_WITH_DELAYED_RELEASE_HOOKS
  140. public: //moved here for alignment purposes
  141. bool _debuginfo;
  142. bool _notifyallexceptions;
  143. };
  144. #define _sp(s) (_sharedstate->GetScratchPad(s))
  145. #define _spval (_sharedstate->GetScratchPad(-1))
  146. #define _table_ddel _table(_sharedstate->_table_default_delegate)
  147. #define _array_ddel _table(_sharedstate->_array_default_delegate)
  148. #define _string_ddel _table(_sharedstate->_string_default_delegate)
  149. #define _number_ddel _table(_sharedstate->_number_default_delegate)
  150. #define _generator_ddel _table(_sharedstate->_generator_default_delegate)
  151. #define _closure_ddel _table(_sharedstate->_closure_default_delegate)
  152. #define _thread_ddel _table(_sharedstate->_thread_default_delegate)
  153. #define _class_ddel _table(_sharedstate->_class_default_delegate)
  154. #define _instance_ddel _table(_sharedstate->_instance_default_delegate)
  155. #define _weakref_ddel _table(_sharedstate->_weakref_default_delegate)
  156. #ifdef SQUNICODE //rsl REAL STRING LEN
  157. #define rsl(l) ((l)<<1)
  158. #else
  159. #define rsl(l) (l)
  160. #endif
  161. //extern SQObjectPtr _null_;
  162. bool CompileTypemask(SQIntVec &res,const SQChar *typemask);
  163. #endif //_SQSTATE_H_