struct SQClosure : public CHAINABLE_OBJ
{
private:
- SQClosure(SQSharedState *ss,SQFunctionProto *func){_uiRef=0;_function=func; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
+ SQClosure(SQSharedState *ss,SQFunctionProto *func){_function=func; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
public:
static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func){
SQClosure *nc=(SQClosure*)SQ_MALLOC(sizeof(SQClosure));
void Release(){
sq_delete(this,SQClosure);
}
+ SQClosure *Clone()
+ {
+ SQClosure * ret = SQClosure::Create(_opt_ss(this),_funcproto(_function));
+ ret->_env = _env;
+ ret->_outervalues.copy(_outervalues);
+ return ret;
+ }
~SQClosure()
{
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
void Mark(SQCollectable **chain);
void Finalize(){_outervalues.resize(0); }
#endif
+ SQObjectPtr _env;
SQObjectPtr _function;
SQObjectPtrVec _outervalues;
};
//////////////////////////////////////////////
-struct SQGenerator : public CHAINABLE_OBJ
+struct SQGenerator : public CHAINABLE_OBJ
{
enum SQGeneratorState{eRunning,eSuspended,eDead};
private:
- SQGenerator(SQSharedState *ss,SQClosure *closure){_uiRef=0;_closure=closure;_state=eRunning;_ci._generator=_null_;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
+ SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=_null_;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
public:
static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
sq_delete(this,SQGenerator);
}
bool Yield(SQVM *v);
- bool Resume(SQVM *v,int target);
+ bool Resume(SQVM *v,SQInteger target);
#ifndef NO_GARBAGE_COLLECTOR
void Mark(SQCollectable **chain);
void Finalize(){_stack.resize(0);_closure=_null_;}
struct SQNativeClosure : public CHAINABLE_OBJ
{
private:
- SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_uiRef=0;_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
+ SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this); }
public:
static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)
{
new (nc) SQNativeClosure(ss,func);
return nc;
}
+ SQNativeClosure *Clone()
+ {
+ SQNativeClosure * ret = SQNativeClosure::Create(_opt_ss(this),_function);
+ ret->_env = _env;
+ ret->_name = _name;
+ ret->_outervalues.copy(_outervalues);
+ ret->_typecheck = _typecheck;
+ ret->_nparamscheck = _nparamscheck;
+ return ret;
+ }
~SQNativeClosure()
{
REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
void Mark(SQCollectable **chain);
void Finalize(){_outervalues.resize(0);}
#endif
+ SQObjectPtr _env;
SQFUNCTION _function;
SQObjectPtr _name;
SQObjectPtrVec _outervalues;
SQIntVec _typecheck;
- int _nparamscheck;
+ SQInteger _nparamscheck;
};