[dmd-internals] OSX 64 bit

Don Clugston dclugston at googlemail.com
Thu Dec 1 00:45:18 PST 2011


On 30 November 2011 23:18, Walter Bright <walter at digitalmars.com> wrote:
>
>
> On 11/30/2011 1:30 AM, Don Clugston wrote:
>>
>> On 30 November 2011 09:27, Walter Bright<walter at digitalmars.com>  wrote:
>>>
>>> The compiler is passing the test suite now, the only failure is in the
>>> unit
>>> tests of std.bigint. Anyhow, any brave souls who want to try it out
>>> should
>>> have a go!
>>
>> If anyone tries it, please help me fix the bigint failure by telling
>> me the result of:
>
>
> osx ~/cbx/mars> cat foo.d
>
> import std.bigint;
> import std.stdio;
>
> string toHex(BigInt x)
> {
>    string outbuff="";
>    void sink(const(char)[] s) { outbuff ~= s; }
>    x.toString(&sink, "%x");
>    return outbuff;
> }
>
> void main()
> {
>   writeln(toHex(BigInt("0x1234567890123456789")));
> }
>
> osx ~/cbx/mars> ./dmd foo -m32
> osx ~/cbx/mars> ./foo
> 123_45678901_23456789
> osx ~/cbx/mars> ./dmd foo -m64
> osx ~/cbx/mars> ./foo
> 44444567_89ABCD45_6789ABCD

The hex digits are 4 higher than they should be, in every case.
'0'-> '4', '2'->'6', '9' -> 'D', etc.
The hex digits are set in this function:

void toHexZeroPadded(char[] output, uint value)
{
    ptrdiff_t x = output.length - 1;
    static immutable string hexDigits = "0123456789ABCDEF";
    for( ; x>=0; --x)
    {
        output[x] = hexDigits[value & 0xF];
        value >>= 4;
    }
}

This really looks as though hexDigits is the wrong address. Maybe
because it's a local static variable.
I predict that a minimal test case would be:

void foo(uint value)
{
    static immutable string hexDigits = "0123456789ABCDEF";
    assert( hexDigits[value & 0xF] == '0');
}
void main()
{
  foo(0);
}


More information about the dmd-internals mailing list