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