1 /* see copyright notice in squirrel.h */
17 SQOuterVar(const SQObjectPtr &name,const SQObjectPtr &src,SQOuterType t)
23 SQOuterVar(const SQOuterVar &ov)
36 SQLocalVarInfo():_start_op(0),_end_op(0){}
37 SQLocalVarInfo(const SQLocalVarInfo &lvi)
40 _start_op=lvi._start_op;
45 SQUnsignedInteger _start_op;
46 SQUnsignedInteger _end_op;
47 SQUnsignedInteger _pos;
50 struct SQLineInfo { SQInteger _line;SQInteger _op; };
52 typedef sqvector<SQOuterVar> SQOuterVarVec;
53 typedef sqvector<SQLocalVarInfo> SQLocalVarInfoVec;
54 typedef sqvector<SQLineInfo> SQLineInfoVec;
56 #define _FUNC_SIZE(ni,nl,nparams,nfuncs,nouters,nlineinf,localinf) (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)))
62 #define _CONSTRUCT_VECTOR(type,size,ptr) { \
63 for(SQInteger n = 0; n < size; n++) { \
64 new (&ptr[n]) type(); \
68 #define _DESTRUCT_VECTOR(type,size,ptr) { \
69 for(SQInteger nl = 0; nl < size; nl++) { \
73 struct SQFunctionProto : public SQRefCounted
80 static SQFunctionProto *Create(SQInteger ninstructions,
81 SQInteger nliterals,SQInteger nparameters,
82 SQInteger nfunctions,SQInteger noutervalues,
83 SQInteger nlineinfos,SQInteger nlocalvarinfos)
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));
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;
103 _CONSTRUCT_VECTOR(SQObjectPtr,f->_nliterals,f->_literals);
104 _CONSTRUCT_VECTOR(SQObjectPtr,f->_nparameters,f->_parameters);
105 _CONSTRUCT_VECTOR(SQObjectPtr,f->_nfunctions,f->_functions);
106 _CONSTRUCT_VECTOR(SQOuterVar,f->_noutervalues,f->_outervalues);
107 //_CONSTRUCT_VECTOR(SQLineInfo,f->_nlineinfos,f->_lineinfos); //not required are 2 integers
108 _CONSTRUCT_VECTOR(SQLocalVarInfo,f->_nlocalvarinfos,f->_localvarinfos);
112 _DESTRUCT_VECTOR(SQObjectPtr,_nliterals,_literals);
113 _DESTRUCT_VECTOR(SQObjectPtr,_nparameters,_parameters);
114 _DESTRUCT_VECTOR(SQObjectPtr,_nfunctions,_functions);
115 _DESTRUCT_VECTOR(SQOuterVar,_noutervalues,_outervalues);
116 //_DESTRUCT_VECTOR(SQLineInfo,_nlineinfos,_lineinfos); //not required are 2 integers
117 _DESTRUCT_VECTOR(SQLocalVarInfo,_nlocalvarinfos,_localvarinfos);
118 SQInteger size = _FUNC_SIZE(_ninstructions,_nliterals,_nparameters,_nfunctions,_noutervalues,_nlineinfos,_nlocalvarinfos);
119 this->~SQFunctionProto();
120 sq_vm_free(this,size);
122 const SQChar* GetLocal(SQVM *v,SQUnsignedInteger stackbase,SQUnsignedInteger nseq,SQUnsignedInteger nop);
123 SQInteger GetLine(SQInstruction *curr);
124 bool Save(SQVM *v,SQUserPointer up,SQWRITEFUNC write);
125 static bool Load(SQVM *v,SQUserPointer up,SQREADFUNC read,SQObjectPtr &ret);
127 SQObjectPtr _sourcename;
129 SQInteger _stacksize;
133 SQInteger _nlocalvarinfos;
134 SQLocalVarInfo *_localvarinfos;
136 SQInteger _nlineinfos;
137 SQLineInfo *_lineinfos;
139 SQInteger _nliterals;
140 SQObjectPtr *_literals;
142 SQInteger _nparameters;
143 SQObjectPtr *_parameters;
145 SQInteger _nfunctions;
146 SQObjectPtr *_functions;
148 SQInteger _noutervalues;
149 SQOuterVar *_outervalues;
151 SQInteger _ninstructions;
152 SQInstruction _instructions[1];
155 #endif //_SQFUNCTION_H_