29 changes: 14 additions & 15 deletions src/core/thread.d
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ else version( Posix )
push R13 ;
push R14 ;
push R15 ;
push EAX ; // 16 byte align the stack
push RAX ; // 16 byte align the stack
}
}
else version( GNU )
Expand Down Expand Up @@ -561,7 +561,7 @@ else version( Posix )
asm
{
// Not sure what goes here, popad is invalid in 64 bit code
pop EAX ; // 16 byte align the stack
pop RAX ; // 16 byte align the stack
pop R15 ;
pop R14 ;
pop R13 ;
Expand Down Expand Up @@ -681,7 +681,7 @@ class Thread
}
body
{
this(); // set m_tls
this();
m_fn = fn;
m_sz = sz;
m_call = Call.FN;
Expand All @@ -707,7 +707,7 @@ class Thread
}
body
{
this(); // set m_tls
this();
m_dg = dg;
m_sz = sz;
m_call = Call.DG;
Expand Down Expand Up @@ -793,17 +793,7 @@ class Thread
// starting thread. In effect, not doing the add here risks
// having thread being treated like a daemon thread.
synchronized( slock )
{
// when creating threads from inside a DLL, DllMain(THREAD_ATTACH)
// might be called before _beginthreadex returns, but the dll
// helper functions need to know whether the thread is created
// from the runtime itself or from another DLL or the application
// to just attach to it
// as the consequence, the new Thread object is added before actual
// creation of the thread. There should be no problem with the GC
// calling thread_suspendAll, because of the slock synchronization
add( this );

{
version( Windows )
{
m_hndl = cast(HANDLE) _beginthreadex( null, m_sz, &thread_entryPoint, cast(void*) this, 0, &m_addr );
Expand All @@ -827,6 +817,15 @@ class Thread
if( m_tmach == m_tmach.init )
throw new ThreadException( "Error creating thread" );
}
// NOTE: DllMain(THREAD_ATTACH) may be called before this call
// exits, and this in turn calls thread_findByAddr, which
// would expect this thread to be in the global list if it
// is a D-created thread. However, since thread_findByAddr
// acquires Thread.slock before searching the list, it is
// safe to add this thread after _beginthreadex instead
// of before. This also saves us from having to use a
// scope statement to remove the thread on error.
add( this );
}
}

Expand Down
26 changes: 24 additions & 2 deletions src/gc/gcx.d
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,9 @@ class GC
assert(gcx);
//debug(PRINTF) printf("gcx.self = %x, pthread_self() = %x\n", gcx.self, pthread_self());

if (gcx.running)
onOutOfMemoryError();

size += SENTINEL_EXTRA;
bin = gcx.findBin(size);
Pool *pool;
Expand Down Expand Up @@ -582,6 +585,9 @@ class GC
//
private void *reallocNoSync(void *p, size_t size, uint bits = 0, size_t *alloc_size = null)
{
if (gcx.running)
onOutOfMemoryError();

if (!size)
{ if (p)
{ freeNoSync(p);
Expand Down Expand Up @@ -760,6 +766,9 @@ class GC
}
body
{
if (gcx.running)
onOutOfMemoryError();

//debug(PRINTF) printf("GC::extend(p = %p, minsize = %zu, maxsize = %zu)\n", p, minsize, maxsize);
version (SENTINEL)
{
Expand Down Expand Up @@ -848,6 +857,9 @@ class GC
assert(size != 0);
assert(gcx);

if (gcx.running)
onOutOfMemoryError();

return gcx.reserve(size);
}

Expand Down Expand Up @@ -881,6 +893,9 @@ class GC
debug(PRINTF) printf("Freeing %p\n", cast(size_t) p);
assert (p);

if (gcx.running)
onOutOfMemoryError();

Pool* pool;
size_t pagenum;
Bins bin;
Expand Down Expand Up @@ -1486,6 +1501,7 @@ struct Gcx
uint anychanges;
void *stackBottom;
uint inited;
uint running;
int disabled; // turn off collections if >0

byte *minAddr; // min(baseAddr)
Expand Down Expand Up @@ -2363,7 +2379,7 @@ struct Gcx
push R13 ;
push R14 ;
push R15 ;
push EAX ; // 16 byte align the stack
push RAX ; // 16 byte align the stack
mov sp[RBP],RSP ;
}
}
Expand All @@ -2389,7 +2405,7 @@ struct Gcx
{
asm
{
pop EAX ; // 16 byte align the stack
pop RAX ; // 16 byte align the stack
pop R15 ;
pop R14 ;
pop R13 ;
Expand Down Expand Up @@ -2432,6 +2448,10 @@ struct Gcx
debug(COLLECT_PRINTF) printf("Gcx.fullcollect()\n");
//printf("\tpool address range = %p .. %p\n", minAddr, maxAddr);

if (running)
onOutOfMemoryError();
running = 1;

thread_suspendAll();

cached_size_key = cached_size_key.init;
Expand Down Expand Up @@ -2779,6 +2799,8 @@ struct Gcx
debug(COLLECT_PRINTF) printf("\trecovered pages = %d\n", recoveredpages);
debug(COLLECT_PRINTF) printf("\tfree'd %u bytes, %u pages from %u pools\n", freed, freedpages, npools);

running = 0; // only clear on success

return freedpages + recoveredpages;
}

Expand Down
7 changes: 7 additions & 0 deletions src/object_.d
Original file line number Diff line number Diff line change
Expand Up @@ -2540,6 +2540,13 @@ unittest
auto b = a.dup;
assert(b == [ 1:"one", 2:"two", 3:"three" ]);
}
unittest
{
// test for bug 5925
const a = [4:0];
const b = [4:0];
assert(a == b);
}

void clear(T)(T obj) if (is(T == class))
{
Expand Down
24 changes: 23 additions & 1 deletion src/rt/aaA.d
Original file line number Diff line number Diff line change
Expand Up @@ -790,7 +790,7 @@ BB* _d_assocarrayliteralTX(TypeInfo_AssociativeArray ti, void[] keys, void[] val
* 1 equal
* 0 not equal
*/
int _aaEqual(TypeInfo_AssociativeArray ti, AA e1, AA e2)
int _aaEqual(TypeInfo tiRaw, AA e1, AA e2)
{
//printf("_aaEqual()\n");
//printf("keyti = %.*s\n", ti.key.classinfo.name);
Expand All @@ -803,6 +803,28 @@ int _aaEqual(TypeInfo_AssociativeArray ti, AA e1, AA e2)
if (len != _aaLen(e2))
return 0;

// Check for Bug 5925. ti_raw could be a TypeInfo_Const, we need to unwrap
// it until reaching a real TypeInfo_AssociativeArray.
TypeInfo_AssociativeArray ti;
while (true)
{
if ((ti = cast(TypeInfo_AssociativeArray)tiRaw) !is null)
break;
else if (auto tiConst = cast(TypeInfo_Const)tiRaw) {
// The member in object_.d and object.di differ. This is to ensure
// the file can be compiled both independently in unittest and
// collectively in generating the library. Fixing object.di
// requires changes to std.format in Phobos, fixing object_.d
// makes Phobos's unittest fail, so this hack is employed here to
// avoid irrelevant changes.
static if (is(typeof(&tiConst.base) == TypeInfo*))
tiRaw = tiConst.base;
else
tiRaw = tiConst.next;
} else
assert(0); // ???
}

/* Algorithm: Visit each key/value pair in e1. If that key doesn't exist
* in e2, or if the value in e1 doesn't match the one in e2, the arrays
* are not equal, and exit early.
Expand Down
20 changes: 11 additions & 9 deletions src/rt/arraybyte.d
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ module rt.arraybyte;

import core.cpuid;

// debug=PRINTF

version (unittest)
{
private import core.stdc.stdio : printf;
Expand Down Expand Up @@ -243,7 +245,7 @@ body

unittest
{
printf("_arraySliceExpAddSliceAssign_g unittest\n");
debug(PRINTF) printf("_arraySliceExpAddSliceAssign_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -454,7 +456,7 @@ body

unittest
{
printf("_arraySliceSliceAddSliceAssign_g unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddSliceAssign_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -635,7 +637,7 @@ T[] _arrayExpSliceAddass_g(T[] a, T value)

unittest
{
printf("_arrayExpSliceAddass_g unittest\n");
debug(PRINTF) printf("_arrayExpSliceAddass_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -832,7 +834,7 @@ body

unittest
{
printf("_arraySliceSliceAddass_g unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddass_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1061,7 +1063,7 @@ body

unittest
{
printf("_arraySliceExpMinSliceAssign_g unittest\n");
debug(PRINTF) printf("_arraySliceExpMinSliceAssign_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1271,7 +1273,7 @@ body

unittest
{
printf("_arrayExpSliceMinSliceAssign_g unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinSliceAssign_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1478,7 +1480,7 @@ body

unittest
{
printf("_arraySliceSliceMinSliceAssign_g unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinSliceAssign_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1659,7 +1661,7 @@ T[] _arrayExpSliceMinass_g(T[] a, T value)

unittest
{
printf("_arrayExpSliceMinass_g unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinass_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1856,7 +1858,7 @@ body

unittest
{
printf("_arraySliceSliceMinass_g unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinass_g unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down
34 changes: 18 additions & 16 deletions src/rt/arraydouble.d
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
*/
module rt.arraydouble;

// debug=PRINTF

private import core.cpuid;

version (unittest)
Expand Down Expand Up @@ -127,7 +129,7 @@ body

unittest
{
printf("_arraySliceSliceAddSliceAssign_d unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddSliceAssign_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -240,7 +242,7 @@ body

unittest
{
printf("_arraySliceSliceMinSliceAssign_d unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinSliceAssign_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -345,7 +347,7 @@ body

unittest
{
printf("_arraySliceExpAddSliceAssign_d unittest\n");
debug(PRINTF) printf("_arraySliceExpAddSliceAssign_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -440,7 +442,7 @@ T[] _arrayExpSliceAddass_d(T[] a, T value)

unittest
{
printf("_arrayExpSliceAddass_d unittest\n");
debug(PRINTF) printf("_arrayExpSliceAddass_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -547,7 +549,7 @@ body

unittest
{
printf("_arraySliceSliceAddass_d unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddass_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -652,7 +654,7 @@ body

unittest
{
printf("_arraySliceExpMinSliceAssign_d unittest\n");
debug(PRINTF) printf("_arraySliceExpMinSliceAssign_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -760,7 +762,7 @@ body

unittest
{
printf("_arrayExpSliceMinSliceAssign_d unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinSliceAssign_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -855,7 +857,7 @@ T[] _arrayExpSliceMinass_d(T[] a, T value)

unittest
{
printf("_arrayExpSliceMinass_d unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinass_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -962,7 +964,7 @@ body

unittest
{
printf("_arrayExpSliceMinass_d unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinass_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1067,7 +1069,7 @@ body

unittest
{
printf("_arraySliceExpMulSliceAssign_d unittest\n");
debug(PRINTF) printf("_arraySliceExpMulSliceAssign_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1179,7 +1181,7 @@ body

unittest
{
printf("_arraySliceSliceMulSliceAssign_d unittest\n");
debug(PRINTF) printf("_arraySliceSliceMulSliceAssign_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1274,7 +1276,7 @@ T[] _arrayExpSliceMulass_d(T[] a, T value)

unittest
{
printf("_arrayExpSliceMulass_d unittest\n");
debug(PRINTF) printf("_arrayExpSliceMulass_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1381,7 +1383,7 @@ body

unittest
{
printf("_arrayExpSliceMulass_d unittest\n");
debug(PRINTF) printf("_arrayExpSliceMulass_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1500,7 +1502,7 @@ body

unittest
{
printf("_arraySliceExpDivSliceAssign_d unittest\n");
debug(PRINTF) printf("_arraySliceExpDivSliceAssign_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1607,7 +1609,7 @@ T[] _arrayExpSliceDivass_d(T[] a, T value)

unittest
{
printf("_arrayExpSliceDivass_d unittest\n");
debug(PRINTF) printf("_arrayExpSliceDivass_d unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1682,7 +1684,7 @@ body

unittest
{
printf("_arraySliceExpMulSliceAddass_d unittest\n");
debug(PRINTF) printf("_arraySliceExpMulSliceAddass_d unittest\n");

cpuid = 1;
{
Expand Down
34 changes: 18 additions & 16 deletions src/rt/arrayfloat.d
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
*/
module rt.arrayfloat;

// debug=PRINTF

private import core.cpuid;

version (unittest)
Expand Down Expand Up @@ -176,7 +178,7 @@ body

unittest
{
printf("_arraySliceSliceAddSliceAssign_f unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddSliceAssign_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -234,7 +236,7 @@ body

unittest
{
printf("_arraySliceSliceMinSliceAssign_f unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinSliceAssign_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -291,7 +293,7 @@ body

unittest
{
printf("_arraySliceSliceMulSliceAssign_f unittest\n");
debug(PRINTF) printf("_arraySliceSliceMulSliceAssign_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -445,7 +447,7 @@ T[] _arrayExpSliceAddass_f(T[] a, T value)

unittest
{
printf("_arrayExpSliceAddass_f unittest\n");
debug(PRINTF) printf("_arrayExpSliceAddass_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -495,7 +497,7 @@ T[] _arrayExpSliceMinass_f(T[] a, T value)

unittest
{
printf("_arrayExpSliceminass_f unittest\n");
debug(PRINTF) printf("_arrayExpSliceminass_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -545,7 +547,7 @@ T[] _arrayExpSliceMulass_f(T[] a, T value)

unittest
{
printf("_arrayExpSliceMulass_f unittest\n");
debug(PRINTF) printf("_arrayExpSliceMulass_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -595,7 +597,7 @@ T[] _arrayExpSliceDivass_f(T[] a, T value)

unittest
{
printf("_arrayExpSliceDivass_f unittest\n");
debug(PRINTF) printf("_arrayExpSliceDivass_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -753,7 +755,7 @@ body

unittest
{
printf("_arraySliceExpAddSliceAssign_f unittest\n");
debug(PRINTF) printf("_arraySliceExpAddSliceAssign_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -808,7 +810,7 @@ body

unittest
{
printf("_arraySliceExpMinSliceAssign_f unittest\n");
debug(PRINTF) printf("_arraySliceExpMinSliceAssign_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -863,7 +865,7 @@ body

unittest
{
printf("_arraySliceExpMulSliceAssign_f unittest\n");
debug(PRINTF) printf("_arraySliceExpMulSliceAssign_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -912,7 +914,7 @@ T[] _arraySliceExpDivSliceAssign_f(T[] a, T value, T[] b)

unittest
{
printf("_arraySliceExpDivSliceAssign_f unittest\n");
debug(PRINTF) printf("_arraySliceExpDivSliceAssign_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1062,7 +1064,7 @@ body

unittest
{
printf("_arraySliceSliceAddass_f unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddass_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1118,7 +1120,7 @@ body

unittest
{
printf("_arrayExpSliceMinass_f unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinass_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1174,7 +1176,7 @@ body

unittest
{
printf("_arrayExpSliceMulass_f unittest\n");
debug(PRINTF) printf("_arrayExpSliceMulass_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1324,7 +1326,7 @@ body

unittest
{
printf("_arrayExpSliceMinSliceAssign_f unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinSliceAssign_f unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -1397,7 +1399,7 @@ body

unittest
{
printf("_arraySliceExpMulSliceAddass_f unittest\n");
debug(PRINTF) printf("_arraySliceExpMulSliceAddass_f unittest\n");

cpuid = 1;
{
Expand Down
28 changes: 15 additions & 13 deletions src/rt/arrayint.d
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
*/
module rt.arrayint;

// debug=PRINTF

private import core.cpuid;

version (unittest)
Expand Down Expand Up @@ -213,7 +215,7 @@ body

unittest
{
printf("_arraySliceExpAddSliceAssign_i unittest\n");
debug(PRINTF) printf("_arraySliceExpAddSliceAssign_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -397,7 +399,7 @@ normal:

unittest
{
printf("_arraySliceSliceAddSliceAssign_i unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddSliceAssign_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -581,7 +583,7 @@ T[] _arrayExpSliceAddass_i(T[] a, T value)

unittest
{
printf("_arrayExpSliceAddass_i unittest\n");
debug(PRINTF) printf("_arrayExpSliceAddass_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -754,7 +756,7 @@ normal:

unittest
{
printf("_arraySliceSliceAddass_i unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddass_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -958,7 +960,7 @@ body

unittest
{
printf("_arraySliceExpMinSliceAssign_i unittest\n");
debug(PRINTF) printf("_arraySliceExpMinSliceAssign_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1138,7 +1140,7 @@ body

unittest
{
printf("_arrayExpSliceMinSliceAssign_i unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinSliceAssign_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1320,7 +1322,7 @@ body

unittest
{
printf("_arraySliceSliceMinSliceAssign_i unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinSliceAssign_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1504,7 +1506,7 @@ T[] _arrayExpSliceMinass_i(T[] a, T value)

unittest
{
printf("_arrayExpSliceMinass_i unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinass_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1676,7 +1678,7 @@ body

unittest
{
printf("_arraySliceSliceMinass_i unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinass_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1856,7 +1858,7 @@ body

unittest
{
printf("_arraySliceExpMulSliceAssign_s unittest\n");
debug(PRINTF) printf("_arraySliceExpMulSliceAssign_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -2043,7 +2045,7 @@ body

unittest
{
printf("_arraySliceSliceMulSliceAssign_i unittest\n");
debug(PRINTF) printf("_arraySliceSliceMulSliceAssign_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -2204,7 +2206,7 @@ T[] _arrayExpSliceMulass_i(T[] a, T value)

unittest
{
printf("_arrayExpSliceMulass_i unittest\n");
debug(PRINTF) printf("_arrayExpSliceMulass_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -2393,7 +2395,7 @@ body

unittest
{
printf("_arraySliceSliceMulass_i unittest\n");
debug(PRINTF) printf("_arraySliceSliceMulass_i unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down
8 changes: 5 additions & 3 deletions src/rt/arrayreal.d
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
*/
module rt.arrayreal;

// debug=PRINTF

import core.cpuid;

version (unittest)
Expand Down Expand Up @@ -70,7 +72,7 @@ body

unittest
{
printf("_arraySliceSliceAddSliceAssign_r unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddSliceAssign_r unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -130,7 +132,7 @@ body

unittest
{
printf("_arraySliceSliceMinSliceAssign_r unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinSliceAssign_r unittest\n");
for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
version (log) printf(" cpuid %d\n", cpuid);
Expand Down Expand Up @@ -203,7 +205,7 @@ body

unittest
{
printf("_arraySliceExpMulSliceAddass_r unittest\n");
debug(PRINTF) printf("_arraySliceExpMulSliceAddass_r unittest\n");

cpuid = 1;
{
Expand Down
28 changes: 15 additions & 13 deletions src/rt/arrayshort.d
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
*/
module rt.arrayshort;

// debug=PRINTF

private import core.cpuid;

version (unittest)
Expand Down Expand Up @@ -186,7 +188,7 @@ body

unittest
{
printf("_arraySliceExpAddSliceAssign_s unittest\n");
debug(PRINTF) printf("_arraySliceExpAddSliceAssign_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -369,7 +371,7 @@ body

unittest
{
printf("_arraySliceSliceAddSliceAssign_s unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddSliceAssign_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -529,7 +531,7 @@ T[] _arrayExpSliceAddass_s(T[] a, T value)

unittest
{
printf("_arrayExpSliceAddass_s unittest\n");
debug(PRINTF) printf("_arrayExpSliceAddass_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -701,7 +703,7 @@ body

unittest
{
printf("_arraySliceSliceAddass_s unittest\n");
debug(PRINTF) printf("_arraySliceSliceAddass_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -878,7 +880,7 @@ body

unittest
{
printf("_arraySliceExpMinSliceAssign_s unittest\n");
debug(PRINTF) printf("_arraySliceExpMinSliceAssign_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1060,7 +1062,7 @@ body

unittest
{
printf("_arrayExpSliceMinSliceAssign_s unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinSliceAssign_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1242,7 +1244,7 @@ body

unittest
{
printf("_arraySliceSliceMinSliceAssign_s unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinSliceAssign_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1402,7 +1404,7 @@ T[] _arrayExpSliceMinass_s(T[] a, T value)

unittest
{
printf("_arrayExpSliceMinass_s unittest\n");
debug(PRINTF) printf("_arrayExpSliceMinass_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1574,7 +1576,7 @@ body

unittest
{
printf("_arraySliceSliceMinass_s unittest\n");
debug(PRINTF) printf("_arraySliceSliceMinass_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1751,7 +1753,7 @@ body

unittest
{
printf("_arraySliceExpMulSliceAssign_s unittest\n");
debug(PRINTF) printf("_arraySliceExpMulSliceAssign_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -1934,7 +1936,7 @@ body

unittest
{
printf("_arraySliceSliceMulSliceAssign_s unittest\n");
debug(PRINTF) printf("_arraySliceSliceMulSliceAssign_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -2094,7 +2096,7 @@ T[] _arrayExpSliceMulass_s(T[] a, T value)

unittest
{
printf("_arrayExpSliceMulass_s unittest\n");
debug(PRINTF) printf("_arrayExpSliceMulass_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down Expand Up @@ -2266,7 +2268,7 @@ body

unittest
{
printf("_arraySliceSliceMulass_s unittest\n");
debug(PRINTF) printf("_arraySliceSliceMulass_s unittest\n");

for (cpuid = 0; cpuid < CPUID_MAX; cpuid++)
{
Expand Down
1 change: 1 addition & 0 deletions src/rt/cover.d
Original file line number Diff line number Diff line change
Expand Up @@ -396,6 +396,7 @@ void splitLines( char[] buf, ref char[][] lines )
beg = pos + 1;
if( buf[pos] == '\r' && pos < buf.length - 1 && buf[pos + 1] == '\n' )
++pos, ++beg;
continue;
default:
continue;
}
Expand Down
25 changes: 22 additions & 3 deletions src/rt/memory.d
Original file line number Diff line number Diff line change
Expand Up @@ -202,8 +202,19 @@ private
{
extern __gshared
{
int etext;
int _end;
size_t etext;
size_t _end;
}
}
version (X86_64)
{
extern (C)
{
extern __gshared
{
size_t _deh_end;
size_t __progname;
}
}
}
}
Expand Down Expand Up @@ -237,7 +248,15 @@ void initStaticDataGC()
}
else version( FreeBSD )
{
gc_addRange( &etext, cast(size_t) &_end - cast(size_t) &etext );
version (X86_64)
{
gc_addRange( &etext, cast(size_t) &_deh_end - cast(size_t) &etext );
gc_addRange( &__progname, cast(size_t) &_end - cast(size_t) &__progname );
}
else
{
gc_addRange( &etext, cast(size_t) &_end - cast(size_t) &etext );
}
}
else version( Solaris )
{
Expand Down
2 changes: 2 additions & 0 deletions src/rt/trace.d
Original file line number Diff line number Diff line change
Expand Up @@ -633,6 +633,7 @@ static char* trace_readline(FILE* fp)
{ trace_free(buf);
return null;
}
goto L1;
case '\n':
goto L1;
default:
Expand Down Expand Up @@ -703,6 +704,7 @@ static void trace_merge()
psp = &sfanin;
continue; // regard unrecognized line as separator
}
goto case;
case '?':
case '_':
case '$':
Expand Down
2 changes: 1 addition & 1 deletion src/rt/util/utf.d
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
module rt.util.utf;


extern (C) void onUnicodeError( string msg, size_t idx );
extern (C) void onUnicodeError( string msg, size_t idx, string file = __FILE__, size_t line = __LINE__ );

/*******************************
* Test if c is a valid UTF-32 character.
Expand Down