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
29 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
31 bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
\r
32 bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read);
\r
33 #ifndef NO_GARBAGE_COLLECTOR
\r
34 void Mark(SQCollectable **chain);
\r
35 void Finalize(){_outervalues.resize(0); }
\r
38 SQObjectPtr _function;
\r
39 SQObjectPtrVec _outervalues;
\r
41 //////////////////////////////////////////////
\r
42 struct SQGenerator : public CHAINABLE_OBJ
\r
44 enum SQGeneratorState{eRunning,eSuspended,eDead};
\r
46 SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=_null_;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
\r
48 static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
\r
49 SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
\r
50 new (nc) SQGenerator(ss,closure);
\r
55 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
62 sq_delete(this,SQGenerator);
\r
64 bool Yield(SQVM *v);
\r
65 bool Resume(SQVM *v,SQInteger target);
\r
66 #ifndef NO_GARBAGE_COLLECTOR
\r
67 void Mark(SQCollectable **chain);
\r
68 void Finalize(){_stack.resize(0);_closure=_null_;}
\r
70 SQObjectPtr _closure;
\r
71 SQObjectPtrVec _stack;
\r
72 SQObjectPtrVec _vargsstack;
\r
74 ExceptionsTraps _etraps;
\r
75 SQGeneratorState _state;
\r
78 struct SQNativeClosure : public CHAINABLE_OBJ
\r
81 SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
\r
83 static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)
\r
85 SQNativeClosure *nc=(SQNativeClosure*)SQ_MALLOC(sizeof(SQNativeClosure));
\r
86 new (nc) SQNativeClosure(ss,func);
\r
89 SQNativeClosure *Clone()
\r
91 SQNativeClosure * ret = SQNativeClosure::Create(_opt_ss(this),_function);
\r
94 ret->_outervalues.copy(_outervalues);
\r
95 ret->_typecheck = _typecheck;
\r
96 ret->_nparamscheck = _nparamscheck;
\r
101 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
\r
104 sq_delete(this,SQNativeClosure);
\r
106 #ifndef NO_GARBAGE_COLLECTOR
\r
107 void Mark(SQCollectable **chain);
\r
108 void Finalize(){_outervalues.resize(0);}
\r
111 SQFUNCTION _function;
\r
113 SQObjectPtrVec _outervalues;
\r
114 SQIntVec _typecheck;
\r
115 SQInteger _nparamscheck;
\r
120 #endif //_SQCLOSURE_H_
\r