From 9c6a15ce628d5c95b6884fe706b70da992fd2839 Mon Sep 17 00:00:00 2001 From: Vijay Kiran Kamuju Date: Thu, 20 Oct 2005 13:15:11 +0000 Subject: [PATCH] Fix msvcrt symbol demangling for non MS symbols. --- dlls/msvcrt/tests/cpp.c | 16 ++++++++++++++++ dlls/msvcrt/undname.c | 3 --- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/dlls/msvcrt/tests/cpp.c b/dlls/msvcrt/tests/cpp.c index f7a37e26a5c..eb74fb4c049 100644 --- a/dlls/msvcrt/tests/cpp.c +++ b/dlls/msvcrt/tests/cpp.c @@ -117,6 +117,10 @@ static type_info* (*p__RTtypeid)(void*); static void* (*p__RTCastToVoid)(void*); static void* (*p__RTDynamicCast)(void*,int,void*,void*,int); +/*Demangle*/ +static char* (*p__unDName)(char*,const char*,int,void*,void*,unsigned short int); + + /* _very_ early native versions have serious RTTI bugs, so we check */ static void* bAncientVersion; @@ -247,6 +251,8 @@ static void InitFunctionPtrs() SET(p__RTCastToVoid, "__RTCastToVoid"); SET(p__RTDynamicCast, "__RTDynamicCast"); + SET(p__unDName,"__unDName"); + /* Extremely early versions export logic_error, and crash in RTTI */ SETNOFAIL(bAncientVersion, "??0logic_error@@QAE@ABQBD@Z"); } @@ -812,6 +818,15 @@ static void test_rtti(void) ok (casted == NULL, "Cast succeeded\n"); } +static void test_demangle(void) +{ + char * name = NULL; + static const char * mangled = ".ABVVec4@ref2@dice@@"; + static const char * result = "class dice::ref2::Vec4 const &"; + name = p__unDName(0, mangled + 1, 0,pmalloc,pfree,0x2800); + ok(name != NULL && !strcmp(name,result),"Got name %s \n",name); +} + START_TEST(cpp) { InitFunctionPtrs(); @@ -822,6 +837,7 @@ START_TEST(cpp) test___non_rtti_object(); test_type_info(); test_rtti(); + test_demangle(); if (hMsvcrt) FreeLibrary(hMsvcrt); diff --git a/dlls/msvcrt/undname.c b/dlls/msvcrt/undname.c index 44208405da7..2b4fd1538de 100644 --- a/dlls/msvcrt/undname.c +++ b/dlls/msvcrt/undname.c @@ -966,9 +966,6 @@ static BOOL symbol_demangle(struct parsed_symbol* sym) BOOL ret = FALSE; unsigned do_after = 0; - /* MS mangled names always begin with '?' */ - if (*sym->current != '?') return FALSE; - /* FIXME seems wrong as name, as it demangles a simple data type */ if (sym->flags & UNDNAME_NO_ARGUMENTS) { -- 2.11.4.GIT