Merged changes from branches/supertux-milestone2-grumbel/ to trunk/supertux/
[supertux.git] / external / squirrel / squirrel / sqfuncproto.h
1 /*      see copyright notice in squirrel.h */
2 #ifndef _SQFUNCTION_H_
3 #define _SQFUNCTION_H_
4
5 #include "sqopcodes.h"
6
7 enum SQOuterType {
8         otLOCAL = 0,
9         otSYMBOL = 1,
10         otOUTER = 2
11 };
12
13 struct SQOuterVar
14 {
15         
16         SQOuterVar(){}
17         SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t)
18         {
19                 _name = name;
20                 _src=src;
21                 _type=t;
22         }
23         SQOuterVar(const SQOuterVar &ov)
24         {
25                 _type=ov._type;
26                 _src=ov._src;
27                 _name=ov._name;
28         }
29         SQOuterType _type;
30         SQObjectPtr _name;
31         SQObjectPtr _src;
32 };
33
34 struct SQLocalVarInfo
35 {
36         SQLocalVarInfo():_start_op(0),_end_op(0){}
37         SQLocalVarInfo(const SQLocalVarInfo &lvi)
38         {
39                 _name=lvi._name;
40                 _start_op=lvi._start_op;
41                 _end_op=lvi._end_op;
42                 _pos=lvi._pos;
43         }
44         SQObjectPtr _name;
45         SQUnsignedInteger _start_op;
46         SQUnsignedInteger _end_op;
47         SQUnsignedInteger _pos;
48 };
49
50 struct SQLineInfo { SQInteger _line;SQInteger _op; };
51
52 typedef sqvector<SQOuterVar> SQOuterVarVec;
53 typedef sqvector<SQLocalVarInfo> SQLocalVarInfoVec;
54 typedef sqvector<SQLineInfo> SQLineInfoVec;
55
56 #define _FUNC_SIZE(ni,nl,nparams,nfuncs,nouters,nlineinf,localinf,defparams) (sizeof(SQFunctionProto) \
57                 +((ni-1)*sizeof(SQInstruction))+(nl*sizeof(SQObjectPtr)) \
58                 +(nparams*sizeof(SQObjectPtr))+(nfuncs*sizeof(SQObjectPtr)) \
59                 +(nouters*sizeof(SQOuterVar))+(nlineinf*sizeof(SQLineInfo)) \
60                 +(localinf*sizeof(SQLocalVarInfo))+(defparams*sizeof(SQInteger)))
61
62 #define _CONSTRUCT_VECTOR(type,size,ptr) { \
63         for(SQInteger n = 0; n < size; n++) { \
64                         new (&ptr[n]) type(); \
65                 } \
66 }
67
68 #define _DESTRUCT_VECTOR(type,size,ptr) { \
69         for(SQInteger nl = 0; nl < size; nl++) { \
70                         ptr[nl].~type(); \
71         } \
72 }
73 struct SQFunctionProto : public SQRefCounted
74 {
75 private:
76         SQFunctionProto(){
77         _stacksize=0;
78         _bgenerator=false;}
79 public:
80         static SQFunctionProto *Create(SQInteger ninstructions,
81                 SQInteger nliterals,SQInteger nparameters,
82                 SQInteger nfunctions,SQInteger noutervalues,
83                 SQInteger nlineinfos,SQInteger nlocalvarinfos,SQInteger ndefaultparams)
84         {
85                 SQFunctionProto *f;
86                 //I compact the whole class and members in a single memory allocation
87                 f = (SQFunctionProto *)sq_vm_malloc(_FUNC_SIZE(ninstructions,nliterals,nparameters,nfunctions,noutervalues,nlineinfos,nlocalvarinfos,ndefaultparams));
88                 new (f) SQFunctionProto;
89                 f->_ninstructions = ninstructions;
90                 f->_literals = (SQObjectPtr*)&f->_instructions[ninstructions];
91                 f->_nliterals = nliterals;
92                 f->_parameters = (SQObjectPtr*)&f->_literals[nliterals];
93                 f->_nparameters = nparameters;
94                 f->_functions = (SQObjectPtr*)&f->_parameters[nparameters];
95                 f->_nfunctions = nfunctions;
96                 f->_outervalues = (SQOuterVar*)&f->_functions[nfunctions];
97                 f->_noutervalues = noutervalues;
98                 f->_lineinfos = (SQLineInfo *)&f->_outervalues[noutervalues];
99                 f->_nlineinfos = nlineinfos;
100                 f->_localvarinfos = (SQLocalVarInfo *)&f->_lineinfos[nlineinfos];
101                 f->_nlocalvarinfos = nlocalvarinfos;
102                 f->_defaultparams = (SQInteger *)&f->_localvarinfos[nlocalvarinfos];
103                 f->_ndefaultparams = ndefaultparams;
104
105                 _CONSTRUCT_VECTOR(SQObjectPtr,f->_nliterals,f->_literals);
106                 _CONSTRUCT_VECTOR(SQObjectPtr,f->_nparameters,f->_parameters);
107                 _CONSTRUCT_VECTOR(SQObjectPtr,f->_nfunctions,f->_functions);
108                 _CONSTRUCT_VECTOR(SQOuterVar,f->_noutervalues,f->_outervalues);
109                 //_CONSTRUCT_VECTOR(SQLineInfo,f->_nlineinfos,f->_lineinfos); //not required are 2 integers
110                 _CONSTRUCT_VECTOR(SQLocalVarInfo,f->_nlocalvarinfos,f->_localvarinfos);
111                 return f;
112         }
113         void Release(){ 
114                 _DESTRUCT_VECTOR(SQObjectPtr,_nliterals,_literals);
115                 _DESTRUCT_VECTOR(SQObjectPtr,_nparameters,_parameters);
116                 _DESTRUCT_VECTOR(SQObjectPtr,_nfunctions,_functions);
117                 _DESTRUCT_VECTOR(SQOuterVar,_noutervalues,_outervalues);
118                 //_DESTRUCT_VECTOR(SQLineInfo,_nlineinfos,_lineinfos); //not required are 2 integers
119                 _DESTRUCT_VECTOR(SQLocalVarInfo,_nlocalvarinfos,_localvarinfos);
120                 SQInteger size = _FUNC_SIZE(_ninstructions,_nliterals,_nparameters,_nfunctions,_noutervalues,_nlineinfos,_nlocalvarinfos,_ndefaultparams);
121                 this->~SQFunctionProto();
122                 sq_vm_free(this,size);
123         }
124         const SQChar* GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop);
125         SQInteger GetLine(SQInstruction *curr);
126         bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
127         static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret);
128
129         SQObjectPtr _sourcename;
130         SQObjectPtr _name;
131     SQInteger _stacksize;
132         bool _bgenerator;
133         bool _varparams;
134
135         SQInteger _nlocalvarinfos;
136         SQLocalVarInfo *_localvarinfos;
137
138         SQInteger _nlineinfos;
139         SQLineInfo *_lineinfos;
140
141         SQInteger _nliterals;
142         SQObjectPtr *_literals;
143
144         SQInteger _nparameters;
145         SQObjectPtr *_parameters;
146         
147         SQInteger _nfunctions;
148         SQObjectPtr *_functions;
149
150         SQInteger _noutervalues;
151         SQOuterVar *_outervalues;
152
153         SQInteger _ndefaultparams;
154         SQInteger *_defaultparams;
155         
156         SQInteger _ninstructions;
157         SQInstruction _instructions[1];
158 };
159
160 #endif //_SQFUNCTION_H_