[Haiku-commits] r31243 - in haiku/trunk/src: add-ons/kernel/debugger/demangle apps/debugger/demangler
phoudoin at mail.berlios.de
phoudoin at mail.berlios.de
Fri Jun 26 00:49:21 CEST 2009
Author: phoudoin
Date: 2009-06-26 00:49:07 +0200 (Fri, 26 Jun 2009)
New Revision: 31243
ViewCVS: http://svn.berlios.de/viewcvs/haiku?rev=31243&view=rev
Modified:
haiku/trunk/src/add-ons/kernel/debugger/demangle/demangle.cpp
haiku/trunk/src/add-ons/kernel/debugger/demangle/demangle.h
haiku/trunk/src/apps/debugger/demangler/Demangler.cpp
haiku/trunk/src/apps/debugger/demangler/Jamfile
Log:
Reuse KDL demangler module demangle_symbol() and get_next_argument() to
improve userland Debugger arguments demangling support:
now with argument name and/or type, when available.
I hope I didn't break coding guideline doing so.
Modified: haiku/trunk/src/add-ons/kernel/debugger/demangle/demangle.cpp
===================================================================
--- haiku/trunk/src/add-ons/kernel/debugger/demangle/demangle.cpp 2009-06-25 20:09:12 UTC (rev 31242)
+++ haiku/trunk/src/add-ons/kernel/debugger/demangle/demangle.cpp 2009-06-25 22:49:07 UTC (rev 31243)
@@ -17,7 +17,7 @@
}
-static const char*
+const char*
demangle_symbol(const char* mangledName, char* buffer, size_t bufferSize,
bool* _isObjectMethod)
{
@@ -36,7 +36,7 @@
}
-static status_t
+status_t
get_next_argument(uint32* _cookie, const char* mangledName, char* name,
size_t nameSize, int32* _type, size_t* _argumentLength)
{
@@ -54,6 +54,8 @@
}
+#ifdef _KERNEL_MODE
+
static status_t
std_ops(int32 op, ...)
{
@@ -82,3 +84,5 @@
(module_info*)&sModuleInfo,
NULL
};
+
+#endif // _KERNEL_MODE
Modified: haiku/trunk/src/add-ons/kernel/debugger/demangle/demangle.h
===================================================================
--- haiku/trunk/src/add-ons/kernel/debugger/demangle/demangle.h 2009-06-25 20:09:12 UTC (rev 31242)
+++ haiku/trunk/src/add-ons/kernel/debugger/demangle/demangle.h 2009-06-25 22:49:07 UTC (rev 31243)
@@ -7,7 +7,15 @@
#include <SupportDefs.h>
+const char*
+demangle_symbol(const char* mangledName, char* buffer, size_t bufferSize,
+ bool* _isObjectMethod);
+status_t
+get_next_argument(uint32* _cookie, const char* mangledName, char* name,
+ size_t nameSize, int32* _type, size_t* _argumentLength);
+
+
// gcc 2
const char* demangle_symbol_gcc2(const char* name, char* buffer,
size_t bufferSize, bool* _isObjectMethod);
@@ -22,6 +30,7 @@
status_t get_next_argument_gcc3(uint32* _cookie, const char* symbol,
char* name, size_t nameSize, int32* _type,
size_t* _argumentLength);
+
#ifndef _KERNEL_MODE
const char* demangle_name_gcc3(const char* name, char* buffer,
size_t bufferSize);
Modified: haiku/trunk/src/apps/debugger/demangler/Demangler.cpp
===================================================================
--- haiku/trunk/src/apps/debugger/demangler/Demangler.cpp 2009-06-25 20:09:12 UTC (rev 31242)
+++ haiku/trunk/src/apps/debugger/demangler/Demangler.cpp 2009-06-25 22:49:07 UTC (rev 31243)
@@ -3,6 +3,8 @@
* Distributed under the terms of the MIT License.
*/
+#include <TypeConstants.h>
+
#include "Demangler.h"
#include "demangle.h"
@@ -11,21 +13,88 @@
/*static*/ BString
Demangler::Demangle(const BString& mangledName)
{
+ BString demangledName;
char buffer[1024];
const char* demangled;
-
- if (mangledName.Compare("_Z", 2) == 0) {
- demangled = demangle_name_gcc3(mangledName.String(), buffer,
- sizeof(buffer));
- if (demangled != NULL)
- return demangled;
+
+ demangled = demangle_symbol(mangledName.String(), buffer,
+ sizeof(buffer), NULL);
+ if (demangled == NULL)
+ return mangledName;
+
+ demangledName << demangled << "(";
+
+ size_t length;
+ int32 type, i = 0;
+ uint32 cookie = 0;
+ while (get_next_argument(&cookie, mangledName.String(), buffer,
+ sizeof(buffer), &type, &length) == B_OK) {
+
+ if (i++ > 0)
+ demangledName << ", ";
+
+ if (buffer[0]) {
+ demangledName << buffer;
+ continue;
+ }
+
+ // unnamed argument: fallback to known type
+ switch (type) {
+ case B_ANY_TYPE:
+ break;
+ case B_INT64_TYPE:
+ demangledName << "int64";
+ break;
+ case B_INT32_TYPE:
+ demangledName << "int32";
+ break;
+ case B_INT16_TYPE:
+ demangledName << "int16";
+ break;
+ case B_INT8_TYPE:
+ demangledName << "int8";
+ break;
+ case B_UINT64_TYPE:
+ demangledName << "uint64";
+ break;
+ case B_UINT32_TYPE:
+ demangledName << "uint32";
+ break;
+ case B_UINT16_TYPE:
+ demangledName << "uint16";
+ break;
+ case B_UINT8_TYPE:
+ demangledName << "uint8";
+ break;
+ case B_BOOL_TYPE:
+ demangledName << "bool";
+ break;
+ case B_CHAR_TYPE:
+ demangledName << "char";
+ break;
+ case B_FLOAT_TYPE:
+ demangledName << "float";
+ break;
+ case B_DOUBLE_TYPE:
+ demangledName << "double";
+ break;
+ case B_POINTER_TYPE:
+ // TODO: use length as hint on pointer type
+ demangledName << "void*";
+ break;
+ case B_REF_TYPE:
+ // TODO: use length as hint on reference type
+ demangledName << "&";
+ break;
+ case B_STRING_TYPE:
+ demangledName << "char*";
+ break;
+ default:
+ demangledName << "?";
+ break;
+ }
}
- // fallback is gcc2
- demangled = demangle_symbol_gcc2(mangledName.String(), buffer,
- sizeof(buffer), NULL);
- if (demangled != NULL)
- return demangled;
-
- return mangledName;
+ demangledName << ")";
+ return demangledName;
}
Modified: haiku/trunk/src/apps/debugger/demangler/Jamfile
===================================================================
--- haiku/trunk/src/apps/debugger/demangler/Jamfile 2009-06-25 20:09:12 UTC (rev 31242)
+++ haiku/trunk/src/apps/debugger/demangler/Jamfile 2009-06-25 22:49:07 UTC (rev 31243)
@@ -12,7 +12,8 @@
MergeObject Debugger_demangler.o
:
Demangler.cpp
-
+
+ demangle.cpp
gcc2.cpp
gcc3+.cpp
;
More information about the Haiku-commits
mailing list