summaryrefslogtreecommitdiffstats
path: root/src/demangle.cpp
diff options
context:
space:
mode:
authorsagitario <sagitario@fc51e93f-b9fe-4711-8d8d-3ae870c5f7d8>2010-03-12 11:59:48 (GMT)
committersagitario <sagitario@fc51e93f-b9fe-4711-8d8d-3ae870c5f7d8>2010-03-12 11:59:48 (GMT)
commitb5b9076d2370cb7a5d9fe30c7ffee38e19def0c7 (patch)
tree0bbbff37a578e45219e595888e388ed8cb526ff3 /src/demangle.cpp
parentca2d69f4a43f7209113ceee6773bd04bbe6bd317 (diff)
downloadcv2pdb-b5b9076d2370cb7a5d9fe30c7ffee38e19def0c7.zip
cv2pdb-b5b9076d2370cb7a5d9fe30c7ffee38e19def0c7.tar.gz
cv2pdb-b5b9076d2370cb7a5d9fe30c7ffee38e19def0c7.tar.bz2
* names of local function are now demangled
* added managed C++ project to integrate cv2pdb with CLR
Diffstat (limited to 'src/demangle.cpp')
-rw-r--r--src/demangle.cpp35
1 files changed, 26 insertions, 9 deletions
diff --git a/src/demangle.cpp b/src/demangle.cpp
index 883680c..87bef71 100644
--- a/src/demangle.cpp
+++ b/src/demangle.cpp
@@ -183,6 +183,18 @@ public:
hasthisptr = true;
goto Lagain;
+ case 'y':
+ p = "immutable(" + parseType() + ")";
+ goto L1;
+
+ case 'x':
+ p = "const(" + parseType() + ")";
+ goto L1;
+
+ case 'O':
+ p = "shared(" + parseType() + ")";
+ goto L1;
+
case 'F': // D function
case 'U': // C function
case 'W': // Windows function
@@ -214,7 +226,7 @@ public:
goto Ldefault;
case 'K':
- args += "inout ";
+ args += "ref ";
ni++;
goto Ldefault;
@@ -427,16 +439,18 @@ public:
try
{
string result = parseQualifiedName();
- if (!plainName)
+ string typed_result = parseType(result);
+ while(ni < name.length)
{
- result = parseType(result);
- while(ni < name.length){
- result += " . " + parseType(parseQualifiedName());
- }
-
- if (ni != name.length)
- goto Lnot;
+ // throw away outer type (e.g. for local functions)
+ result = result + "." + parseQualifiedName();
+ typed_result = parseType(result);
}
+ if (!plainName)
+ result = typed_result;
+
+ if (ni != name.length)
+ goto Lnot;
return result;
}
catch (MangleException e)
@@ -456,6 +470,7 @@ void unittest()
static string table[][2] =
{
+ { "_D6object14_moduleTlsCtorUZv15_moduleTlsCtor2MFAPS6object10ModuleInfoiZv", "void object._moduleTlsCtor._moduleTlsCtor2(struct object.ModuleInfo*[], int)"},
{ "_D7dparser3dmd8Template21TemplateTypeParameter13overloadMatchMFC7dparser3dmd8Template17TemplateParameterZi", "int dparser.dmd.Template.TemplateTypeParameter.overloadMatch(class dparser.dmd.Template.TemplateParameter)"},
{ "printf", "printf" },
{ "_foo", "_foo" },
@@ -484,6 +499,8 @@ void unittest()
bool d_demangle(const char* name, char* demangled, int maxlen, bool plain)
{
+ // static bool once; if(!once) unittest(); once = true;
+
Demangle d;
string r = d.demangle(name, plain);
if (r.length == 0)