[Issue 8774] 2.059 worked 2.060 does not: nested delegate memory corruption
d-bugmail at puremagic.com
d-bugmail at puremagic.com
Wed Dec 26 05:19:38 PST 2012
http://d.puremagic.com/issues/show_bug.cgi?id=8774
--- Comment #17 from Dmitry Olshansky <dmitry.olsh at gmail.com> 2012-12-26 05:19:36 PST ---
Spent some more time & removed Phobos dependencies.
The sample below runs fine with -version=OK and triggers assert without.
Curiously the only difference is a = a[1..$] vs the same via popFront (where
array is passed by ref).
void popFront(A)(ref A[] a)
{
a = a[1 .. $];
}
private struct MapResult(alias fun, Range)
{
alias Range R;
R _input;
this(R input)
{
_input = input;
}
@property bool empty()
{
return _input.length == 0;
}
void popFront()
{
version(OK)
_input = _input[1 .. $];
else
_input.popFront();
//
}
@property auto ref front()
{
return fun(_input[0]);
}
@property auto length()
{
return _input.length;
}
alias length opDollar;
}
auto map(alias fun, Range)(Range r)
{
return MapResult!(fun, Range)(r);
}
int sliceBefore;
void corrupt( immutable int numberOfThreads ) {
immutable n = 1000000000 ;
immutable delta = 1.0 / n ;
immutable sliceSize = n / numberOfThreads ;
sliceBefore = sliceSize;
auto threads = map!( ( int i ) {
auto closedPartialSum() {
immutable ii = i ;
return delegate ( ) {
assert(sliceSize == sliceBefore);
};
}
return closedPartialSum();
}) ( [0] );
//create array of delegates and copy them using range-based foreach
auto dgs = new void delegate()[threads.length];
size_t i=0;
foreach(dg; threads) //empty-front-popFront
dgs[i++] = dg;
foreach(dg; dgs)
dg();
}
void main(){
corrupt(1);
}
--
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
More information about the Digitalmars-d-bugs
mailing list