X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=gui%2Ftraceloader.cpp;h=77e8750e2a5cfd5eb61462aef782eaca502b284e;hb=3176ebeffe825a5f998b13755c09cfa312b0e8d3;hp=b6eba6a0247af29645d54b4f76c20b67f255336c;hpb=ac92a2115ab3c759add836e115f108c945e0195b;p=apitrace diff --git a/gui/traceloader.cpp b/gui/traceloader.cpp index b6eba6a..77e8750 100644 --- a/gui/traceloader.cpp +++ b/gui/traceloader.cpp @@ -1,5 +1,6 @@ #include "traceloader.h" +#include "apitrace.h" #include #include @@ -53,30 +54,50 @@ void TraceLoader::loadTrace(const QString &filename) emit finishedParsing(); } -void TraceLoader::loadFrame(int frameIdx) +void TraceLoader::loadFrame(ApiTraceFrame *currentFrame) { if (m_parser.supportsOffsets()) { + unsigned frameIdx = currentFrame->number; int numOfCalls = numberOfCallsInFrame(frameIdx); + if (numOfCalls) { + quint64 binaryDataSize = 0; + QVector calls(numOfCalls); const FrameOffset &frameOffset = m_frameOffsets[frameIdx]; - std::vector calls(numOfCalls); + m_parser.setCurrentOffset(frameOffset.start); m_parser.setCurrentCallNumber(frameOffset.callNumber); Trace::Call *call; int parsedCalls = 0; while ((call = m_parser.parse_call())) { + ApiTraceCall *apiCall = + apiCallFromTraceCall(call, m_helpHash, + currentFrame, this); + calls[parsedCalls] = apiCall; + Q_ASSERT(calls[parsedCalls]); + if (apiCall->hasBinaryData()) { + QByteArray data = + apiCall->arguments()[ + apiCall->binaryDataIndex()].toByteArray(); + binaryDataSize += data.size(); + } - calls[parsedCalls] = call; ++parsedCalls; - if (isCallAFrameMarker(call)) { + delete call; + + if (ApiTrace::isCallAFrameMarker(apiCall, m_frameMarker)) { break; } } assert(parsedCalls == numOfCalls); - // emit parsedFrame(); + Q_ASSERT(parsedCalls == calls.size()); + Q_ASSERT(parsedCalls == currentFrame->numChildrenToLoad()); + calls.squeeze(); + currentFrame->setCalls(calls, binaryDataSize); + emit frameLoaded(currentFrame); } } } @@ -183,12 +204,11 @@ void TraceLoader::scanTrace() callNum = m_parser.currentCallNumber(); numOfCalls = 0; } - //call->dump(std::cout, color); delete call; } if (numOfCalls) { - // Trace::File::Offset endOffset = m_parser.currentOffset(); + //Trace::File::Offset endOffset = m_parser.currentOffset(); FrameOffset frameOffset(startOffset); frameOffset.numberOfCalls = numOfCalls; frameOffset.callNumber = callNum;