sqstate.h 4.4 KB

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