digitalmars.D.bugs - [Issue 1227] New: Access Violation when using comparison of template class pointer
- d-bugmail puremagic.com (104/104) May 11 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1227
- Jarrett Billingsley (5/32) May 11 2007 Not a bug. Use 'is' to see if a reference is null, not '=='.
- david (8/49) May 11 2007 Reason:
- d-bugmail puremagic.com (11/11) May 11 2007 http://d.puremagic.com/issues/show_bug.cgi?id=1227
http://d.puremagic.com/issues/show_bug.cgi?id=1227
Summary: Access Violation when using comparison of template class
pointer
Product: D
Version: 1.014
Platform: PC
OS/Version: Windows
Status: NEW
Severity: normal
Priority: P2
Component: DMD
AssignedTo: bugzilla digitalmars.com
ReportedBy: aurelien.vermifuge gmail.com
THe compiler seem to have a problem with template class. I think the code will
be more usefull than a long description with ma chaotic english.
I made that :
---- util/linkedlist.d ----
class LinkedList(TypeList=Object)
{
private LinkedListLink!(TypeList) first, last;
private int count;
public this()
{
this.first = null;
this.last = null;
this.count = 0;
}
public void add(TypeList T)
{
LinkedListLink!(TypeList) n;
synchronized(this)
{
try
{
n = new LinkedListLink!(TypeList) (last, T);
} catch (OutOfMemoryException e)
{
throw e;
}
if ( this.last==null )
{
this.first = n;
this.last = n;
} else
{
this.last.next = n;
this.last = n;
}
count++;
}
}
}
class LinkedListLink(TypeList=Object)
{
public TypeList value;
public LinkedListLink next, previous;
public this(TypeList T)
{
value = T;
next = null;
previous = null;
}
public this(LinkedListLink prev, TypeList T)
{
value = T;
next = null;
previous = prev;
}
}
---- main.d ----
int main(char[][] args)
{
LinkedList!(int) listEntiers;
try
{
listEntiers = new LinkedList!(int)();
} catch (OutOfMemoryException e)
{
printf("No more memory u_u");
}
for (int i=0; i<15; i++)
{
try
{
listEntiers.add(i);
} catch (OutOfMemoryException e)
{
printf("BUG");
}
}
}
-------------------------------
It compile well, but when the add is called, the programm make an "Access
Violation" and stop running. I have looked at the ASM generated code, and I saw
that :
( eax = pointer to object )
mov eax, [eax+0Ch] // Put the this.last value into eax, the value is null
mov eax, [eax] // Try to read into the object à the offset 0 --> Exception
If I put : this.last = null; it works well, dans the generated code is :
( eax = pointer to object )
mov [eax+0Ch], 0 // Correct
but the condition is not well formed.
Hope it will be usefull.
--
May 11 2007
<d-bugmail puremagic.com> wrote in message news:bug-1227-3 http.d.puremagic.com/issues/...http://d.puremagic.com/issues/show_bug.cgi?id=1227Not a bug. Use 'is' to see if a reference is null, not '=='.public void add(TypeList T) { LinkedListLink!(TypeList) n; synchronized(this) { try { n = new LinkedListLink!(TypeList) (last, T); } catch (OutOfMemoryException e) { throw e; } if ( this.last==null )This last line should be: if( this.last is null ){ this.first = n; this.last = n; } else { this.last.next = n; this.last = n; } count++; } } }
May 11 2007
Jarrett Billingsley schrieb:<d-bugmail puremagic.com> wrote in message news:bug-1227-3 http.d.puremagic.com/issues/...Reason: if (window == null) is another way of saying: if (window.opEquals(null)) but if "window" is null, it will fail because it needs "window" for the reference of the opEquals method to work. davidhttp://d.puremagic.com/issues/show_bug.cgi?id=1227Not a bug. Use 'is' to see if a reference is null, not '=='.public void add(TypeList T) { LinkedListLink!(TypeList) n; synchronized(this) { try { n = new LinkedListLink!(TypeList) (last, T); } catch (OutOfMemoryException e) { throw e; } if ( this.last==null )This last line should be: if( this.last is null ){ this.first = n; this.last = n; } else { this.last.next = n; this.last = n; } count++; } } }
May 11 2007
http://d.puremagic.com/issues/show_bug.cgi?id=1227
deewiant gmail.com changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|NEW |RESOLVED
Resolution| |INVALID
Invalid, as explained in the NG: use "is", not "==" to compare object pointers,
as the latter transforms into a call to object.opEquals, which will fail if the
object is null.
--
May 11 2007









david <ta-nospam-zz gmx.at> 