Thread overview
[Issue 800] New: writefln() on an associative array fails hard
Jan 06, 2007
d-bugmail
Jan 07, 2007
d-bugmail
Jan 07, 2007
d-bugmail
Jan 07, 2007
d-bugmail
Feb 03, 2007
d-bugmail
Feb 10, 2007
d-bugmail
Feb 10, 2007
d-bugmail
January 06, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=800

           Summary: writefln() on an associative array fails hard
           Product: D
           Version: 1.00
          Platform: PC
        OS/Version: Windows
            Status: NEW
          Severity: critical
          Priority: P2
         Component: Phobos
        AssignedTo: bugzilla@digitalmars.com
        ReportedBy: deewiant@gmail.com


import std.stdio;

void main() {
        int[int] foo;

        foo[1] = 2;

        writefln("%s", foo);
}

This outputs "[", some seemingly-random numbers including hundreds of zeroes, and dies in an Access Violation. It looks like it's reading memory in the completely wrong place, possibly treating the AA as a dynamic array.


-- 

January 07, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=800





------- Comment #1 from lio@lunesu.com  2007-01-07 01:09 -------
Apparently, the type-info of an AA changed. std/format.d uses the character at index [9] to identify the type, and it used to be 'H' (HashTable?), but now it's 'A', same as normal arrays:

int[] => TypeInfo_Ai
int[int] => TypeInfo_AssociativeArray


-- 

January 07, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=800





------- Comment #2 from lio@lunesu.com  2007-01-07 02:00 -------
Created an attachment (id=90)
 --> (http://d.puremagic.com/issues/attachment.cgi?id=90&action=view)
Patch for std.format to dump contents of Associative Arrays

This patch adds putAArray to std.format.doFormat. It prints the contents of an AA similar to python: {key:value,key2:value2} (D had no literal AA syntax, so I didn't know what to pick instead)


-- 

January 07, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=800


lio@lunesu.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  BugsThisDependsOn|                            |761
           Keywords|                            |patch




------- Comment #3 from lio@lunesu.com  2007-01-07 02:05 -------
Important: if the doFormat patch from issue 652 or 761 is applied, putAArray should also call doFormat with the 'parse' parameter set to false! This prevents any "%" in either key or value strings from being interpreted (resulting in the bug from issue 761)


-- 

February 03, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=800





------- Comment #4 from bugzilla@digitalmars.com  2007-02-03 00:51 -------
*** Bug 801 has been marked as a duplicate of this bug. ***


-- 

February 10, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=800





------- Comment #5 from dvdfrdmn@users.sf.net  2007-02-10 11:41 -------
Created an attachment (id=100)
 --> (http://d.puremagic.com/issues/attachment.cgi?id=100&action=view)
Patch to align the address of the value


-- 

February 10, 2007
http://d.puremagic.com/issues/show_bug.cgi?id=800


dvdfrdmn@users.sf.net changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dvdfrdmn@users.sf.net




------- Comment #6 from dvdfrdmn@users.sf.net  2007-02-10 11:42 -------
The patch in #2 does not take alignment of the value into account.  The following prints "[a:50331648]"
----
import std.format;
import std.string;
void main()
{
    int[char] m;
    m['a'] = 3;
    assert(find(format("%s",m), "a:3") != -1);
}
----

Attached an example patch that fixes the problem, but I don't think copying from aaA.d is a good idea.


--