| 725 | } |
| 726 | |
| 727 | bool DebugTarget::GetAutoLocalsInBlock(Array<String>& outLocals, DbgSubprogram* dwSubprogram, DbgBlock* dwBlock, WdStackFrame* stackFrame, DbgLineData* dwLineData) |
| 728 | { |
| 729 | std::function<void(const StringImpl& localName)> _AddLocal = [&](const StringImpl& localName) |
| 730 | { |
| 731 | if (!outLocals.Contains(localName)) |
| 732 | outLocals.Add(localName); |
| 733 | else |
| 734 | _AddLocal(String("@") + localName); |
| 735 | }; |
| 736 | |
| 737 | addr_target pc = stackFrame->GetSourcePC(); |
| 738 | if (dwSubprogram != NULL) |
| 739 | { |
| 740 | auto dwarf = dwSubprogram->mCompileUnit->mDbgModule; |
| 741 | if (dwBlock->mLowPC == -1) |
| 742 | { |
| 743 | //Debug ranges |
| 744 | addr_target* rangeData = (addr_target*)(dwarf->mDebugRangesData + dwBlock->mHighPC); |
| 745 | while (true) |
| 746 | { |
| 747 | addr_target lowPC = *(rangeData++); |
| 748 | if (lowPC == 0) |
| 749 | return false; |
| 750 | addr_target highPC = *(rangeData++); |
| 751 | // Matches? |
| 752 | if ((pc >= lowPC) && (pc < highPC)) |
| 753 | break; |
| 754 | } |
| 755 | } |
| 756 | else if ((pc < dwBlock->mLowPC) || (pc >= dwBlock->mHighPC)) |
| 757 | return false; |
| 758 | } |
| 759 | |
| 760 | for (auto subBlock : dwBlock->mSubBlocks) |
| 761 | { |
| 762 | GetAutoLocalsInBlock(outLocals, dwSubprogram, subBlock, stackFrame, dwLineData); |
| 763 | } |
| 764 | |
| 765 | if (dwBlock == &dwSubprogram->mBlock) |
| 766 | { |
| 767 | for (auto variable : dwSubprogram->mParams) |
| 768 | { |
| 769 | if ((variable->mName != NULL) && |
| 770 | (variable->mName[0] != '$') && |
| 771 | ((variable->mLocationData != NULL) || (variable->mIsConst))) |
| 772 | _AddLocal(variable->mName); |
| 773 | } |
| 774 | } |
| 775 | |
| 776 | for (auto variable : dwBlock->mVariables) |
| 777 | { |
| 778 | if (variable->mRangeStart != 0) |
| 779 | { |
| 780 | auto curPC = stackFrame->GetSourcePC(); |
| 781 | if ((curPC < variable->mRangeStart) || (curPC >= variable->mRangeStart + variable->mRangeLen)) |
| 782 | continue; |
| 783 | } |
| 784 |
no test coverage detected