From d92df40125daba80628147fc57c6081b8395c37c Mon Sep 17 00:00:00 2001 From: hjk <qthjk@ovi.com> Date: Thu, 19 Jul 2012 11:33:45 +0200 Subject: [PATCH] debugger: fix display of member function pointers Change-Id: I957e805aad45bf62b6fb8318accd29f54b474b11 Reviewed-by: hjk <qthjk@ovi.com> --- share/qtcreator/dumper/bridge.py | 4 +- share/qtcreator/dumper/dumper.py | 7 +++ .../debugger/simple/simple_test_app.cpp | 53 +++++++++++++++---- 3 files changed, 53 insertions(+), 11 deletions(-) diff --git a/share/qtcreator/dumper/bridge.py b/share/qtcreator/dumper/bridge.py index edc4542bda5..da75a51e54b 100644 --- a/share/qtcreator/dumper/bridge.py +++ b/share/qtcreator/dumper/bridge.py @@ -334,8 +334,8 @@ try: #BitStringCode = gdb.TYPE_CODE_BITSTRING #ErrorTypeCode = gdb.TYPE_CODE_ERROR MethodCode = gdb.TYPE_CODE_METHOD - #MethodPointerCode = gdb.TYPE_CODE_METHODPTR - #MemberPointerCode = gdb.TYPE_CODE_MEMBERPTR + MethodPointerCode = gdb.TYPE_CODE_METHODPTR + MemberPointerCode = gdb.TYPE_CODE_MEMBERPTR ReferenceCode = gdb.TYPE_CODE_REF CharCode = gdb.TYPE_CODE_CHAR BoolCode = gdb.TYPE_CODE_BOOL diff --git a/share/qtcreator/dumper/dumper.py b/share/qtcreator/dumper/dumper.py index 6868183f4a1..e1a9066764e 100644 --- a/share/qtcreator/dumper/dumper.py +++ b/share/qtcreator/dumper/dumper.py @@ -1616,6 +1616,13 @@ class Dumper: self.putPointerValue(value.address) return + if type.code == MethodPointerCode or type.code == MemberPointerCode: + self.putType(typeName) + self.putAddress(value.address) + self.putValue(value) + self.putNumChild(0) + return + if typeName.startswith("<anon"): # Anonymous union. We need a dummy name to distinguish # multiple anonymous unions in the struct. diff --git a/tests/manual/debugger/simple/simple_test_app.cpp b/tests/manual/debugger/simple/simple_test_app.cpp index de9f6ff5807..fd1041158dc 100644 --- a/tests/manual/debugger/simple/simple_test_app.cpp +++ b/tests/manual/debugger/simple/simple_test_app.cpp @@ -4971,21 +4971,54 @@ namespace basic { dummyStatement(&ba); } - void testFunctionPointerHelper() {} - - static int someData; + int testFunctionPointerHelper(int x) { return x; } void testFunctionPointer() { - typedef void (*func_t)(); - func_t f2 = testFunctionPointerHelper; - int *p = &someData; + typedef int (*func_t)(int); + func_t f = testFunctionPointerHelper; + int a = f(43); + BREAK_HERE; + // CheckType f basic::func_t. + // Continue. + + // Check there's a valid display for f. + dummyStatement(&f, &a); + } + + struct Class + { + Class() : a(34) {} + int testFunctionPointerHelper(int x) { return x; } + int a; + }; + + void testMemberFunctionPointer() + { + Class x; + typedef int (Class::*func_t)(int); + func_t f = &Class::testFunctionPointerHelper; + int a = (x.*f)(43); + BREAK_HERE; + // CheckType f basic::func_t. + // Continue. + + // Check there's a valid display for f. + dummyStatement(&f, &a); + } + + void testMemberPointer() + { + Class x; + typedef int (Class::*member_t); + member_t m = &Class::a; + int a = x.*m; BREAK_HERE; - // CheckType f2 basic::func_t. + // CheckType m basic::member_t. // Continue. - // Check there's a valid display for f2. - dummyStatement(&f2, p); + // Check there's a valid display for m. + dummyStatement(&m, &a); } void testPassByReferenceHelper(Foo &f) @@ -5139,6 +5172,8 @@ namespace basic { testLongEvaluation2(); testFork(); testFunctionPointer(); + testMemberPointer(); + testMemberFunctionPointer(); testPassByReference(); testBigInt(); testHidden(); -- GitLab