Back to home page

Enduro/X

 
 

    


0001 /*  see copyright notice in pscript.h */
0002 #ifndef _PSSTATE_H_
0003 #define _PSSTATE_H_
0004 
0005 #include "psutils.h"
0006 #include "psobject.h"
0007 struct PSString;
0008 struct PSTable;
0009 //max number of character for a printed number

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 //_PSSTATE_H_