| 158 | } |
| 159 | |
| 160 | void VMScriptFunction::Alloc(int numops, int numkonstd, int numkonstf, int numkonsts, int numkonsta, int numlinenumbers) |
| 161 | { |
| 162 | assert(Code == NULL); |
| 163 | assert(numops > 0); |
| 164 | assert(numkonstd >= 0 && numkonstd <= 65535); |
| 165 | assert(numkonstf >= 0 && numkonstf <= 65535); |
| 166 | assert(numkonsts >= 0 && numkonsts <= 65535); |
| 167 | assert(numkonsta >= 0 && numkonsta <= 65535); |
| 168 | assert(numlinenumbers >= 0 && numlinenumbers <= 65535); |
| 169 | void *mem = ClassDataAllocator.Alloc(numops * sizeof(VMOP) + |
| 170 | numkonstd * sizeof(int) + |
| 171 | numkonstf * sizeof(double) + |
| 172 | numkonsts * sizeof(FString) + |
| 173 | numkonsta * sizeof(FVoidObj) + |
| 174 | numlinenumbers * sizeof(FStatementInfo)); |
| 175 | Code = (VMOP *)mem; |
| 176 | mem = (void *)((VMOP *)mem + numops); |
| 177 | |
| 178 | if (numlinenumbers > 0) |
| 179 | { |
| 180 | LineInfo = (FStatementInfo*)mem; |
| 181 | LineInfoCount = numlinenumbers; |
| 182 | mem = LineInfo + numlinenumbers; |
| 183 | } |
| 184 | else |
| 185 | { |
| 186 | LineInfo = nullptr; |
| 187 | LineInfoCount = 0; |
| 188 | } |
| 189 | if (numkonstd > 0) |
| 190 | { |
| 191 | KonstD = (int *)mem; |
| 192 | mem = (void *)((int *)mem + numkonstd); |
| 193 | } |
| 194 | else |
| 195 | { |
| 196 | KonstD = NULL; |
| 197 | } |
| 198 | if (numkonstf > 0) |
| 199 | { |
| 200 | KonstF = (double *)mem; |
| 201 | mem = (void *)((double *)mem + numkonstf); |
| 202 | } |
| 203 | else |
| 204 | { |
| 205 | KonstF = NULL; |
| 206 | } |
| 207 | if (numkonsts > 0) |
| 208 | { |
| 209 | KonstS = (FString *)mem; |
| 210 | for (int i = 0; i < numkonsts; ++i) |
| 211 | { |
| 212 | ::new(&KonstS[i]) FString; |
| 213 | } |
| 214 | mem = (void *)((FString *)mem + numkonsts); |
| 215 | } |
| 216 | else |
| 217 | { |
no test coverage detected