- More work on scripting interface
[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){_uiRef=0;_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()\r
21         {\r
22                 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);\r
23         }\r
24         bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);\r
25         bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read);\r
26 #ifndef NO_GARBAGE_COLLECTOR\r
27         void Mark(SQCollectable **chain);\r
28         void Finalize(){_outervalues.resize(0); }\r
29 #endif\r
30         SQObjectPtr _function;\r
31         SQObjectPtrVec _outervalues;\r
32 };\r
33 //////////////////////////////////////////////\r
34 struct SQGenerator : public CHAINABLE_OBJ \r
35 {\r
36         enum SQGeneratorState{eRunning,eSuspended,eDead};\r
37 private:\r
38         SQGenerator(SQSharedState *ss,SQClosure *closure){_uiRef=0;_closure=closure;_state=eRunning;_ci._generator=_null_;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);}\r
39 public:\r
40         static SQGenerator *Create(SQSharedState *ss,SQClosure *closure){\r
41                 SQGenerator *nc=(SQGenerator*)SQ_MALLOC(sizeof(SQGenerator));\r
42                 new (nc) SQGenerator(ss,closure);\r
43                 return nc;\r
44         }\r
45         ~SQGenerator()\r
46         {\r
47                 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);\r
48         }\r
49     void Kill(){\r
50                 _state=eDead;\r
51                 _stack.resize(0);\r
52                 _closure=_null_;}\r
53         void Release(){\r
54                 sq_delete(this,SQGenerator);\r
55         }\r
56         bool Yield(SQVM *v);\r
57         bool Resume(SQVM *v,int target);\r
58 #ifndef NO_GARBAGE_COLLECTOR\r
59         void Mark(SQCollectable **chain);\r
60         void Finalize(){_stack.resize(0);_closure=_null_;}\r
61 #endif\r
62         SQObjectPtr _closure;\r
63         SQObjectPtrVec _stack;\r
64         SQObjectPtrVec _vargsstack;\r
65         SQVM::CallInfo _ci;\r
66         ExceptionsTraps _etraps;\r
67         SQGeneratorState _state;\r
68 };\r
69 \r
70 struct SQNativeClosure : public CHAINABLE_OBJ\r
71 {\r
72 private:\r
73         SQNativeClosure(SQSharedState *ss,SQFUNCTION func){_uiRef=0;_function=func;INIT_CHAIN();ADD_TO_CHAIN(&_ss(this)->_gc_chain,this);       }\r
74 public:\r
75         static SQNativeClosure *Create(SQSharedState *ss,SQFUNCTION func)\r
76         {\r
77                 SQNativeClosure *nc=(SQNativeClosure*)SQ_MALLOC(sizeof(SQNativeClosure));\r
78                 new (nc) SQNativeClosure(ss,func);\r
79                 return nc;\r
80         }\r
81         ~SQNativeClosure()\r
82         {\r
83                 REMOVE_FROM_CHAIN(&_ss(this)->_gc_chain,this);\r
84         }\r
85         void Release(){\r
86                 sq_delete(this,SQNativeClosure);\r
87         }\r
88 #ifndef NO_GARBAGE_COLLECTOR\r
89         void Mark(SQCollectable **chain);\r
90         void Finalize(){_outervalues.resize(0);}\r
91 #endif\r
92         SQFUNCTION _function;\r
93         SQObjectPtr _name;\r
94         SQObjectPtrVec _outervalues;\r
95         SQIntVec _typecheck;\r
96         int _nparamscheck;\r
97 };\r
98 \r
99 \r
100 \r
101 #endif //_SQCLOSURE_H_\r