Made Mr_Tree graphic smaller, from 99 to 85 pixels.
[supertux.git] / src / squirrel / squirrel / sqclass.cpp
index 6bc84db..21d6006 100644 (file)
-/*
-       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) {
-                               SQClassMember m;
-                               m.val = val;
-                               _members->NewSlot(key, SQObjectPtr((SQUserPointer)_methods.size()));
-                               _methods.push_back(m);
-                       }
-                       else {
-                               _methods[_integer(temp)].val = val;
-                       }
-               }
-               return true;
-       }
-       SQClassMember 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[_integer(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[_integer(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