On Wednesday, 28 November 2012 at 22:13:05 UTC, Dan wrote:
On Wednesday, 28 November 2012 at 20:30:41 UTC, Maxim Fomin
wrote:
On Wednesday, 28 November 2012 at 18:08:59 UTC, Dan wrote:
This code with version=bug produces garbage because of
opAssign. It seems that opAssign is actually called before
accessing map:
Maxim, thanks for looking more at this. This bug is not
affecting my work in any way - I'm just trying to learn more
about D and how to debug, and your responses are helpful.
I've now built druntime and phobos with debug to see if I can
see what is going on more.
For me the relevant assembly of your code looks like below. I
see the value in the assoc array get created and memset
initialized to 0 inside aaA.d function _aaGetX with this line:
memset(ptail + aligntsize(keytitsize), 0, valuesize); //
zero value
Then between +62 and +102 it goes off the rails and upon entry
to opAssign *this* is likely garbage. I can't be certain
because the values I see are 0, which would be consistent with
0 initialization - but could also just be luck. At this point I
wish I knew some assembly. Anyway, I don't know if it is a
problem with associative array code, per se, or the code
generated by the compiler when opAssign and/or postblit are
defined for the value type. I do know that if you have no
postblit and no opAssign there are no issues - even with a
destructor. This is consistent with the examples you have
shown, they have postblit and/or opAssign as well as the
RefCount code which has postblit and dtor. In both your example
crash and the RefCount crash the actual seg fault is in the
dtor accessing bogus data because as you pointed out it was not
correctly initialized.
Thanks
Dan
<skipped>
This doesn't look like assembly for previous source. Please
provide the source for which you have assembly and tell which dmd
options do you use.