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