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