| 781 | } |
| 782 | |
| 783 | bool JKRExpHeap::check() |
| 784 | { |
| 785 | lock(); |
| 786 | int totalBytes = 0; |
| 787 | bool ok = true; |
| 788 | for (CMemBlock *block = mHeadUsedList; block; block = block->mNext) |
| 789 | { |
| 790 | if (!block->isValid()) |
| 791 | { |
| 792 | ok = false; |
| 793 | JUTWarningConsole_f(":::addr %08x: bad heap signature. (%c%c)\n", block, JSUHiByte(block->mUsageHeader), |
| 794 | JSULoByte(block->mUsageHeader)); |
| 795 | } |
| 796 | if (block->mNext) |
| 797 | { |
| 798 | if (!block->mNext->isValid()) |
| 799 | { |
| 800 | ok = false; |
| 801 | JUTWarningConsole_f(":::addr %08x: bad next pointer (%08x)\nabort\n", block, block->mNext); |
| 802 | break; |
| 803 | } |
| 804 | if (block->mNext->mPrev != block) |
| 805 | { |
| 806 | ok = false; |
| 807 | JUTWarningConsole_f(":::addr %08x: bad previous pointer (%08x)\n", block->mNext, block->mNext->mPrev); |
| 808 | } |
| 809 | } |
| 810 | else |
| 811 | { |
| 812 | if (mTailUsedList != block) |
| 813 | { |
| 814 | ok = false; |
| 815 | JUTWarningConsole_f(":::addr %08x: bad used list(REV) (%08x)\n", block, mTailUsedList); |
| 816 | } |
| 817 | } |
| 818 | totalBytes += sizeof(CMemBlock) + block->mAllocatedSpace + block->getAlignment(); |
| 819 | } |
| 820 | for (CMemBlock *block = mHead; block; block = block->mNext) |
| 821 | { |
| 822 | totalBytes += block->mAllocatedSpace + sizeof(CMemBlock); |
| 823 | if (block->mNext) |
| 824 | { |
| 825 | if (block->mNext->mPrev != block) |
| 826 | { |
| 827 | ok = false; |
| 828 | JUTWarningConsole_f(":::addr %08x: bad previous pointer (%08x)\n", block->mNext, block->mNext->mPrev); |
| 829 | } |
| 830 | if ((u32)block + block->mAllocatedSpace + sizeof(CMemBlock) > (u32)block->mNext) |
| 831 | { |
| 832 | ok = false; |
| 833 | JUTWarningConsole_f(":::addr %08x: bad block size (%08x)\n", block, block->mAllocatedSpace); |
| 834 | } |
| 835 | } |
| 836 | else |
| 837 | { |
| 838 | if (mTail != block) |
| 839 | { |
| 840 | ok = false; |
nothing calls this directly
no test coverage detected