-/*\r
- see copyright notice in squirrel.h\r
-*/\r
-#include "sqpcheader.h"\r
-#include "sqvm.h"\r
-#include "sqtable.h"\r
-#include "sqclass.h"\r
-#include "sqclosure.h"\r
-\r
-SQClass::SQClass(SQSharedState *ss,SQClass *base)\r
-{\r
- _uiRef=0;\r
- _base = base;\r
- _typetag = 0;\r
- _metamethods.resize(MT_LAST); //size it to max size\r
- if(_base) {\r
- _defaultvalues.copy(base->_defaultvalues);\r
- _methods.copy(base->_methods);\r
- _metamethods.copy(base->_metamethods);\r
- __ObjAddRef(_base);\r
- }\r
- _members = base?base->_members->Clone() : SQTable::Create(ss,0);\r
- __ObjAddRef(_members);\r
- _locked = false;\r
- INIT_CHAIN();\r
- ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);\r
-}\r
-\r
-void SQClass::Finalize() { \r
- _attributes = _null_;\r
- _defaultvalues.resize(0);\r
- _methods.resize(0);\r
- _metamethods.resize(0);\r
- __ObjRelease(_members);\r
- if(_base) {\r
- __ObjRelease(_base);\r
- }\r
-}\r
-\r
-SQClass::~SQClass()\r
-{\r
- REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);\r
- Finalize();\r
-}\r
-\r
-bool SQClass::NewSlot(const SQObjectPtr &key,const SQObjectPtr &val)\r
-{\r
- SQObjectPtr temp;\r
- if(_locked) \r
- return false; //the slot already exists\r
- if(_members->Get(key,temp) && type(temp) == OT_INTEGER) //overrides the default value\r
- {\r
- _defaultvalues[_integer(temp)].val = val;\r
- return true;\r
- }\r
- if(type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) {\r
- SQInteger mmidx;\r
- if((mmidx = _sharedstate->GetMetaMethodIdxByName(key)) != -1) {\r
- _metamethods[mmidx] = val;\r
- } \r
- else {\r
- if(type(temp) == OT_NULL) {\r
- SQClassMemeber m;\r
- m.val = val;\r
- _members->NewSlot(key,SQObjectPtr((SQUserPointer)_methods.size()));\r
- _methods.push_back(m);\r
- }\r
- else {\r
- _methods[(int)_userpointer(temp)].val = val;\r
- }\r
- }\r
- return true;\r
- }\r
- SQClassMemeber m;\r
- m.val = val;\r
- _members->NewSlot(key,SQObjectPtr((SQInteger)_defaultvalues.size()));\r
- _defaultvalues.push_back(m);\r
- return true;\r
-}\r
-\r
-SQInstance *SQClass::CreateInstance()\r
-{\r
- if(!_locked) Lock();\r
- return SQInstance::Create(_opt_ss(this),this);\r
-}\r
-\r
-int SQClass::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)\r
-{\r
- SQObjectPtr oval;\r
- int idx = _members->Next(refpos,outkey,oval);\r
- if(idx != -1) {\r
- if(type(oval) != OT_INTEGER) {\r
- outval = _methods[(int)_userpointer(oval)].val;\r
- }\r
- else {\r
- outval = _defaultvalues[_integer(oval)].val;\r
- }\r
- }\r
- return idx;\r
-}\r
-\r
-bool SQClass::SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val)\r
-{\r
- SQObjectPtr idx;\r
- if(_members->Get(key,idx)) {\r
- if(type(idx) == OT_INTEGER)\r
- _defaultvalues[_integer(idx)].attrs = val;\r
- else\r
- _methods[(int)_userpointer(idx)].attrs = val;\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-bool SQClass::GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval)\r
-{\r
- SQObjectPtr idx;\r
- if(_members->Get(key,idx)) {\r
- outval = (type(idx) == OT_INTEGER?_defaultvalues[_integer(idx)].attrs:_methods[(int)_userpointer(idx)].attrs);\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-///////////////////////////////////////////////////////////////////////\r
-void SQInstance::Init(SQSharedState *ss)\r
-{\r
- _uiRef = 0;\r
- _userpointer = NULL;\r
- _hook = NULL;\r
- __ObjAddRef(_class);\r
- _delegate = _class->_members;\r
- INIT_CHAIN();\r
- ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);\r
-}\r
-\r
-SQInstance::SQInstance(SQSharedState *ss, SQClass *c)\r
-{\r
- _class = c;\r
- _values.resize(_class->_defaultvalues.size());\r
- for(unsigned int i = 0; i < _class->_defaultvalues.size(); i++) {\r
- _values[i] = _class->_defaultvalues[i].val;\r
- }\r
- Init(ss);\r
-}\r
-\r
-SQInstance::SQInstance(SQSharedState *ss, SQInstance *i)\r
-{\r
- _class = i->_class;\r
- _values.copy(i->_values);\r
- Init(ss);\r
-}\r
-\r
-void SQInstance::Finalize() \r
-{\r
- __ObjRelease(_class);\r
- _values.resize(0);\r
-}\r
-\r
-SQInstance::~SQInstance()\r
-{\r
- REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);\r
- Finalize();\r
-}\r
-\r
-bool SQInstance::GetMetaMethod(SQMetaMethod mm,SQObjectPtr &res)\r
-{\r
- if(type(_class->_metamethods[mm]) != OT_NULL) {\r
- res = _class->_metamethods[mm];\r
- return true;\r
- }\r
- return false;\r
-}\r
-\r
-bool SQInstance::InstanceOf(SQClass *trg)\r
-{\r
- SQClass *parent = _class;\r
- while(parent != NULL) {\r
- if(parent == trg)\r
- return true;\r
- parent = parent->_base;\r
- }\r
- return false;\r
-}\r
+/*
+ see copyright notice in squirrel.h
+*/
+#include "sqpcheader.h"
+#include "sqvm.h"
+#include "sqtable.h"
+#include "sqclass.h"
+#include "sqclosure.h"
+
+SQClass::SQClass(SQSharedState *ss,SQClass *base)
+{
+ _uiRef=0;
+ _base = base;
+ _typetag = 0;
+ _metamethods.resize(MT_LAST); //size it to max size
+ if(_base) {
+ _defaultvalues.copy(base->_defaultvalues);
+ _methods.copy(base->_methods);
+ _metamethods.copy(base->_metamethods);
+ __ObjAddRef(_base);
+ }
+ _members = base?base->_members->Clone() : SQTable::Create(ss,0);
+ __ObjAddRef(_members);
+ _locked = false;
+ INIT_CHAIN();
+ ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
+}
+
+void SQClass::Finalize() {
+ _attributes = _null_;
+ _defaultvalues.resize(0);
+ _methods.resize(0);
+ _metamethods.resize(0);
+ __ObjRelease(_members);
+ if(_base) {
+ __ObjRelease(_base);
+ }
+}
+
+SQClass::~SQClass()
+{
+ REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
+ Finalize();
+}
+
+bool SQClass::NewSlot(const SQObjectPtr &key,const SQObjectPtr &val)
+{
+ SQObjectPtr temp;
+ if(_locked)
+ return false; //the slot already exists
+ if(_members->Get(key,temp) && type(temp) == OT_INTEGER) //overrides the default value
+ {
+ _defaultvalues[_integer(temp)].val = val;
+ return true;
+ }
+ if(type(val) == OT_CLOSURE || type(val) == OT_NATIVECLOSURE) {
+ SQInteger mmidx;
+ if((mmidx = _sharedstate->GetMetaMethodIdxByName(key)) != -1) {
+ _metamethods[mmidx] = val;
+ }
+ else {
+ if(type(temp) == OT_NULL) {
+ SQClassMemeber m;
+ m.val = val;
+ _members->NewSlot(key,SQObjectPtr((SQUserPointer)_methods.size()));
+ _methods.push_back(m);
+ }
+ else {
+ _methods[(int)_userpointer(temp)].val = val;
+ }
+ }
+ return true;
+ }
+ SQClassMemeber m;
+ m.val = val;
+ _members->NewSlot(key,SQObjectPtr((SQInteger)_defaultvalues.size()));
+ _defaultvalues.push_back(m);
+ return true;
+}
+
+SQInstance *SQClass::CreateInstance()
+{
+ if(!_locked) Lock();
+ return SQInstance::Create(_opt_ss(this),this);
+}
+
+int SQClass::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)
+{
+ SQObjectPtr oval;
+ int idx = _members->Next(refpos,outkey,oval);
+ if(idx != -1) {
+ if(type(oval) != OT_INTEGER) {
+ outval = _methods[(int)_userpointer(oval)].val;
+ }
+ else {
+ outval = _defaultvalues[_integer(oval)].val;
+ }
+ }
+ return idx;
+}
+
+bool SQClass::SetAttributes(const SQObjectPtr &key,const SQObjectPtr &val)
+{
+ SQObjectPtr idx;
+ if(_members->Get(key,idx)) {
+ if(type(idx) == OT_INTEGER)
+ _defaultvalues[_integer(idx)].attrs = val;
+ else
+ _methods[(int)_userpointer(idx)].attrs = val;
+ return true;
+ }
+ return false;
+}
+
+bool SQClass::GetAttributes(const SQObjectPtr &key,SQObjectPtr &outval)
+{
+ SQObjectPtr idx;
+ if(_members->Get(key,idx)) {
+ outval = (type(idx) == OT_INTEGER?_defaultvalues[_integer(idx)].attrs:_methods[(int)_userpointer(idx)].attrs);
+ return true;
+ }
+ return false;
+}
+
+///////////////////////////////////////////////////////////////////////
+void SQInstance::Init(SQSharedState *ss)
+{
+ _uiRef = 0;
+ _userpointer = NULL;
+ _hook = NULL;
+ __ObjAddRef(_class);
+ _delegate = _class->_members;
+ INIT_CHAIN();
+ ADD_TO_CHAIN(&_sharedstate->_gc_chain, this);
+}
+
+SQInstance::SQInstance(SQSharedState *ss, SQClass *c)
+{
+ _class = c;
+ _values.resize(_class->_defaultvalues.size());
+ for(unsigned int i = 0; i < _class->_defaultvalues.size(); i++) {
+ _values[i] = _class->_defaultvalues[i].val;
+ }
+ Init(ss);
+}
+
+SQInstance::SQInstance(SQSharedState *ss, SQInstance *i)
+{
+ _class = i->_class;
+ _values.copy(i->_values);
+ Init(ss);
+}
+
+void SQInstance::Finalize()
+{
+ __ObjRelease(_class);
+ _values.resize(0);
+}
+
+SQInstance::~SQInstance()
+{
+ REMOVE_FROM_CHAIN(&_sharedstate->_gc_chain, this);
+ Finalize();
+}
+
+bool SQInstance::GetMetaMethod(SQMetaMethod mm,SQObjectPtr &res)
+{
+ if(type(_class->_metamethods[mm]) != OT_NULL) {
+ res = _class->_metamethods[mm];
+ return true;
+ }
+ return false;
+}
+
+bool SQInstance::InstanceOf(SQClass *trg)
+{
+ SQClass *parent = _class;
+ while(parent != NULL) {
+ if(parent == trg)
+ return true;
+ parent = parent->_base;
+ }
+ return false;
+}