1 /* see copyright notice in squirrel.h */
5 struct SQFunctionProto;
7 struct SQClosure : public CHAINABLE_OBJ
10 SQClosure(SQSharedState *ss,SQFunctionProto *func){_uiRef=0;_function=func; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
12 static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func){
13 SQClosure *nc=(SQClosure*)SQ_MALLOC(sizeof(SQClosure));
14 new (nc) SQClosure(ss,func);
18 sq_delete(this,SQClosure);
22 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
24 bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
25 bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read);
26 #ifndef NO_GARBAGE_COLLECTOR
27 void Mark(SQCollectable **chain);
28 void Finalize(){_outervalues.resize(0); }
30 SQObjectPtr _function;
31 SQObjectPtrVec _outervalues;
33 //////////////////////////////////////////////
34 struct SQGenerator : public CHAINABLE_OBJ
36 enum SQGeneratorState{eRunning,eSuspended,eDead};
38 SQGenerator(SQSharedState *ss,SQClosure *closure){_uiRef=0;_closure=closure;_state=eRunning;_ci._generator=_null_;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
40 static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
41 SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
42 new (nc) SQGenerator(ss,closure);
47 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
54 sq_delete(this,SQGenerator);
57 bool Resume(SQVM *v,int target);
58 #ifndef NO_GARBAGE_COLLECTOR
59 void Mark(SQCollectable **chain);
60 void Finalize(){_stack.resize(0);_closure=_null_;}
63 SQObjectPtrVec _stack;
64 SQObjectPtrVec _vargsstack;
66 ExceptionsTraps _etraps;
67 SQGeneratorState _state;
70 struct SQNativeClosure : public CHAINABLE_OBJ
73 SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_uiRef=0;_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
75 static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)
77 SQNativeClosure *nc=(SQNativeClosure*)SQ_MALLOC(sizeof(SQNativeClosure));
78 new (nc) SQNativeClosure(ss,func);
83 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
86 sq_delete(this,SQNativeClosure);
88 #ifndef NO_GARBAGE_COLLECTOR
89 void Mark(SQCollectable **chain);
90 void Finalize(){_outervalues.resize(0);}
94 SQObjectPtrVec _outervalues;
101 #endif //_SQCLOSURE_H_