Explorar el Código

Changes to make class static field members be read/write.

mingodad hace 13 años
padre
commit
57f380a2df
Se han modificado 3 ficheros con 81 adiciones y 6 borrados
  1. 49 0
      samples/test-class-static.nut
  2. 28 5
      squirrel/sqclass.h
  3. 4 1
      squirrel/sqvm.cpp

+ 49 - 0
samples/test-class-static.nut

@@ -0,0 +1,49 @@
+class AClass {
+	static count = 0;
+	count2 = null;
+	constructor(){
+		++count;
+		count2 = 0;
+	}
+	
+	function recurse(k){
+		print(k);
+		if(k=="recurse") recurse("Hello Again !");
+	}
+}
+
+function AClass::Inc(){
+	++count2;
+	++AClass.count;
+}
+
+function AClass::Inc2(){
+	++count2;
+	++count;
+}
+
+function AClass::Inc3(){
+	++count;
+}
+
+local a = AClass();
+print(a.count);
+
+a.recurse("dad");
+a.recurse("recurse");
+
+for(local i=0; i < 10; ++i){
+	local c = AClass();
+	++AClass.count;
+	AClass.Inc3();
+	c.Inc();
+	c.Inc2();
+	print(c.count);
+}
+
+print(AClass.count);
+AClass.count = 3;
+print(a.count);
+AClass.count++;
+print(AClass.count);
+

+ 28 - 5
squirrel/sqclass.h

@@ -33,7 +33,7 @@ public:
 	~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(_members->Get(key,val)) {
 			if(_isfield(val)) {
 				SQObjectPtr &o = _defaultvalues[_member_idx(val)].val;
 				val = _realval(o);
@@ -48,6 +48,23 @@ public:
 	bool Exists(const SQObjectPtr &key) {
 		return _members->Exists(key);
 	}
+	bool Set(const SQObjectPtr &key,const SQObjectPtr &val) {
+		SQObjectPtr idx;
+		if(_members->Get(key,idx) && !_isfield(idx)) {
+            //if(_isfield(idx)) _members->Set(key, val);
+            //else
+            return Set(idx, val);
+		}
+		return false;
+	}
+    bool Set(SQObjectPtr &idx, const SQObjectPtr &val){
+        SQClassMember &m = _methods[_member_idx(idx)];
+        if(!(type(m.val) == OT_CLOSURE || type(m.val) == OT_NATIVECLOSURE)){
+            m.val = val;
+            return true;
+        }
+        return false;
+    }
 	bool GetConstructor(SQObjectPtr &ctor)
 	{
 		if(_constructoridx != -1) {
@@ -115,7 +132,7 @@ public:
 	~SQInstance();
 	bool Get(const SQObjectPtr &key,SQObjectPtr &val)  {
 		if(_class->_members->Get(key,val)) {
-			if(_isfield(val)) {
+			if(_isfield(val)) {
 				SQObjectPtr &o = _values[_member_idx(val)];
 				val = _realval(o);
 			}
@@ -131,9 +148,15 @@ public:
 	}
 	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;
+		if(_class->_members->Get(key,idx)){
+            if(_isfield(idx)) {
+                _values[_member_idx(idx)] = val;
+                return true;
+            }
+            else
+            {
+                return _class->Set(idx, val);
+            }
 		}
 		return false;
 	}

+ 4 - 1
squirrel/sqvm.cpp

@@ -493,7 +493,7 @@ bool SQVM::PLOCAL_INC(SQInteger op,SQObjectPtr &target, SQObjectPtr &a, SQObject
 
 bool SQVM::DerefInc(SQInteger op,SQObjectPtr &target, SQObjectPtr &self, SQObjectPtr &key, SQObjectPtr &incr, bool postfix,SQInteger selfidx)
 {
-	SQObjectPtr tmp, tself = self, tkey = key;
+	SQObjectPtr tmp, tself = self, tkey = key;
 	if (!Get(tself, tkey, tmp, false, selfidx)) { return false; }
 	_RET_ON_FAIL(ARITH_OP( op , target, tmp, incr))
 	if (!Set(tself, tkey, target,selfidx)) { return false; }
@@ -1329,6 +1329,9 @@ bool SQVM::Set(const SQObjectPtr &self,const SQObjectPtr &key,const SQObjectPtr
 	case OT_TABLE:
 		if(_table(self)->Set(key,val)) return true;
 		break;
+	case OT_CLASS:
+		if(_class(self)->Set(key,val)) return true;
+		break;
 	case OT_INSTANCE:
 		if(_instance(self)->Set(key,val)) return true;
 		break;