Changeset 137892 in webkit


Ignore:
Timestamp:
Dec 17, 2012 3:29:39 AM (11 years ago)
Author:
loislo@chromium.org
Message:

Web Inspector: Native Memory Instrumentation: MemoryInstrumentation doesn't detect reportMemoryUsage method defined in a base class.
https://bugs.webkit.org/show_bug.cgi?id=105026

Reviewed by Yury Semikhatsky.

Old SFINAE test was replaced with new one based on this article:
http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions

Source/WTF:

  • wtf/MemoryInstrumentation.h:

(MemoryInstrumentation):
(yes):
(IsInstrumented):
(no):
(WTF::MemoryInstrumentation::IsInstrumented::BaseMixin::reportMemoryUsage):
(WTF::MemoryInstrumentation::selectInstrumentationMethod):
(InstrumentationSelector):
(WTF):
(WTF::::reportObjectMemoryUsage):

Tools:

New test which covers this problem was added.

  • TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WTF/ChangeLog

    r137742 r137892  
     12012-12-14  Ilya Tikhonovsky  <loislo@chromium.org>
     2
     3        Web Inspector: Native Memory Instrumentation: MemoryInstrumentation doesn't detect reportMemoryUsage method defined in a base class.
     4        https://bugs.webkit.org/show_bug.cgi?id=105026
     5
     6        Reviewed by Yury Semikhatsky.
     7
     8        Old SFINAE test was replaced with new one based on this article:
     9        http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions
     10
     11        * wtf/MemoryInstrumentation.h:
     12        (MemoryInstrumentation):
     13        (yes):
     14        (IsInstrumented):
     15        (no):
     16        (WTF::MemoryInstrumentation::IsInstrumented::BaseMixin::reportMemoryUsage):
     17        (WTF::MemoryInstrumentation::selectInstrumentationMethod):
     18        (InstrumentationSelector):
     19        (WTF):
     20        (WTF::::reportObjectMemoryUsage):
     21
    1222012-12-14  Yury Semikhatsky  <yurys@chromium.org>
    223
  • trunk/Source/WTF/wtf/MemoryInstrumentation.h

    r137742 r137892  
    117117    template<typename T> friend void reportMemoryUsage(const T*, MemoryObjectInfo*);
    118118
    119     template<typename T> static void selectInstrumentationMethod(const T* object, MemoryObjectInfo* memoryObjectInfo)
    120     {
    121         // If there is reportMemoryUsage method on the object, call it.
    122         // Otherwise count only object's self size.
    123         reportObjectMemoryUsage<T, void (T::*)(MemoryObjectInfo*) const>(object, memoryObjectInfo, 0);
    124     }
    125 
    126     template<typename Type, Type Ptr> struct MemberHelperStruct;
    127     template<typename T, typename Type>
    128     static void reportObjectMemoryUsage(const T* object, MemoryObjectInfo* memoryObjectInfo,  MemberHelperStruct<Type, &T::reportMemoryUsage>*)
    129     {
    130         object->reportMemoryUsage(memoryObjectInfo);
    131     }
    132 
    133     template<typename T, typename Type>
    134     static void reportObjectMemoryUsage(const T* object, MemoryObjectInfo* memoryObjectInfo, ...)
    135     {
    136         callReportObjectInfo(memoryObjectInfo, object, 0, sizeof(T));
    137     }
     119    template <typename Type>
     120    class IsInstrumented {
     121        class yes {
     122            char m;
     123        };
     124
     125        class no {
     126            yes m[2];
     127        };
     128
     129        struct Mixin {
     130            void reportMemoryUsage(MemoryObjectInfo*) const { }
     131        };
     132
     133        struct Derived : public Type, public Mixin { };
     134        template <typename T, T t> class Helper { };
     135
     136        template <typename U> static no deduce(U*, Helper<void (Mixin::*)(MemoryObjectInfo*) const, &U::reportMemoryUsage>* = 0);
     137        static yes deduce(...);
     138
     139    public:
     140        static const bool result = sizeof(yes) == sizeof(deduce((Derived*)(0)));
     141
     142    };
     143
     144    template <bool>
     145    struct InstrumentationSelector {
     146        template <typename T> static void reportObjectMemoryUsage(const T*, MemoryObjectInfo*);
     147    };
     148
    138149    WTF_EXPORT_PRIVATE static void callReportObjectInfo(MemoryObjectInfo*, const void* pointer, MemoryObjectType, size_t objectSize);
    139150
     
    189200    MemoryInstrumentationClient* m_client;
    190201};
     202
     203template <>
     204template <typename T>
     205void MemoryInstrumentation::InstrumentationSelector<true>::reportObjectMemoryUsage(const T* object, MemoryObjectInfo* memoryObjectInfo)
     206{
     207    object->reportMemoryUsage(memoryObjectInfo);
     208}
     209
     210template <>
     211template <typename T>
     212void MemoryInstrumentation::InstrumentationSelector<false>::reportObjectMemoryUsage(const T* object, MemoryObjectInfo* memoryObjectInfo)
     213{
     214    callReportObjectInfo(memoryObjectInfo, object, 0, sizeof(T));
     215}
    191216
    192217class MemoryClassInfo {
     
    225250void reportMemoryUsage(const T* object, MemoryObjectInfo* memoryObjectInfo)
    226251{
    227     MemoryInstrumentation::selectInstrumentationMethod<T>(object, memoryObjectInfo);
     252    MemoryInstrumentation::InstrumentationSelector<MemoryInstrumentation::IsInstrumented<T>::result>::reportObjectMemoryUsage(object, memoryObjectInfo);
    228253}
    229254
  • trunk/Tools/ChangeLog

    r137891 r137892  
     12012-12-14  Ilya Tikhonovsky  <loislo@chromium.org>
     2
     3        Web Inspector: Native Memory Instrumentation: MemoryInstrumentation doesn't detect reportMemoryUsage method defined in a base class.
     4        https://bugs.webkit.org/show_bug.cgi?id=105026
     5
     6        Reviewed by Yury Semikhatsky.
     7
     8        Old SFINAE test was replaced with new one based on this article:
     9        http://stackoverflow.com/questions/1966362/sfinae-to-check-for-inherited-member-functions
     10
     11        New test which covers this problem was added.
     12
     13        * TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp:
     14
    1152012-12-17  Oswald Buddenhagen  <oswald.buddenhagen@digia.com>
    216
  • trunk/Tools/TestWebKitAPI/Tests/WTF/MemoryInstrumentationTest.cpp

    r137468 r137892  
    873873    EXPECT_EQ(1, client.linkCount());
    874874}
     875
     876class DerivedClass : public Instrumented {
     877public:
     878    size_t m_member;
     879};
     880
     881TEST(MemoryInstrumentationTest, detectBaseClassInstrumentation)
     882{
     883    OwnPtr<DerivedClass> instance = adoptPtr(new DerivedClass());
     884
     885    InstrumentationTestHelper helper;
     886    helper.addRootObject(instance.get(), TestType);
     887    EXPECT_EQ(sizeof(Instrumented) + sizeof(NotInstrumented), helper.reportedSizeForAllTypes());
     888    EXPECT_EQ(2u, helper.visitedObjects());
     889}
     890
    875891} // namespace
    876892
Note: See TracChangeset for help on using the changeset viewer.