| 305 | } |
| 306 | |
| 307 | void RecursiveStream::cleanupLevel(Request* request, Impure* impure) const |
| 308 | { |
| 309 | Impure* const saveImpure = request->getImpure<Impure>(m_saveOffset); |
| 310 | |
| 311 | delete[] impure->irsb_data; |
| 312 | |
| 313 | UCHAR* const tmp = impure->irsb_stack; |
| 314 | memcpy(saveImpure, tmp, m_saveSize); |
| 315 | |
| 316 | const UCHAR* p = tmp + m_saveSize; |
| 317 | |
| 318 | for (FB_SIZE_T i = 0; i < m_innerStreams.getCount(); i++) |
| 319 | { |
| 320 | const StreamType stream = m_innerStreams[i]; |
| 321 | record_param* const rpb = &request->req_rpb[stream]; |
| 322 | Record* const tempRecord = rpb->rpb_record; |
| 323 | memmove(rpb, p, sizeof(record_param)); |
| 324 | p += sizeof(record_param); |
| 325 | |
| 326 | // We just restored record of current recursion level, delete record |
| 327 | // from upper level. It may be optimized in the future if needed. |
| 328 | delete tempRecord; |
| 329 | } |
| 330 | |
| 331 | delete[] tmp; |
| 332 | } |