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
bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read);
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 = _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);}
111
SQFUNCTION _function;
113
SQObjectPtrVec _outervalues;
115
SQInteger _nparamscheck;
120
#endif //_SQCLOSURE_H_