-/* see copyright notice in squirrel.h */\r
-#ifndef _SQCLASS_H_\r
-#define _SQCLASS_H_\r
-\r
-struct SQInstance;\r
-\r
-struct SQClassMemeber {\r
- SQClassMemeber(){}\r
- SQClassMemeber(const SQClassMemeber &o) {\r
- val = o.val;\r
- attrs = o.attrs;\r
- }\r
- SQObjectPtr val;\r
- SQObjectPtr attrs;\r
-};\r
-\r
-typedef sqvector<SQClassMemeber> SQClassMemeberVec;\r
-\r
-#define MEMBER_TYPE_METHOD 0x01000000\r
-#define MEMBER_TYPE_FIELD 0x02000000\r
-\r
-#define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD)\r
-#define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD)\r
-#define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i))\r
-#define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i))\r
-#define _member_type(o) (_integer(o)&0xFF000000)\r
-#define _member_idx(o) (_integer(o)&0x00FFFFFF)\r
-\r
-struct SQClass : public CHAINABLE_OBJ\r
-{\r
- SQClass(SQSharedState *ss,SQClass *base);\r
-public:\r
- static SQClass* Create(SQSharedState *ss,SQClass *base) {\r
- SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass));\r
- new (newclass) SQClass(ss, base);\r
- return newclass;\r
- }\r
- ~SQClass();\r
- bool NewSlot(SQSharedState *ss, const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic);\r
- bool Get(const SQObjectPtr &key,SQObjectPtr &val) {\r
- if(_members->Get(key,val)) {\r
- if(_isfield(val)) {\r
- SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;\r
- val = _realval(o);\r
- }\r
- else {\r
- val = _methods[_member_idx(val)].val;\r
- }\r
- return true;\r
- }\r
- return false;\r
- }\r
- bool SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val);\r
- bool GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval);\r
- void Lock() { _locked = true; if(_base) _base->Lock(); }\r
- void Release() { \r
- if (_hook) { _hook(_typetag,0);}\r
- sq_delete(this, SQClass); \r
- }\r
- void Finalize();\r
-#ifndef NO_GARBAGE_COLLECTOR\r
- void Mark(SQCollectable ** );\r
-#endif\r
- SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);\r
- SQInstance *CreateInstance();\r
- SQTable *_members;\r
- SQClass *_base;\r
- SQClassMemeberVec _defaultvalues;\r
- SQClassMemeberVec _methods;\r
- SQObjectPtrVec _metamethods;\r
- SQObjectPtr _attributes;\r
- SQUserPointer _typetag;\r
- SQRELEASEHOOK _hook;\r
- bool _locked;\r
-};\r
-\r
-#define calcinstancesize(_theclass_) \\r
- (sizeof(SQInstance)+(sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0)))\r
-struct SQInstance : public SQDelegable \r
-{\r
- void Init(SQSharedState *ss);\r
- SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);\r
- SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);\r
-public:\r
- static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {\r
- \r
- SQInteger size = calcinstancesize(theclass);\r
- SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);\r
- new (newinst) SQInstance(ss, theclass,size);\r
- return newinst;\r
- }\r
- SQInstance *Clone(SQSharedState *ss)\r
- {\r
- SQInteger size = calcinstancesize(_class);\r
- SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);\r
- new (newinst) SQInstance(ss, this,size);\r
- return newinst;\r
- }\r
- ~SQInstance();\r
- bool Get(const SQObjectPtr &key,SQObjectPtr &val) {\r
- if(_class->_members->Get(key,val)) {\r
- if(_isfield(val)) {\r
- SQObjectPtr &o = _values[_member_idx(val)];\r
- val = _realval(o);\r
- }\r
- else {\r
- val = _class->_methods[_member_idx(val)].val;\r
- }\r
- return true;\r
- }\r
- return false;\r
- }\r
- bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {\r
- SQObjectPtr idx;\r
- if(_class->_members->Get(key,idx) && _isfield(idx)) {\r
- _values[_member_idx(idx)] = val;\r
- return true;\r
- }\r
- return false;\r
- }\r
- void Release() { \r
- if (_hook) { _hook(_userpointer,0);}\r
- SQInteger size = _memsize;\r
- this->~SQInstance();\r
- SQ_FREE(this, size);\r
- }\r
- void Finalize();\r
-#ifndef NO_GARBAGE_COLLECTOR \r
- void Mark(SQCollectable ** );\r
-#endif\r
- bool InstanceOf(SQClass *trg);\r
- bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);\r
-\r
- SQClass *_class;\r
- SQUserPointer _userpointer;\r
- SQRELEASEHOOK _hook;\r
- SQUnsignedInteger _nvalues;\r
- SQInteger _memsize;\r
- SQObjectPtr _values[1];\r
-};\r
-\r
-#endif //_SQCLASS_H_\r
+/* see copyright notice in squirrel.h */
+#ifndef _SQCLASS_H_
+#define _SQCLASS_H_
+
+struct SQInstance;
+
+struct SQClassMemeber {
+ SQClassMemeber(){}
+ SQClassMemeber(const SQClassMemeber &o) {
+ val = o.val;
+ attrs = o.attrs;
+ }
+ SQObjectPtr val;
+ SQObjectPtr attrs;
+};
+
+typedef sqvector<SQClassMemeber> SQClassMemeberVec;
+
+#define MEMBER_TYPE_METHOD 0x01000000
+#define MEMBER_TYPE_FIELD 0x02000000
+
+#define _ismethod(o) (_integer(o)&MEMBER_TYPE_METHOD)
+#define _isfield(o) (_integer(o)&MEMBER_TYPE_FIELD)
+#define _make_method_idx(i) ((SQInteger)(MEMBER_TYPE_METHOD|i))
+#define _make_field_idx(i) ((SQInteger)(MEMBER_TYPE_FIELD|i))
+#define _member_type(o) (_integer(o)&0xFF000000)
+#define _member_idx(o) (_integer(o)&0x00FFFFFF)
+
+struct SQClass : public CHAINABLE_OBJ
+{
+ SQClass(SQSharedState *ss,SQClass *base);
+public:
+ static SQClass* Create(SQSharedState *ss,SQClass *base) {
+ SQClass *newclass = (SQClass *)SQ_MALLOC(sizeof(SQClass));
+ new (newclass) SQClass(ss, base);
+ return newclass;
+ }
+ ~SQClass();
+ bool NewSlot(SQSharedState *ss, const SQObjectPtr &key,const SQObjectPtr &val,bool bstatic);
+ bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
+ if(_members->Get(key,val)) {
+ if(_isfield(val)) {
+ SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;
+ val = _realval(o);
+ }
+ else {
+ val = _methods[_member_idx(val)].val;
+ }
+ return true;
+ }
+ return false;
+ }
+ bool SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val);
+ bool GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval);
+ void Lock() { _locked = true; if(_base) _base->Lock(); }
+ void Release() {
+ if (_hook) { _hook(_typetag,0);}
+ sq_delete(this, SQClass);
+ }
+ void Finalize();
+#ifndef NO_GARBAGE_COLLECTOR
+ void Mark(SQCollectable ** );
+#endif
+ SQInteger Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval);
+ SQInstance *CreateInstance();
+ SQTable *_members;
+ SQClass *_base;
+ SQClassMemeberVec _defaultvalues;
+ SQClassMemeberVec _methods;
+ SQObjectPtrVec _metamethods;
+ SQObjectPtr _attributes;
+ SQUserPointer _typetag;
+ SQRELEASEHOOK _hook;
+ bool _locked;
+};
+
+#define calcinstancesize(_theclass_) \
+ (sizeof(SQInstance)+(sizeof(SQObjectPtr)*(_theclass_->_defaultvalues.size()>0?_theclass_->_defaultvalues.size()-1:0)))
+struct SQInstance : public SQDelegable
+{
+ void Init(SQSharedState *ss);
+ SQInstance(SQSharedState *ss, SQClass *c, SQInteger memsize);
+ SQInstance(SQSharedState *ss, SQInstance *c, SQInteger memsize);
+public:
+ static SQInstance* Create(SQSharedState *ss,SQClass *theclass) {
+
+ SQInteger size = calcinstancesize(theclass);
+ SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
+ new (newinst) SQInstance(ss, theclass,size);
+ return newinst;
+ }
+ SQInstance *Clone(SQSharedState *ss)
+ {
+ SQInteger size = calcinstancesize(_class);
+ SQInstance *newinst = (SQInstance *)SQ_MALLOC(size);
+ new (newinst) SQInstance(ss, this,size);
+ return newinst;
+ }
+ ~SQInstance();
+ bool Get(const SQObjectPtr &key,SQObjectPtr &val) {
+ if(_class->_members->Get(key,val)) {
+ if(_isfield(val)) {
+ SQObjectPtr &o = _values[_member_idx(val)];
+ val = _realval(o);
+ }
+ else {
+ val = _class->_methods[_member_idx(val)].val;
+ }
+ return true;
+ }
+ return false;
+ }
+ bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
+ SQObjectPtr idx;
+ if(_class->_members->Get(key,idx) && _isfield(idx)) {
+ _values[_member_idx(idx)] = val;
+ return true;
+ }
+ return false;
+ }
+ void Release() {
+ if (_hook) { _hook(_userpointer,0);}
+ SQInteger size = _memsize;
+ this->~SQInstance();
+ SQ_FREE(this, size);
+ }
+ void Finalize();
+#ifndef NO_GARBAGE_COLLECTOR
+ void Mark(SQCollectable ** );
+#endif
+ bool InstanceOf(SQClass *trg);
+ bool GetMetaMethod(SQVM *v,SQMetaMethod mm,SQObjectPtr &res);
+
+ SQClass *_class;
+ SQUserPointer _userpointer;
+ SQRELEASEHOOK _hook;
+ SQUnsignedInteger _nvalues;
+ SQInteger _memsize;
+ SQObjectPtr _values[1];
+};
+
+#endif //_SQCLASS_H_