1 /* see copyright notice in squirrel.h */
\r
2 #ifndef _SQFUNCTION_H_
\r
3 #define _SQFUNCTION_H_
\r
5 #include "sqopcodes.h"
\r
17 SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t)
\r
23 SQOuterVar(const SQOuterVar &ov)
\r
34 struct SQLocalVarInfo
\r
36 SQLocalVarInfo():_start_op(0),_end_op(0){}
\r
37 SQLocalVarInfo(const SQLocalVarInfo &lvi)
\r
40 _start_op=lvi._start_op;
\r
41 _end_op=lvi._end_op;
\r
45 SQUnsignedInteger _start_op;
\r
46 SQUnsignedInteger _end_op;
\r
47 SQUnsignedInteger _pos;
\r
50 struct SQLineInfo { SQInteger _line;SQInteger _op; };
\r
52 typedef sqvector<SQOuterVar> SQOuterVarVec;
\r
53 typedef sqvector<SQLocalVarInfo> SQLocalVarInfoVec;
\r
54 typedef sqvector<SQLineInfo> SQLineInfoVec;
\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
62 #define _CONSTRUCT_VECTOR(type,size,ptr) { \
\r
63 for(SQInteger n = 0; n < size; n++) { \
\r
64 new (&ptr[n]) type(); \
\r
68 #define _DESTRUCT_VECTOR(type,size,ptr) { \
\r
69 for(SQInteger nl = 0; nl < size; nl++) { \
\r
73 struct SQFunctionProto : public SQRefCounted
\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
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
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
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
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
129 SQObjectPtr _sourcename;
\r
131 SQInteger _stacksize;
\r
135 SQInteger _nlocalvarinfos;
\r
136 SQLocalVarInfo *_localvarinfos;
\r
138 SQInteger _nlineinfos;
\r
139 SQLineInfo *_lineinfos;
\r
141 SQInteger _nliterals;
\r
142 SQObjectPtr *_literals;
\r
144 SQInteger _nparameters;
\r
145 SQObjectPtr *_parameters;
\r
147 SQInteger _nfunctions;
\r
148 SQObjectPtr *_functions;
\r
150 SQInteger _noutervalues;
\r
151 SQOuterVar *_outervalues;
\r
153 SQInteger _ndefaultparams;
\r
154 SQInteger *_defaultparams;
\r
156 SQInteger _ninstructions;
\r
157 SQInstruction _instructions[1];
\r
160 #endif //_SQFUNCTION_H_
\r