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