I've been looking at the std.demangle code quite a lot lately (trying to modify it to suit my needs). One thing I noted in particular, the handling of floats/doubles/reals as template values seem to be incorrect. For example, looking at the unittest in the bottom of the file one of the tests looks like this:

"_D4test58__T9factorialVde67666666666666860140VG5aa5_68656c6c6fVPvnZ9factorialf", "float test.factorial!(double 4.2, char[5] \"hello\"c, void* null).factorial"

Where the first row is the mangled name and the second is the demangled name. According to the ABI specification on mangled names the mangled from of a template value that is a float/double/real looks like this:

Value:
        e HexFloat

HexFloat:
        N HexDigits P Exponent
        HexDigits P Exponent

In the the above mangled name there is no 'P' and the exponent is missing as far as I can see. According to the specification the mangled name should look something like this:

_D4test58__T9factorialVde67666666666666860140P<exponent>VG5aa5_68656c6c6fVPvnZ9factorialf

Where <exponent> is the exponent. If I look at the mangled symbol (produced by DMD) of a method like this:

module main;

class Foo
{
        void fooBar (float f) ()
}

It has the right mangled name which is:

_D4main3Foo33__T6fooBarVde8666666666666667PN1Z6fooBarMFZv

With the 'P' and the exponent in place. If I try to demangle a correctly mangled name like the one above std.demangle fails to demangle it. It tries to convert the 'P' to a hex digit, which will fail and then i just returns the mangled name.

Another thing is that std.demangle doesn't seem to handle newer D2 additions like function attributes (pure, ref, safe and so on), Wild and TypeNewArray. I'm not quite sure what "Wild" is. I guess "TypeNewArray" is the new arrays that are value types.

Should report these issues or am I missing something ?

/Jacob Carlborg

Reply via email to