0001
0002 #ifndef _PSSTATE_H_
0003 #define _PSSTATE_H_
0004
0005 #include "psutils.h"
0006 #include "psobject.h"
0007 struct PSString;
0008 struct PSTable;
0009
0010 #define NUMBER_MAX_CHAR 50
0011
0012 struct PSStringTable
0013 {
0014 PSStringTable(PSSharedState*ss);
0015 ~PSStringTable();
0016 PSString *Add(const PSChar *,PSInteger len);
0017 void Remove(PSString *);
0018 private:
0019 void Resize(PSInteger size);
0020 void AllocNodes(PSInteger size);
0021 PSString **_strings;
0022 PSUnsignedInteger _numofslots;
0023 PSUnsignedInteger _slotused;
0024 PSSharedState *_sharedstate;
0025 };
0026
0027 struct RefTable {
0028 struct RefNode {
0029 PSObjectPtr obj;
0030 PSUnsignedInteger refs;
0031 struct RefNode *next;
0032 };
0033 RefTable();
0034 ~RefTable();
0035 void AddRef(PSObject &obj);
0036 PSBool Release(PSObject &obj);
0037 PSUnsignedInteger GetRefCount(PSObject &obj);
0038 #ifndef NO_GARBAGE_COLLECTOR
0039 void Mark(PSCollectable **chain);
0040 #endif
0041 void Finalize();
0042 private:
0043 RefNode *Get(PSObject &obj,PSHash &mainpos,RefNode **prev,bool add);
0044 RefNode *Add(PSHash mainpos,PSObject &obj);
0045 void Resize(PSUnsignedInteger size);
0046 void AllocNodes(PSUnsignedInteger size);
0047 PSUnsignedInteger _numofslots;
0048 PSUnsignedInteger _slotused;
0049 RefNode *_nodes;
0050 RefNode *_freelist;
0051 RefNode **_buckets;
0052 };
0053
0054 #define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)
0055 #define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)
0056
0057 struct PSObjectPtr;
0058
0059 struct PSSharedState
0060 {
0061 PSSharedState();
0062 ~PSSharedState();
0063 void Init();
0064 public:
0065 PSChar* GetScratchPad(PSInteger size);
0066 PSInteger GetMetaMethodIdxByName(const PSObjectPtr &name);
0067 #ifndef NO_GARBAGE_COLLECTOR
0068 PSInteger CollectGarbage(PSVM *vm);
0069 void RunMark(PSVM *vm,PSCollectable **tchain);
0070 PSInteger ResurrectUnreachable(PSVM *vm);
0071 static void MarkObject(PSObjectPtr &o,PSCollectable **chain);
0072 #endif
0073 PSObjectPtrVec *_metamethods;
0074 PSObjectPtr _metamethodsmap;
0075 PSObjectPtrVec *_systemstrings;
0076 PSObjectPtrVec *_types;
0077 PSStringTable *_stringtable;
0078 RefTable _refs_table;
0079 PSObjectPtr _registry;
0080 PSObjectPtr _consts;
0081 PSObjectPtr _constructoridx;
0082 #ifndef NO_GARBAGE_COLLECTOR
0083 PSCollectable *_gc_chain;
0084 #endif
0085 PSObjectPtr _root_vm;
0086 PSObjectPtr _table_default_delegate;
0087 static const PSRegFunction _table_default_delegate_funcz[];
0088 PSObjectPtr _array_default_delegate;
0089 static const PSRegFunction _array_default_delegate_funcz[];
0090 PSObjectPtr _string_default_delegate;
0091 static const PSRegFunction _string_default_delegate_funcz[];
0092 PSObjectPtr _number_default_delegate;
0093 static const PSRegFunction _number_default_delegate_funcz[];
0094 PSObjectPtr _generator_default_delegate;
0095 static const PSRegFunction _generator_default_delegate_funcz[];
0096 PSObjectPtr _closure_default_delegate;
0097 static const PSRegFunction _closure_default_delegate_funcz[];
0098 PSObjectPtr _thread_default_delegate;
0099 static const PSRegFunction _thread_default_delegate_funcz[];
0100 PSObjectPtr _class_default_delegate;
0101 static const PSRegFunction _class_default_delegate_funcz[];
0102 PSObjectPtr _instance_default_delegate;
0103 static const PSRegFunction _instance_default_delegate_funcz[];
0104 PSObjectPtr _weakref_default_delegate;
0105 static const PSRegFunction _weakref_default_delegate_funcz[];
0106
0107 PSCOMPILERERROR _compilererrorhandler;
0108 PSPRINTFUNCTION _printfunc;
0109 PSPRINTFUNCTION _errorfunc;
0110 bool _debuginfo;
0111 bool _notifyallexceptions;
0112 PSUserPointer _foreignptr;
0113 PSRELEASEHOOK _releasehook;
0114 private:
0115 PSChar *_scratchpad;
0116 PSInteger _scratchpadsize;
0117 };
0118
0119 #define _sp(s) (_sharedstate->GetScratchPad(s))
0120 #define _spval (_sharedstate->GetScratchPad(-1))
0121
0122 #define _table_ddel _table(_sharedstate->_table_default_delegate)
0123 #define _array_ddel _table(_sharedstate->_array_default_delegate)
0124 #define _string_ddel _table(_sharedstate->_string_default_delegate)
0125 #define _number_ddel _table(_sharedstate->_number_default_delegate)
0126 #define _generator_ddel _table(_sharedstate->_generator_default_delegate)
0127 #define _closure_ddel _table(_sharedstate->_closure_default_delegate)
0128 #define _thread_ddel _table(_sharedstate->_thread_default_delegate)
0129 #define _class_ddel _table(_sharedstate->_class_default_delegate)
0130 #define _instance_ddel _table(_sharedstate->_instance_default_delegate)
0131 #define _weakref_ddel _table(_sharedstate->_weakref_default_delegate)
0132
0133 bool CompileTypemask(PSIntVec &res,const PSChar *typemask);
0134
0135
0136 #endif