Thread overview | ||||||
---|---|---|---|---|---|---|
|
May 11, 2007 [Issue 1227] New: Access Violation when using comparison of template class pointer | ||||
---|---|---|---|---|
| ||||
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 Re: [Issue 1227] New: Access Violation when using comparison of template class pointer | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | <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=1227 Not 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 Re: [Issue 1227] New: Access Violation when using comparison of template class pointer | ||||
---|---|---|---|---|
| ||||
Posted in reply to Jarrett Billingsley | Jarrett Billingsley schrieb:
> <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=1227
>
> Not 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++;
>> }
>> }
>> }
>
>
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.
david
|
May 11, 2007 [Issue 1227] Access Violation when using comparison of template class pointer | ||||
---|---|---|---|---|
| ||||
Posted in reply to d-bugmail | http://d.puremagic.com/issues/show_bug.cgi?id=1227 deewiant@gmail.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID ------- Comment #1 from deewiant@gmail.com 2007-05-11 13:07 ------- 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. -- |
Copyright © 1999-2021 by the D Language Foundation