2
0

sqstate.h 4.9 KB

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