www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 2328] New: setTypeInfo in gc.d backwards.

reply d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2328

           Summary: setTypeInfo in gc.d backwards.
           Product: D
           Version: 2.018
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: major
          Priority: P2
         Component: Phobos
        AssignedTo: bugzilla digitalmars.com
        ReportedBy: dsimcha yahoo.com


According to Phobos object docs:

uint flags();
    Get flags for type: 1 means GC should scan for pointers 

This is implemented correctly.

import std.stdio;

void main() {
    writefln(typeid(uint).flags & 1);  //0
    writefln(typeid(uint*).flags & 1); //1
    writefln(typeid(void*).flags & 1); //1
    writefln(typeid(float).flags & 1); //0
}

However, source code to setTypeInfo:

void setTypeInfo(TypeInfo ti, void* p)
{
    if (ti.flags() & 1)
        hasNoPointers(p);
    else
        hasPointers(p);
}

The if statement in this code is clearly backwards.


-- 
Sep 02 2008
next sibling parent reply Sean Kelly <sean invisibleduck.org> writes:
d-bugmail puremagic.com wrote:
 http://d.puremagic.com/issues/show_bug.cgi?id=2328
 
            Summary: setTypeInfo in gc.d backwards.
            Product: D
            Version: 2.018
           Platform: All
         OS/Version: All
             Status: NEW
           Severity: major
           Priority: P2
          Component: Phobos
         AssignedTo: bugzilla digitalmars.com
         ReportedBy: dsimcha yahoo.com
 
 
 According to Phobos object docs:
 
 uint flags();
     Get flags for type: 1 means GC should scan for pointers 
 
 This is implemented correctly.
 
 import std.stdio;
 
 void main() {
     writefln(typeid(uint).flags & 1);  //0
     writefln(typeid(uint*).flags & 1); //1
     writefln(typeid(void*).flags & 1); //1
     writefln(typeid(float).flags & 1); //0
 }
 
 However, source code to setTypeInfo:
 
 void setTypeInfo(TypeInfo ti, void* p)
 {
     if (ti.flags() & 1)
         hasNoPointers(p);
     else
         hasPointers(p);
 }
 
 The if statement in this code is clearly backwards.

I'm fairly certain that the doc comment is simply wrong. Last time I checked, the flag was 1 for "has no pointers" as per the implementation. I'd actually prefer it to work as the comment suggests, however.
Sep 02 2008
parent reply dsimcha <dsimcha yahoo.com> writes:
== Quote from Sean Kelly (sean invisibleduck.org)'s article
 d-bugmail puremagic.com wrote:
 http://d.puremagic.com/issues/show_bug.cgi?id=2328

            Summary: setTypeInfo in gc.d backwards.
            Product: D
            Version: 2.018
           Platform: All
         OS/Version: All
             Status: NEW
           Severity: major
           Priority: P2
          Component: Phobos
         AssignedTo: bugzilla digitalmars.com
         ReportedBy: dsimcha yahoo.com


 According to Phobos object docs:

 uint flags();
     Get flags for type: 1 means GC should scan for pointers

 This is implemented correctly.

 import std.stdio;

 void main() {
     writefln(typeid(uint).flags & 1);  //0
     writefln(typeid(uint*).flags & 1); //1
     writefln(typeid(void*).flags & 1); //1
     writefln(typeid(float).flags & 1); //0
 }

 However, source code to setTypeInfo:

 void setTypeInfo(TypeInfo ti, void* p)
 {
     if (ti.flags() & 1)
         hasNoPointers(p);
     else
         hasPointers(p);
 }

 The if statement in this code is clearly backwards.

checked, the flag was 1 for "has no pointers" as per the implementation. I'd actually prefer it to work as the comment suggests, however.

Nope, I actually tested the implementation. I didn't just assume the doc comment was right. Furthermore, I tried to write code based on the expected behavior of Phobos's setTypeInfo() and it was clearly broken. Lying to setTypeInfo() about the type fixed it. Note that I don't know if this bug exists in Tango or Phobos/D1, only that it does exist in Phobos/D2.
Sep 02 2008
parent Sean Kelly <sean invisibleduck.org> writes:
dsimcha wrote:
 The if statement in this code is clearly backwards.

checked, the flag was 1 for "has no pointers" as per the implementation. I'd actually prefer it to work as the comment suggests, however.

Nope, I actually tested the implementation. I didn't just assume the doc comment was right. Furthermore, I tried to write code based on the expected behavior of Phobos's setTypeInfo() and it was clearly broken. Lying to setTypeInfo() about the type fixed it. Note that I don't know if this bug exists in Tango or Phobos/D1, only that it does exist in Phobos/D2.

Oops, I was thinking of ClassInfo, which uses "&2" to represent "hasNoPointers." You're right that TypeInfo uses "&1" to represent "hasPointers." A bit confusing, so it doesn't surprise me that setTypeInfo is wrong. However, Phobos' use of this flag in the runtime code is actually correct. See internal/gc/gc.d, for example. In short, setTypeInfo should probably just be deleted, since it's both incorrect and unused.
Sep 02 2008
prev sibling parent d-bugmail puremagic.com writes:
http://d.puremagic.com/issues/show_bug.cgi?id=2328


dsimcha yahoo.com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|major                       |critical
            Version|2.018                       |1.039




------- Comment #1 from dsimcha yahoo.com  2009-01-25 22:15 -------
No longer relevant to D2, but should still be fixed in D1.


-- 
Jan 25 2009