Johan Wikman / SQUIRREL3

Dependents:   Squirrel

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers sqstate.h Source File

sqstate.h

00001 /*  see copyright notice in squirrel.h */
00002 #ifndef _SQSTATE_H_
00003 #define _SQSTATE_H_
00004 
00005 #include "squtils.h"
00006 #include "sqobject.h"
00007 struct SQString;
00008 struct SQTable;
00009 //max number of character for a printed number
00010 #define NUMBER_MAX_CHAR 50
00011 
00012 struct SQStringTable
00013 {
00014     SQStringTable(SQSharedState*ss);
00015     ~SQStringTable();
00016     SQString *Add(const SQChar *,SQInteger len);
00017     void Remove(SQString *);
00018 private:
00019     void Resize(SQInteger size);
00020     void AllocNodes(SQInteger size);
00021     SQString **_strings;
00022     SQUnsignedInteger _numofslots;
00023     SQUnsignedInteger _slotused;
00024     SQSharedState *_sharedstate;
00025 };
00026 
00027 struct RefTable {
00028     struct RefNode {
00029         SQObjectPtr obj;
00030         SQUnsignedInteger refs;
00031         struct RefNode *next;
00032     };
00033     RefTable();
00034     ~RefTable();
00035     void AddRef(SQObject &obj);
00036     SQBool Release(SQObject &obj);
00037     SQUnsignedInteger GetRefCount(SQObject &obj);
00038 #ifndef NO_GARBAGE_COLLECTOR
00039     void Mark(SQCollectable **chain);
00040 #endif
00041     void Finalize();
00042 private:
00043     RefNode *Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add);
00044     RefNode *Add(SQHash mainpos,SQObject &obj);
00045     void Resize(SQUnsignedInteger size);
00046     void AllocNodes(SQUnsignedInteger size);
00047     SQUnsignedInteger _numofslots;
00048     SQUnsignedInteger _slotused;
00049     RefNode *_nodes;
00050     RefNode *_freelist;
00051     RefNode **_buckets;
00052 };
00053 
00054 #define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)
00055 #define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)
00056 
00057 struct SQObjectPtr;
00058 
00059 struct SQSharedState
00060 {
00061     SQSharedState();
00062     ~SQSharedState();
00063     void Init();
00064 public:
00065     SQChar* GetScratchPad(SQInteger size);
00066     SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);
00067 #ifndef NO_GARBAGE_COLLECTOR
00068     SQInteger CollectGarbage(SQVM *vm);
00069     void RunMark(SQVM *vm,SQCollectable **tchain);
00070     SQInteger ResurrectUnreachable(SQVM *vm);
00071     static void MarkObject(SQObjectPtr &o,SQCollectable **chain);
00072 #endif
00073     SQObjectPtrVec *_metamethods;
00074     SQObjectPtr _metamethodsmap;
00075     SQObjectPtrVec *_systemstrings;
00076     SQObjectPtrVec *_types;
00077     SQStringTable *_stringtable;
00078     RefTable _refs_table;
00079     SQObjectPtr _registry;
00080     SQObjectPtr _consts;
00081     SQObjectPtr _constructoridx;
00082 #ifndef NO_GARBAGE_COLLECTOR
00083     SQCollectable *_gc_chain;
00084 #endif
00085     SQObjectPtr _root_vm;
00086     SQObjectPtr _table_default_delegate;
00087     static SQRegFunction _table_default_delegate_funcz[];
00088     SQObjectPtr _array_default_delegate;
00089     static SQRegFunction _array_default_delegate_funcz[];
00090     SQObjectPtr _string_default_delegate;
00091     static SQRegFunction _string_default_delegate_funcz[];
00092     SQObjectPtr _number_default_delegate;
00093     static SQRegFunction _number_default_delegate_funcz[];
00094     SQObjectPtr _generator_default_delegate;
00095     static SQRegFunction _generator_default_delegate_funcz[];
00096     SQObjectPtr _closure_default_delegate;
00097     static SQRegFunction _closure_default_delegate_funcz[];
00098     SQObjectPtr _thread_default_delegate;
00099     static SQRegFunction _thread_default_delegate_funcz[];
00100     SQObjectPtr _class_default_delegate;
00101     static SQRegFunction _class_default_delegate_funcz[];
00102     SQObjectPtr _instance_default_delegate;
00103     static SQRegFunction _instance_default_delegate_funcz[];
00104     SQObjectPtr _weakref_default_delegate;
00105     static SQRegFunction _weakref_default_delegate_funcz[];
00106     
00107     SQCOMPILERERROR _compilererrorhandler;
00108     SQPRINTFUNCTION _printfunc;
00109     SQPRINTFUNCTION _errorfunc;
00110     bool _debuginfo;
00111     bool _notifyallexceptions;
00112 private:
00113     SQChar *_scratchpad;
00114     SQInteger _scratchpadsize;
00115 };
00116 
00117 #define _sp(s) (_sharedstate->GetScratchPad(s))
00118 #define _spval (_sharedstate->GetScratchPad(-1))
00119 
00120 #define _table_ddel     _table(_sharedstate->_table_default_delegate) 
00121 #define _array_ddel     _table(_sharedstate->_array_default_delegate) 
00122 #define _string_ddel    _table(_sharedstate->_string_default_delegate) 
00123 #define _number_ddel    _table(_sharedstate->_number_default_delegate) 
00124 #define _generator_ddel _table(_sharedstate->_generator_default_delegate) 
00125 #define _closure_ddel   _table(_sharedstate->_closure_default_delegate) 
00126 #define _thread_ddel    _table(_sharedstate->_thread_default_delegate) 
00127 #define _class_ddel     _table(_sharedstate->_class_default_delegate) 
00128 #define _instance_ddel  _table(_sharedstate->_instance_default_delegate) 
00129 #define _weakref_ddel   _table(_sharedstate->_weakref_default_delegate) 
00130 
00131 #ifdef SQUNICODE //rsl REAL STRING LEN
00132 #define rsl(l) ((l)<<1)
00133 #else
00134 #define rsl(l) (l)
00135 #endif
00136 
00137 //extern SQObjectPtr _null_;
00138 
00139 bool CompileTypemask(SQIntVec &res,const SQChar *typemask);
00140 
00141 
00142 #endif //_SQSTATE_H_