]> git.notmuchmail.org Git - apitrace/commitdiff
Share function signatures.
authorZack Rusin <zack@kde.org>
Sun, 28 Aug 2011 04:38:13 +0000 (00:38 -0400)
committerZack Rusin <zack@kde.org>
Sun, 28 Aug 2011 04:38:13 +0000 (00:38 -0400)
reduces memory usage by ~150mb on a 40mb trace.

gui/apitrace.cpp
gui/apitrace.h
gui/apitracecall.cpp
gui/apitracecall.h
gui/loaderthread.cpp
gui/loaderthread.h

index d9a248dbaddc180b121d146a50777aaf55486953..9c99cfabf624b0adcbacb72a8ace9327f9567781 100644 (file)
@@ -156,7 +156,7 @@ void ApiTrace::addFrames(const QList<ApiTraceFrame*> &frames)
     int currentCalls = m_calls.count();
     int numNewCalls = 0;
     foreach(ApiTraceFrame *frame, frames) {
-        frame->setParentTrace(this);
+        Q_ASSERT(this == frame->parentTrace());
         numNewCalls += frame->numChildren();
         m_calls += frame->calls();
     }
@@ -175,8 +175,7 @@ void ApiTrace::detectFrames()
     ApiTraceFrame *currentFrame = 0;
     foreach(ApiTraceCall *apiCall, m_calls) {
         if (!currentFrame) {
-            currentFrame = new ApiTraceFrame();
-            currentFrame->setParentTrace(this);
+            currentFrame = new ApiTraceFrame(this);
             currentFrame->number = m_frames.count();
         }
         apiCall->setParentFrame(currentFrame);
@@ -287,4 +286,14 @@ bool ApiTrace::hasErrors() const
     return !m_errors.isEmpty();
 }
 
+ApiTraceCallSignature * ApiTrace::signature(const QString &callName)
+{
+    return m_signatures[callName];
+}
+
+void ApiTrace::addSignature(ApiTraceCallSignature *signature)
+{
+    m_signatures.insert(signature->name(), signature);
+}
+
 #include "apitrace.moc"
index d52c669928aeac70654bf3c9a48be89fbaa04698..abcdb014ec200b831c05c9cc1982edd07a657a0b 100644 (file)
@@ -33,6 +33,9 @@ public:
 
     ApiTraceState defaultState() const;
 
+    ApiTraceCallSignature *signature(const QString &callName);
+    void addSignature(ApiTraceCallSignature *signature);
+
     QList<ApiTraceCall*> calls() const;
     ApiTraceCall *callAt(int idx) const;
     ApiTraceCall *callWithIndex(int idx) const;
@@ -94,6 +97,7 @@ private:
     bool m_needsSaving;
 
     QSet<ApiTraceCall*> m_errors;
+    QHash<QString, ApiTraceCallSignature*> m_signatures;
 };
 
 #endif
index afc4b356579682e06022677808b2fe455d38d29c..ab358c13390a0cb293c245d1f38c720ff077596a 100644 (file)
@@ -511,6 +511,27 @@ const QList<ApiFramebuffer> & ApiTraceState::framebuffers() const
     return m_framebuffers;
 }
 
+ApiTraceCallSignature::ApiTraceCallSignature(const QString &name,
+                                             const QStringList &argNames)
+    : m_name(name),
+      m_argNames(argNames)
+{
+}
+
+ApiTraceCallSignature::~ApiTraceCallSignature()
+{
+}
+
+QUrl ApiTraceCallSignature::helpUrl() const
+{
+    return m_helpUrl;
+}
+
+void ApiTraceCallSignature::setHelpUrl(const QUrl &url)
+{
+    m_helpUrl = url;
+}
+
 ApiTraceEvent::ApiTraceEvent()
     : m_type(ApiTraceEvent::None),
       m_staticText(0)
@@ -543,27 +564,29 @@ void ApiTraceEvent::setState(const ApiTraceState &state)
     m_state = state;
 }
 
-
-ApiTraceCall::ApiTraceCall()
+ApiTraceCall::ApiTraceCall(ApiTraceFrame *parentFrame, const Trace::Call *call)
     : ApiTraceEvent(ApiTraceEvent::Call),
+      m_parentFrame(parentFrame),
       m_hasBinaryData(false),
       m_binaryDataIndex(0)
 {
-}
+    ApiTrace *trace = parentTrace();
 
+    Q_ASSERT(trace);
 
