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