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