| 152 | static JKRExpHeap::CMemBlock *DBnewUsedBlock; |
| 153 | |
| 154 | void *JKRExpHeap::allocFromHead(u32 size, int align) |
| 155 | { |
| 156 | // TODO: cleaner declares(if possible) |
| 157 | u32 foundOffset; |
| 158 | int foundSize; |
| 159 | CMemBlock *newFreeBlock; |
| 160 | CMemBlock *newUsedBlock; |
| 161 | CMemBlock *foundBlock; |
| 162 | |
| 163 | size = ALIGN_NEXT(size, 4); |
| 164 | foundSize = -1; |
| 165 | foundOffset = 0; |
| 166 | foundBlock = nullptr; |
| 167 | |
| 168 | for (CMemBlock *block = mHead; block; block = block->mNext) |
| 169 | { |
| 170 | u32 offset = ALIGN_PREV(align - 1 + (u32)block->getContent(), align) - (u32)block->getContent(); |
| 171 | if (block->mAllocatedSpace < size + offset) |
| 172 | { |
| 173 | continue; |
| 174 | } |
| 175 | if (foundSize <= (u32)block->mAllocatedSpace) |
| 176 | { |
| 177 | continue; |
| 178 | } |
| 179 | foundSize = block->mAllocatedSpace; |
| 180 | foundBlock = block; |
| 181 | foundOffset = offset; |
| 182 | if (mCurrentAllocMode != 0) |
| 183 | { |
| 184 | break; |
| 185 | } |
| 186 | u32 blockSize = block->mAllocatedSpace; |
| 187 | if (blockSize == size) |
| 188 | { |
| 189 | break; |
| 190 | } |
| 191 | } |
| 192 | DBfoundSize = foundSize; |
| 193 | DBfoundOffset = foundOffset; |
| 194 | DBfoundBlock = foundBlock; |
| 195 | if (foundBlock) |
| 196 | { |
| 197 | if (foundOffset >= sizeof(CMemBlock)) |
| 198 | { |
| 199 | CMemBlock *prev = foundBlock->mPrev; |
| 200 | CMemBlock *next = foundBlock->mNext; |
| 201 | newUsedBlock = foundBlock->allocFore(foundOffset - sizeof(CMemBlock), 0, 0, 0, 0); |
| 202 | |
| 203 | if (newUsedBlock) |
| 204 | { |
| 205 | newFreeBlock = newUsedBlock->allocFore(size, mCurrentGroupID, 0, 0, 0); |
| 206 | } |
| 207 | else |
| 208 | { |
| 209 | newFreeBlock = nullptr; |
| 210 | } |
| 211 | if (newFreeBlock) |
nothing calls this directly
no test coverage detected