fix cr/lfs and remove trailing whitespaces...
[supertux.git] / src / squirrel / squirrel / sqclosure.h
index 1ce8d10..d8dc90a 100644 (file)
@@ -7,7 +7,7 @@ struct SQFunctionProto;
 struct SQClosure : public CHAINABLE_OBJ
 {
 private:
-       SQClosure(SQSharedState *ss,SQFunctionProto *func){_uiRef=0;_function=func; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
+       SQClosure(SQSharedState *ss,SQFunctionProto *func){_function=func; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
 public:
        static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func){
                SQClosure *nc=(SQClosure*)SQ_MALLOC(sizeof(SQClosure));
@@ -17,6 +17,13 @@ public:
        void Release(){
                sq_delete(this,SQClosure);
        }
+       SQClosure *Clone()
+       {
+               SQClosure * ret = SQClosure::Create(_opt_ss(this),_funcproto(_function));
+               ret->_env = _env;
+               ret->_outervalues.copy(_outervalues);
+               return ret;
+       }
        ~SQClosure()
        {
                REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
@@ -27,15 +34,16 @@ public:
        void Mark(SQCollectable **chain);
        void Finalize(){_outervalues.resize(0); }
 #endif
+       SQObjectPtr _env;
        SQObjectPtr _function;
        SQObjectPtrVec _outervalues;
 };
 //////////////////////////////////////////////
-struct SQGenerator : public CHAINABLE_OBJ 
+struct SQGenerator : public CHAINABLE_OBJ
 {
        enum SQGeneratorState{eRunning,eSuspended,eDead};
 private:
-       SQGenerator(SQSharedState *ss,SQClosure *closure){_uiRef=0;_closure=closure;_state=eRunning;_ci._generator=_null_;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
+       SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=_null_;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
 public:
        static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
                SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
@@ -54,7 +62,7 @@ public:
                sq_delete(this,SQGenerator);
        }
        bool Yield(SQVM *v);
-       bool Resume(SQVM *v,int target);
+       bool Resume(SQVM *v,SQInteger target);
 #ifndef NO_GARBAGE_COLLECTOR
        void Mark(SQCollectable **chain);
        void Finalize(){_stack.resize(0);_closure=_null_;}
@@ -70,7 +78,7 @@ public:
 struct SQNativeClosure : public CHAINABLE_OBJ
 {
 private:
-       SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_uiRef=0;_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);       }
+       SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);        }
 public:
        static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)
        {
@@ -78,6 +86,16 @@ public:
                new (nc) SQNativeClosure(ss,func);
                return nc;
        }
+       SQNativeClosure *Clone()
+       {
+               SQNativeClosure * ret = SQNativeClosure::Create(_opt_ss(this),_function);
+               ret->_env = _env;
+               ret->_name = _name;
+               ret->_outervalues.copy(_outervalues);
+               ret->_typecheck = _typecheck;
+               ret->_nparamscheck = _nparamscheck;
+               return ret;
+       }
        ~SQNativeClosure()
        {
                REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
@@ -89,11 +107,12 @@ public:
        void Mark(SQCollectable **chain);
        void Finalize(){_outervalues.resize(0);}
 #endif
+       SQObjectPtr _env;
        SQFUNCTION _function;
        SQObjectPtr _name;
        SQObjectPtrVec _outervalues;
        SQIntVec _typecheck;
-       int _nparamscheck;
+       SQInteger _nparamscheck;
 };