[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