1 /* see copyright notice in squirrel.h */
\r
2 #ifndef _SQFUNCTION_H_
\r
3 #define _SQFUNCTION_H_
\r
5 #include "sqopcodes.h"
\r
16 SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t)
\r
22 SQOuterVar(const SQOuterVar &ov)
\r
33 struct SQLocalVarInfo
\r
35 SQLocalVarInfo():_start_op(0),_end_op(0),_pos(0){}
\r
36 SQLocalVarInfo(const SQLocalVarInfo &lvi)
\r
39 _start_op=lvi._start_op;
\r
40 _end_op=lvi._end_op;
\r
44 SQUnsignedInteger _start_op;
\r
45 SQUnsignedInteger _end_op;
\r
46 SQUnsignedInteger _pos;
\r
49 struct SQLineInfo { SQInteger _line;SQInteger _op; };
\r
51 typedef sqvector<SQOuterVar> SQOuterVarVec;
\r
52 typedef sqvector<SQLocalVarInfo> SQLocalVarInfoVec;
\r
53 typedef sqvector<SQLineInfo> SQLineInfoVec;
\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
62 struct SQFunctionProto : public CHAINABLE_OBJ
\r
65 SQFunctionProto(SQSharedState *ss);
\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
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
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
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
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
123 SQObjectPtr _sourcename;
\r
125 SQInteger _stacksize;
\r
127 SQInteger _varparams;
\r
129 SQInteger _nlocalvarinfos;
\r
130 SQLocalVarInfo *_localvarinfos;
\r
132 SQInteger _nlineinfos;
\r
133 SQLineInfo *_lineinfos;
\r
135 SQInteger _nliterals;
\r
136 SQObjectPtr *_literals;
\r
138 SQInteger _nparameters;
\r
139 SQObjectPtr *_parameters;
\r
141 SQInteger _nfunctions;
\r
142 SQObjectPtr *_functions;
\r
144 SQInteger _noutervalues;
\r
145 SQOuterVar *_outervalues;
\r
147 SQInteger _ndefaultparams;
\r
148 SQInteger *_defaultparams;
\r
150 SQInteger _ninstructions;
\r
151 SQInstruction _instructions[1];
\r
154 #endif //_SQFUNCTION_H_
\r