2016-03-22 01:32:03 +01:00
|
|
|
/* see copyright notice in squirrel.h */
|
2015-11-01 09:05:13 +01:00
|
|
|
#ifndef _SQSTATE_H_
|
|
|
|
#define _SQSTATE_H_
|
|
|
|
|
|
|
|
#include "squtils.h"
|
|
|
|
#include "sqobject.h"
|
|
|
|
struct SQString;
|
|
|
|
struct SQTable;
|
|
|
|
//max number of character for a printed number
|
|
|
|
#define NUMBER_MAX_CHAR 50
|
|
|
|
|
|
|
|
struct SQStringTable
|
|
|
|
{
|
2016-03-22 01:32:03 +01:00
|
|
|
SQStringTable(SQSharedState*ss);
|
|
|
|
~SQStringTable();
|
|
|
|
SQString *Add(const SQChar *,SQInteger len);
|
|
|
|
void Remove(SQString *);
|
2015-11-01 09:05:13 +01:00
|
|
|
private:
|
2016-03-22 01:32:03 +01:00
|
|
|
void Resize(SQInteger size);
|
|
|
|
void AllocNodes(SQInteger size);
|
|
|
|
SQString **_strings;
|
|
|
|
SQUnsignedInteger _numofslots;
|
|
|
|
SQUnsignedInteger _slotused;
|
|
|
|
SQSharedState *_sharedstate;
|
2015-11-01 09:05:13 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
struct RefTable {
|
2016-03-22 01:32:03 +01:00
|
|
|
struct RefNode {
|
|
|
|
SQObjectPtr obj;
|
|
|
|
SQUnsignedInteger refs;
|
|
|
|
struct RefNode *next;
|
|
|
|
};
|
|
|
|
RefTable();
|
|
|
|
~RefTable();
|
|
|
|
void AddRef(SQObject &obj);
|
|
|
|
SQBool Release(SQObject &obj);
|
|
|
|
SQUnsignedInteger GetRefCount(SQObject &obj);
|
2015-11-01 09:05:13 +01:00
|
|
|
#ifndef NO_GARBAGE_COLLECTOR
|
2016-03-22 01:32:03 +01:00
|
|
|
void Mark(SQCollectable **chain);
|
2015-11-01 09:05:13 +01:00
|
|
|
#endif
|
2016-03-22 01:32:03 +01:00
|
|
|
void Finalize();
|
2015-11-01 09:05:13 +01:00
|
|
|
private:
|
2016-03-22 01:32:03 +01:00
|
|
|
RefNode *Get(SQObject &obj,SQHash &mainpos,RefNode **prev,bool add);
|
|
|
|
RefNode *Add(SQHash mainpos,SQObject &obj);
|
|
|
|
void Resize(SQUnsignedInteger size);
|
|
|
|
void AllocNodes(SQUnsignedInteger size);
|
|
|
|
SQUnsignedInteger _numofslots;
|
|
|
|
SQUnsignedInteger _slotused;
|
|
|
|
RefNode *_nodes;
|
|
|
|
RefNode *_freelist;
|
|
|
|
RefNode **_buckets;
|
2015-11-01 09:05:13 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#define ADD_STRING(ss,str,len) ss->_stringtable->Add(str,len)
|
|
|
|
#define REMOVE_STRING(ss,bstr) ss->_stringtable->Remove(bstr)
|
|
|
|
|
|
|
|
struct SQObjectPtr;
|
|
|
|
|
|
|
|
struct SQSharedState
|
|
|
|
{
|
2016-03-22 01:32:03 +01:00
|
|
|
SQSharedState();
|
|
|
|
~SQSharedState();
|
|
|
|
void Init();
|
2015-11-01 09:05:13 +01:00
|
|
|
public:
|
2016-03-22 01:32:03 +01:00
|
|
|
SQChar* GetScratchPad(SQInteger size);
|
|
|
|
SQInteger GetMetaMethodIdxByName(const SQObjectPtr &name);
|
2015-11-01 09:05:13 +01:00
|
|
|
#ifndef NO_GARBAGE_COLLECTOR
|
2016-03-22 01:32:03 +01:00
|
|
|
SQInteger CollectGarbage(SQVM *vm);
|
|
|
|
void RunMark(SQVM *vm,SQCollectable **tchain);
|
|
|
|
SQInteger ResurrectUnreachable(SQVM *vm);
|
|
|
|
static void MarkObject(SQObjectPtr &o,SQCollectable **chain);
|
2015-11-01 09:05:13 +01:00
|
|
|
#endif
|
2016-03-22 01:32:03 +01:00
|
|
|
SQObjectPtrVec *_metamethods;
|
|
|
|
SQObjectPtr _metamethodsmap;
|
|
|
|
SQObjectPtrVec *_systemstrings;
|
|
|
|
SQObjectPtrVec *_types;
|
|
|
|
SQStringTable *_stringtable;
|
|
|
|
RefTable _refs_table;
|
|
|
|
SQObjectPtr _registry;
|
|
|
|
SQObjectPtr _consts;
|
|
|
|
SQObjectPtr _constructoridx;
|
2015-11-01 09:05:13 +01:00
|
|
|
#ifndef NO_GARBAGE_COLLECTOR
|
2016-03-22 01:32:03 +01:00
|
|
|
SQCollectable *_gc_chain;
|
2015-11-01 09:05:13 +01:00
|
|
|
#endif
|
2016-03-22 01:32:03 +01:00
|
|
|
SQObjectPtr _root_vm;
|
|
|
|
SQObjectPtr _table_default_delegate;
|
|
|
|
static const SQRegFunction _table_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _array_default_delegate;
|
|
|
|
static const SQRegFunction _array_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _string_default_delegate;
|
|
|
|
static const SQRegFunction _string_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _number_default_delegate;
|
|
|
|
static const SQRegFunction _number_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _generator_default_delegate;
|
|
|
|
static const SQRegFunction _generator_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _closure_default_delegate;
|
|
|
|
static const SQRegFunction _closure_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _thread_default_delegate;
|
|
|
|
static const SQRegFunction _thread_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _class_default_delegate;
|
|
|
|
static const SQRegFunction _class_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _instance_default_delegate;
|
|
|
|
static const SQRegFunction _instance_default_delegate_funcz[];
|
|
|
|
SQObjectPtr _weakref_default_delegate;
|
|
|
|
static const SQRegFunction _weakref_default_delegate_funcz[];
|
|
|
|
|
|
|
|
SQCOMPILERERROR _compilererrorhandler;
|
|
|
|
SQPRINTFUNCTION _printfunc;
|
|
|
|
SQPRINTFUNCTION _errorfunc;
|
|
|
|
bool _debuginfo;
|
|
|
|
bool _notifyallexceptions;
|
|
|
|
SQUserPointer _foreignptr;
|
|
|
|
SQRELEASEHOOK _releasehook;
|
2015-11-01 09:05:13 +01:00
|
|
|
private:
|
2016-03-22 01:32:03 +01:00
|
|
|
SQChar *_scratchpad;
|
|
|
|
SQInteger _scratchpadsize;
|
2015-11-01 09:05:13 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
#define _sp(s) (_sharedstate->GetScratchPad(s))
|
|
|
|
#define _spval (_sharedstate->GetScratchPad(-1))
|
|
|
|
|
2016-03-22 01:32:03 +01:00
|
|
|
#define _table_ddel _table(_sharedstate->_table_default_delegate)
|
|
|
|
#define _array_ddel _table(_sharedstate->_array_default_delegate)
|
|
|
|
#define _string_ddel _table(_sharedstate->_string_default_delegate)
|
|
|
|
#define _number_ddel _table(_sharedstate->_number_default_delegate)
|
|
|
|
#define _generator_ddel _table(_sharedstate->_generator_default_delegate)
|
|
|
|
#define _closure_ddel _table(_sharedstate->_closure_default_delegate)
|
|
|
|
#define _thread_ddel _table(_sharedstate->_thread_default_delegate)
|
|
|
|
#define _class_ddel _table(_sharedstate->_class_default_delegate)
|
|
|
|
#define _instance_ddel _table(_sharedstate->_instance_default_delegate)
|
|
|
|
#define _weakref_ddel _table(_sharedstate->_weakref_default_delegate)
|
2015-11-01 09:05:13 +01:00
|
|
|
|
|
|
|
bool CompileTypemask(SQIntVec &res,const SQChar *typemask);
|
|
|
|
|
|
|
|
|
|
|
|
#endif //_SQSTATE_H_
|