-ApiTraceCall::ApiTraceCall(const Trace::Call *call)
-    : ApiTraceEvent(ApiTraceEvent::Call),
-      m_hasBinaryData(false),
-      m_binaryDataIndex(0)
-{
-    m_name = QString::fromStdString(call->sig->name);
     m_index = call->no;
 
-    QString argumentsText;
-    for (int i = 0; i < call->sig->num_args; ++i) {
-        m_argNames +=
-            QString::fromStdString(call->sig->arg_names[i]);
+    QString name = QString::fromStdString(call->sig->name);
+    m_signature = trace->signature(name);
+
+    if (!m_signature) {
+        QStringList argNames;
+        for (int i = 0; i < call->sig->num_args; ++i) {
+            argNames +=
+                QString::fromStdString(call->sig->arg_names[i]);
+        }
+        m_signature = new ApiTraceCallSignature(name, argNames);
+        trace->addSignature(m_signature);
     }
     if (call->ret) {
         VariantVisitor retVisitor;
@@ -656,7 +679,7 @@ void ApiTraceCall::revert()
 
 void ApiTraceCall::setHelpUrl(const QUrl &url)
 {
-    m_helpUrl = url;
+    m_signature->setHelpUrl(url);
 }
 
 void ApiTraceCall::setParentFrame(ApiTraceFrame *frame)
@@ -676,12 +699,12 @@ int ApiTraceCall::index() const
 
 QString ApiTraceCall::name() const
 {
-    return m_name;
+    return m_signature->name();
 }
 
 QStringList ApiTraceCall::argNames() const
 {
-    return m_argNames;
+    return m_signature->argNames();
 }
 
 QVariantList ApiTraceCall::arguments() const
@@ -699,7 +722,7 @@ QVariant ApiTraceCall::returnValue() const
 
 QUrl ApiTraceCall::helpUrl() const
 {
-    return m_helpUrl;
+    return m_signature->helpUrl();
 }
 
 bool ApiTraceCall::hasBinaryData() const
@@ -720,8 +743,10 @@ QStaticText ApiTraceCall::staticText() const
     QVariantList argValues = arguments();
 
     QString richText = QString::fromLatin1(
-        "<span style=\"font-weight:bold\">%1</span>(").arg(m_name);
-    for (int i = 0; i < m_argNames.count(); ++i) {
+        "<span style=\"font-weight:bold\">%1</span>(").arg(
+            m_signature->name());
+    QStringList argNames = m_signature->argNames();
+    for (int i = 0; i < argNames.count(); ++i) {
         richText += QLatin1String("<span style=\"color:#0000ff\">");
         QString argText = apiVariantToString(argValues[i]);
 
@@ -739,7 +764,7 @@ QStaticText ApiTraceCall::staticText() const
             richText += argText;
         }
         richText += QLatin1String("</span>");
-        if (i < m_argNames.count() - 1)
+        if (i < argNames.count() - 1)
             richText += QLatin1String(", ");
     }
     richText += QLatin1String(")");
@@ -770,30 +795,32 @@ QString ApiTraceCall::toHtml() const
 
     m_richText = QLatin1String("<div class=\"call\">");
 
-    if (m_helpUrl.isEmpty()) {
+    QUrl helpUrl = m_signature->helpUrl();
+    if (helpUrl.isEmpty()) {
         m_richText += QString::fromLatin1(
             "%1) <span class=\"callName\">%2</span>(")
                       .arg(m_index)
-                      .arg(m_name);
+                      .arg(m_signature->name());
     } else {
         m_richText += QString::fromLatin1(
             "%1) <span class=\"callName\"><a href=\"%2\">%3</a></span>(")
                       .arg(m_index)
-                      .arg(m_helpUrl.toString())
-                      .arg(m_name);
+                      .arg(helpUrl.toString())
+                      .arg(m_signature->name());
     }
 
     QVariantList argValues = arguments();
-    for (int i = 0; i < m_argNames.count(); ++i) {
+    QStringList argNames = m_signature->argNames();
+    for (int i = 0; i < argNames.count(); ++i) {
         m_richText +=
             QLatin1String("<span class=\"arg-name\">") +
-            m_argNames[i] +
+            argNames[i] +
             QLatin1String("</span>") +
             QLatin1Literal(" = ") +
             QLatin1Literal("<span class=\"arg-value\">") +
             apiVariantToString(argValues[i], true) +
             QLatin1Literal("</span>");
-        if (i < m_argNames.count() - 1)
+        if (i < argNames.count() - 1)
             m_richText += QLatin1String(", ");
     }
     m_richText += QLatin1String(")");
@@ -833,12 +860,13 @@ QString ApiTraceCall::searchText() const
         return m_searchText;
 
     QVariantList argValues = arguments();
-    m_searchText = m_name + QLatin1Literal("(");
-    for (int i = 0; i < m_argNames.count(); ++i) {
-        m_searchText += m_argNames[i] +
+    m_searchText = m_signature->name() + QLatin1Literal("(");
+    QStringList argNames = m_signature->argNames();
+    for (int i = 0; i < argNames.count(); ++i) {
+        m_searchText += argNames[i] +
                         QLatin1Literal(" = ") +
                         apiVariantToString(argValues[i]);
-        if (i < m_argNames.count() - 1)
+        if (i < argNames.count() - 1)
             m_searchText += QLatin1String(", ");
     }
     m_searchText += QLatin1String(")");
@@ -856,9 +884,9 @@ int ApiTraceCall::numChildren() const
     return 0;
 }
 
-ApiTraceFrame::ApiTraceFrame()
+ApiTraceFrame::ApiTraceFrame(ApiTrace *parentTrace)
     : ApiTraceEvent(ApiTraceEvent::Frame),
-      m_parentTrace(0),
+      m_parentTrace(parentTrace),
       m_binaryDataSize(0)
 {
 }
@@ -908,11 +936,6 @@ ApiTrace * ApiTraceFrame::parentTrace() const
     return m_parentTrace;
 }
 
-void ApiTraceFrame::setParentTrace(ApiTrace *trace)
-{
-    m_parentTrace = trace;
-}
-
 void ApiTraceFrame::addCall(ApiTraceCall *call)
 {
     m_calls.append(call);
index 4892368b8ba14b44cb5c69a9b61aacfb89996e62..89f310205545f23e62f5713a958104e168efae0a 100644 (file)
@@ -150,6 +150,31 @@ private:
 };
 Q_DECLARE_METATYPE(ApiTraceState);
 
+class ApiTraceCallSignature
+{
+public:
+    ApiTraceCallSignature(const QString &name,
+                          const QStringList &argNames);
+    ~ApiTraceCallSignature();
+
+    QString name() const
+    {
+        return m_name;
+    }
+    QStringList argNames() const
+    {
+        return m_argNames;
+    }
+
+    QUrl helpUrl() const;
+    void setHelpUrl(const QUrl &url);
+
+private:
+    QString m_name;
+    QStringList m_argNames;
+    QUrl m_helpUrl;
+};
+
 class ApiTraceEvent
 {
 public:
@@ -183,8 +208,7 @@ Q_DECLARE_METATYPE(ApiTraceEvent*);
 class ApiTraceCall : public ApiTraceEvent
 {
 public:
-    ApiTraceCall();
-    ApiTraceCall(const Trace::Call *tcall);
+    ApiTraceCall(ApiTraceFrame *parentFrame, const Trace::Call *tcall);
     ~ApiTraceCall();
 
     int index() const;
@@ -218,12 +242,10 @@ public:
     int binaryDataIndex() const;
 private:
     int m_index;
-    QString m_name;
-    QStringList m_argNames;
+    ApiTraceCallSignature *m_signature;
     QVariantList m_argValues;
     QVariant m_returnValue;
     ApiTraceFrame *m_parentFrame;
-    QUrl m_helpUrl;
 
     QVariantList m_editedValues;
 
@@ -239,13 +261,12 @@ Q_DECLARE_METATYPE(ApiTraceCall*);
 class ApiTraceFrame : public ApiTraceEvent
 {
 public:
-    ApiTraceFrame();
+    ApiTraceFrame(ApiTrace *parent);
     int number;
 
     bool isEmpty() const;
 
     ApiTrace *parentTrace() const;
-    void setParentTrace(ApiTrace *trace);
 
     int numChildren() const;
     QStaticText staticText() const;
index de5e3f85ec4d40a3e4144a71b58222a7c9da05c8..054545333b37f5d7e7652d4103815581c4da80eb 100644 (file)
 
 static ApiTraceCall *
 apiCallFromTraceCall(const Trace::Call *call,
-                     const QHash<QString, QUrl> &helpHash)
+                     const QHash<QString, QUrl> &helpHash,
+                     ApiTraceFrame *frame)
 {
-    ApiTraceCall *apiCall = new ApiTraceCall(call);
+    ApiTraceCall *apiCall = new ApiTraceCall(frame, call);
 
     apiCall->setHelpUrl(helpHash.value(apiCall->name()));
 
     return apiCall;
 }
 
-LoaderThread::LoaderThread(QObject *parent)
+LoaderThread::LoaderThread(ApiTrace *parent)
     : QThread(parent),
-      m_frameMarker(ApiTrace::FrameMarker_SwapBuffers)
+      m_frameMarker(ApiTrace::FrameMarker_SwapBuffers),
+      m_trace(parent)
 {
 }
 
@@ -58,13 +60,12 @@ void LoaderThread::run()
         while (call) {
             //std::cout << *call;
             if (!currentFrame) {
-                currentFrame = new ApiTraceFrame();
+                currentFrame = new ApiTraceFrame(m_trace);
                 currentFrame->number = frameCount;
                 ++frameCount;
             }
             ApiTraceCall *apiCall =
-                apiCallFromTraceCall(call, helpHash);
-            apiCall->setParentFrame(currentFrame);
+                apiCallFromTraceCall(call, helpHash, currentFrame);
             currentFrame->addCall(apiCall);
             if (ApiTrace::isCallAFrameMarker(apiCall,
                                              m_frameMarker)) {
index 5073e14fff7e5e2c6802da20a358aca29bb607ac..c847c7315d8ef87781b9642243b92a9a659e78c7 100644 (file)
@@ -12,7 +12,7 @@ class LoaderThread : public QThread
 {
     Q_OBJECT
 public:
-    LoaderThread(QObject *parent=0);
+    LoaderThread(ApiTrace *parent);
 
     ApiTrace::FrameMarker frameMarker() const;
     void setFrameMarker(ApiTrace::FrameMarker marker);
@@ -28,6 +28,7 @@ protected:
 private:
     QString m_fileName;
     ApiTrace::FrameMarker m_frameMarker;
+    ApiTrace *m_trace;
 };
 
 #endif