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 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
24 bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
\r
25 bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read);
\r
26 #ifndef NO_GARBAGE_COLLECTOR
\r
27 void Mark(SQCollectable **chain);
\r
28 void Finalize(){_outervalues.resize(0); }
\r
30 SQObjectPtr _function;
\r
31 SQObjectPtrVec _outervalues;
\r
33 //////////////////////////////////////////////
\r
34 struct SQGenerator : public CHAINABLE_OBJ
\r
36 enum SQGeneratorState{eRunning,eSuspended,eDead};
\r
38 SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=_null_;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
\r
40 static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
\r
41 SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
\r
42 new (nc) SQGenerator(ss,closure);
\r
47 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
54 sq_delete(this,SQGenerator);
\r
56 bool Yield(SQVM *v);
\r
57 bool Resume(SQVM *v,SQInteger target);
\r
58 #ifndef NO_GARBAGE_COLLECTOR
\r
59 void Mark(SQCollectable **chain);
\r
60 void Finalize(){_stack.resize(0);_closure=_null_;}
\r
62 SQObjectPtr _closure;
\r
63 SQObjectPtrVec _stack;
\r
64 SQObjectPtrVec _vargsstack;
\r
66 ExceptionsTraps _etraps;
\r
67 SQGeneratorState _state;
\r
70 struct SQNativeClosure : public CHAINABLE_OBJ
\r
73 SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
\r
75 static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)
\r
77 SQNativeClosure *nc=(SQNativeClosure*)SQ_MALLOC(sizeof(SQNativeClosure));
\r
78 new (nc) SQNativeClosure(ss,func);
\r
83 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
86 sq_delete(this,SQNativeClosure);
\r
88 #ifndef NO_GARBAGE_COLLECTOR
\r
89 void Mark(SQCollectable **chain);
\r
90 void Finalize(){_outervalues.resize(0);}
\r
92 SQFUNCTION _function;
\r
94 SQObjectPtrVec _outervalues;
\r
95 SQIntVec _typecheck;
\r
96 SQInteger _nparamscheck;
\r
101 #endif //_SQCLOSURE_H_
\r