-/*
- 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;
-}
+/*\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
+ _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 class already has an instance so cannot be modified\r
+ if(_members->Get(key,temp) && _isfield(temp)) //overrides the default value\r
+ {\r
+ _defaultvalues[_member_idx(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(_make_method_idx(_methods.size())));\r
+ _methods.push_back(m);\r
+ }\r
+ else {\r
+ _methods[_member_idx(temp)].val = val;\r
+ }\r
+ }\r
+ return true;\r
+ }\r
+ SQClassMemeber m;\r
+ m.val = val;\r
+ _members->NewSlot(key,SQObjectPtr(_make_field_idx(_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
+SQInteger SQClass::Next(const SQObjectPtr &refpos, SQObjectPtr &outkey, SQObjectPtr &outval)\r
+{\r
+ SQObjectPtr oval;\r
+ SQInteger idx = _members->Next(false,refpos,outkey,oval);\r
+ if(idx != -1) {\r
+ if(_ismethod(oval)) {\r
+ outval = _methods[_member_idx(oval)].val;\r
+ }\r
+ else {\r
+ SQObjectPtr &o = _defaultvalues[_member_idx(oval)].val;\r
+ outval = _realval(o);\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(_isfield(idx))\r
+ _defaultvalues[_member_idx(idx)].attrs = val;\r
+ else\r
+ _methods[_member_idx(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 = (_isfield(idx)?_defaultvalues[_member_idx(idx)].attrs:_methods[_member_idx(idx)].attrs);\r
+ return true;\r
+ }\r
+ return false;\r
+}\r
+\r
+///////////////////////////////////////////////////////////////////////\r
+void SQInstance::Init(SQSharedState *ss)\r
+{\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, SQInteger memsize)\r
+{\r
+ _memsize = memsize;\r
+ _class = c;\r
+ _nvalues = _class->_defaultvalues.size();\r
+ for(SQUnsignedInteger n = 0; n < _nvalues; n++) {\r
+ new (&_values[n]) SQObjectPtr(_class->_defaultvalues[n].val);\r
+ }\r
+ Init(ss);\r
+}\r
+\r
+SQInstance::SQInstance(SQSharedState *ss, SQInstance *i, SQInteger memsize)\r
+{\r
+ _memsize = memsize;\r
+ _class = i->_class;\r
+ _nvalues = _class->_defaultvalues.size();\r
+ for(SQUnsignedInteger n = 0; n < _nvalues; n++) {\r
+ new (&_values[n]) SQObjectPtr(i->_values[n]);\r
+ }\r
+ Init(ss);\r
+}\r
+\r
+void SQInstance::Finalize() \r
+{\r
+ __ObjRelease(_class);\r
+ for(SQUnsignedInteger i = 0; i < _nvalues; i++) {\r
+ _values[i] = _null_;\r
+ }\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