Merged changes from branches/supertux-milestone2-grumbel/ to trunk/supertux/
[supertux.git] / external / squirrel / squirrel / sqclosure.h
1 /*      see copyright notice in squirrel.h */
2 #ifndef _SQCLOSURE_H_
3 #define _SQCLOSURE_H_
4
5 struct SQFunctionProto;
6
7 struct SQClosure : public CHAINABLE_OBJ
8 {
9 private:
10         SQClosure(SQSharedState *ss,SQFunctionProto *func){_function=func; INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
11 public:
12         static SQClosure *Create(SQSharedState *ss,SQFunctionProto *func){
13                 SQClosure *nc=(SQClosure*)SQ_MALLOC(sizeof(SQClosure));
14                 new (nc) SQClosure(ss,func);
15                 return nc;
16         }
17         void Release(){
18                 sq_delete(this,SQClosure);
19         }
20         SQClosure *Clone()
21         {
22                 SQClosure * ret = SQClosure::Create(_opt_ss(this),_funcproto(_function));
23                 ret->_env = _env;
24                 ret->_outervalues.copy(_outervalues);
25                 ret->_defaultparams.copy(_defaultparams);
26                 return ret;
27         }
28         ~SQClosure()
29         {
30                 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
31         }
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); }
37 #endif
38         SQObjectPtr _env;
39         SQObjectPtr _function;
40         SQObjectPtrVec _outervalues;
41         SQObjectPtrVec _defaultparams;
42 };
43 //////////////////////////////////////////////
44 struct SQGenerator : public CHAINABLE_OBJ 
45 {
46         enum SQGeneratorState{eRunning,eSuspended,eDead};
47 private:
48         SQGenerator(SQSharedState *ss,SQClosure *closure){_closure=closure;_state=eRunning;_ci._generator=NULL;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}
49 public:
50         static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){
51                 SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));
52                 new (nc) SQGenerator(ss,closure);
53                 return nc;
54         }
55         ~SQGenerator()
56         {
57                 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
58         }
59     void Kill(){
60                 _state=eDead;
61                 _stack.resize(0);
62                 _closure=_null_;}
63         void Release(){
64                 sq_delete(this,SQGenerator);
65         }
66         bool Yield(SQVM *v);
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_;}
71 #endif
72         SQObjectPtr _closure;
73         SQObjectPtrVec _stack;
74         SQObjectPtrVec _vargsstack;
75         SQVM::CallInfo _ci;
76         ExceptionsTraps _etraps;
77         SQGeneratorState _state;
78 };
79
80 struct SQNativeClosure : public CHAINABLE_OBJ
81 {
82 private:
83         SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);        }
84 public:
85         static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)
86         {
87                 SQNativeClosure *nc=(SQNativeClosure*)SQ_MALLOC(sizeof(SQNativeClosure));
88                 new (nc) SQNativeClosure(ss,func);
89                 return nc;
90         }
91         SQNativeClosure *Clone()
92         {
93                 SQNativeClosure * ret = SQNativeClosure::Create(_opt_ss(this),_function);
94                 ret->_env = _env;
95                 ret->_name = _name;
96                 ret->_outervalues.copy(_outervalues);
97                 ret->_typecheck.copy(_typecheck);
98                 ret->_nparamscheck = _nparamscheck;
99                 return ret;
100         }
101         ~SQNativeClosure()
102         {
103                 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);
104         }
105         void Release(){
106                 sq_delete(this,SQNativeClosure);
107         }
108 #ifndef NO_GARBAGE_COLLECTOR
109         void Mark(SQCollectable **chain);
110         void Finalize(){_outervalues.resize(0);}
111 #endif
112         SQInteger _nparamscheck;
113         SQIntVec _typecheck;
114         SQObjectPtrVec _outervalues;
115         SQObjectPtr _env;
116         SQFUNCTION _function;
117         SQObjectPtr _name;
118 };
119
120
121
122 #endif //_SQCLOSURE_H_