1 /* see copyright notice in squirrel.h */
\r
2 #ifndef _SQCLOSURE_H_
\r
3 #define _SQCLOSURE_H_
\r
5 struct SQFunctionProto;
\r
7 struct SQClosure : public CHAINABLE_OBJ
\r
10 SQClosure(SQSharedState *ss,SQFunctionProto *func){_function=func; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
\r
12 static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func){
\r
13 SQClosure *nc=(SQClosure*)SQ_MALLOC(sizeof(SQClosure));
\r
14 new (nc) SQClosure(ss,func);
\r
18 sq_delete(this,SQClosure);
\r
22 SQClosure * ret = SQClosure::Create(_opt_ss(this),_funcproto(_function));
\r
24 ret->_outervalues.copy(_outervalues);
\r
25 ret->_defaultparams.copy(_defaultparams);
\r
30 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
32 bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
\r
33 static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret);
\r
34 #ifndef NO_GARBAGE_COLLECTOR
\r
35 void Mark(SQCollectable **chain);
\r
36 void Finalize(){_outervalues.resize(0); }
\r
39 SQObjectPtr _function;
\r
40 SQObjectPtrVec _outervalues;
\r
41 SQObjectPtrVec _defaultparams;
\r
43 //////////////////////////////////////////////
\r
44 struct SQGenerator : public CHAINABLE_OBJ
\r
46 enum SQGeneratorState{eRunning,eSuspended,eDead};
\r
48 SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=NULL;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
\r
50 static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
\r
51 SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
\r
52 new (nc) SQGenerator(ss,closure);
\r
57 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
64 sq_delete(this,SQGenerator);
\r
66 bool Yield(SQVM *v);
\r
67 bool Resume(SQVM *v,SQInteger target);
\r
68 #ifndef NO_GARBAGE_COLLECTOR
\r
69 void Mark(SQCollectable **chain);
\r
70 void Finalize(){_stack.resize(0);_closure=_null_;}
\r
72 SQObjectPtr _closure;
\r
73 SQObjectPtrVec _stack;
\r
74 SQObjectPtrVec _vargsstack;
\r
76 ExceptionsTraps _etraps;
\r
77 SQGeneratorState _state;
\r
80 struct SQNativeClosure : public CHAINABLE_OBJ
\r
83 SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
\r
85 static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)
\r
87 SQNativeClosure *nc=(SQNativeClosure*)SQ_MALLOC(sizeof(SQNativeClosure));
\r
88 new (nc) SQNativeClosure(ss,func);
\r
91 SQNativeClosure *Clone()
\r
93 SQNativeClosure * ret = SQNativeClosure::Create(_opt_ss(this),_function);
\r
96 ret->_outervalues.copy(_outervalues);
\r
97 ret->_typecheck.copy(_typecheck);
\r
98 ret->_nparamscheck = _nparamscheck;
\r
103 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
106 sq_delete(this,SQNativeClosure);
\r
108 #ifndef NO_GARBAGE_COLLECTOR
\r
109 void Mark(SQCollectable **chain);
\r
110 void Finalize(){_outervalues.resize(0);}
\r
112 SQInteger _nparamscheck;
\r
113 SQIntVec _typecheck;
\r
114 SQObjectPtrVec _outervalues;
\r
116 SQFUNCTION _function;
\r
122 #endif //_SQCLOSURE_H_
\r