Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.
/ druntime Public archive
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions src/core/memory.d
Original file line number Diff line number Diff line change
Expand Up @@ -91,9 +91,10 @@ private
extern (C) void gc_collect() nothrow;
extern (C) void gc_minimize() nothrow;

extern (C) uint gc_getAttr( void* p ) pure nothrow;
extern (C) uint gc_setAttr( void* p, uint a ) pure nothrow;
extern (C) uint gc_clrAttr( void* p, uint a ) pure nothrow;
extern (C) uint gc_getAttr( in void* p ) pure nothrow;
extern (C) uint gc_setAttr( in void* p, uint a ) pure nothrow;
extern (C) uint gc_clrAttr( in void* p, uint a ) pure nothrow;
extern (C) uint gc_isCollecting( in void* p ); // pure nothrow???

extern (C) void* gc_malloc( size_t sz, uint ba = 0 ) pure nothrow;
extern (C) void* gc_calloc( size_t sz, uint ba = 0 ) pure nothrow;
Expand All @@ -103,8 +104,9 @@ private
extern (C) size_t gc_reserve( size_t sz ) nothrow;
extern (C) void gc_free( void* p ) pure nothrow;

extern (C) void* gc_addrOf( void* p ) pure nothrow;
extern (C) size_t gc_sizeOf( void* p ) pure nothrow;
extern (C) void* gc_addrOf( in void* p ) pure nothrow;
extern (C) size_t gc_sizeOf( in void* p ) pure nothrow;
extern (C) BlkInfo_ gc_query( in void* p ) pure nothrow;

struct BlkInfo_
{
Expand All @@ -113,8 +115,6 @@ private
uint attr;
}

extern (C) BlkInfo_ gc_query( void* p ) pure nothrow;

extern (C) void gc_addRoot( in void* p ) nothrow;
extern (C) void gc_addRange( in void* p, size_t sz ) nothrow;

Expand Down
6 changes: 3 additions & 3 deletions src/object.di
Original file line number Diff line number Diff line change
Expand Up @@ -544,8 +544,8 @@ template _isStaticArray(T)

private
{
extern (C) void _d_arrayshrinkfit(TypeInfo ti, void[] arr);
extern (C) size_t _d_arraysetcapacity(TypeInfo ti, size_t newcapacity, void *arrptr) pure nothrow;
extern (C) void _d_arrayshrinkfit(TypeInfo ti, void[] arr) pure nothrow; //not actually pure
extern (C) size_t _d_arraysetcapacity(TypeInfo ti, size_t newcapacity, void *arrptr) pure nothrow; //not actually pure or nothrow
}

@property size_t capacity(T)(T[] arr) pure nothrow
Expand All @@ -558,7 +558,7 @@ size_t reserve(T)(ref T[] arr, size_t newcapacity) pure nothrow @trusted
return _d_arraysetcapacity(typeid(T[]), newcapacity, cast(void *)&arr);
}

auto ref inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr)
auto ref inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr) pure nothrow
{
_d_arrayshrinkfit(typeid(T[]), *(cast(void[]*)&arr));
return arr;
Expand Down
4 changes: 2 additions & 2 deletions src/object_.d
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ private

extern (C) void onOutOfMemoryError();
extern (C) Object _d_newclass(const TypeInfo_Class ci);
extern (C) void _d_arrayshrinkfit(const TypeInfo ti, void[] arr);
extern (C) void _d_arrayshrinkfit(const TypeInfo ti, void[] arr) pure nothrow; //not actually pure
extern (C) size_t _d_arraysetcapacity(const TypeInfo ti, size_t newcapacity, void *arrptr) pure nothrow;
extern (C) void rt_finalize(void *data, bool det=true);
}
Expand Down Expand Up @@ -2500,7 +2500,7 @@ unittest
* Returns:
* The input is returned.
*/
auto ref inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr)
auto ref inout(T[]) assumeSafeAppend(T)(auto ref inout(T[]) arr) pure nothrow
{
_d_arrayshrinkfit(typeid(T[]), *(cast(void[]*)&arr));
return arr;
Expand Down
60 changes: 36 additions & 24 deletions src/rt/lifetime.d
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,22 @@ private
uint attr;
}

extern (C) uint gc_getAttr( in void* p );
extern (C) uint gc_isCollecting( in void* p );
extern (C) uint gc_setAttr( in void* p, uint a );
extern (C) uint gc_clrAttr( in void* p, uint a );

extern (C) void* gc_malloc( size_t sz, uint ba = 0 );
extern (C) BlkInfo gc_qalloc( size_t sz, uint ba = 0 );
extern (C) void* gc_calloc( size_t sz, uint ba = 0 );
extern (C) size_t gc_extend( void* p, size_t mx, size_t sz );
extern (C) void gc_free( void* p );

extern (C) void* gc_addrOf( in void* p );
extern (C) size_t gc_sizeOf( in void* p );
extern (C) BlkInfo gc_query( in void* p );
extern (C) uint gc_getAttr( in void* p ) pure nothrow;
extern (C) uint gc_setAttr( in void* p, uint a ) pure nothrow;
extern (C) uint gc_clrAttr( in void* p, uint a ) pure nothrow;
extern (C) uint gc_isCollecting( in void* p ); // pure nothrow???

extern (C) void* gc_malloc( size_t sz, uint ba = 0 ) pure nothrow;
extern (C) void* gc_calloc( size_t sz, uint ba = 0 ) pure nothrow;
extern (C) BlkInfo gc_qalloc( size_t sz, uint ba = 0 ) pure nothrow;
extern (C) void* gc_realloc( void* p, size_t sz, uint ba = 0 ) pure nothrow;
extern (C) size_t gc_extend( void* p, size_t mx, size_t sz );
extern (C) size_t gc_reserve( size_t sz ) nothrow;
extern (C) void gc_free( void* p ) pure nothrow;

extern (C) void* gc_addrOf( in void* p ) pure nothrow;
extern (C) size_t gc_sizeOf( in void* p ) pure nothrow;
extern (C) BlkInfo gc_query( in void* p ) pure nothrow;

extern (C) void onFinalizeError( ClassInfo c, Throwable e );
extern (C) void onOutOfMemoryError();
Expand Down Expand Up @@ -236,29 +238,39 @@ private class ArrayAllocLengthLock

where elem0 starts 16 bytes after the first byte.
*/
bool __setArrayAllocLength(ref BlkInfo info, size_t newlength, bool isshared, size_t oldlength = ~0)
bool __setArrayAllocLength(ref BlkInfo info, size_t newlength, bool isshared, size_t oldlength) pure
{
mixin(__setArrayAllocLengthImpl);
}
/// ditto
bool __setArrayAllocLength(ref BlkInfo info, size_t newlength, bool /+isshared+/) nothrow pure
{
mixin(__setArrayAllocLengthImpl);
}

enum __setArrayAllocLengthImpl =
q{
if(info.size <= 256)
{
if(newlength + SMALLPAD > info.size)
// new size does not fit inside block
return false;
auto length = cast(ubyte *)(info.base + info.size - SMALLPAD);
if(oldlength != ~0)
static if(is(typeof(oldlength)))
{
if(isshared)
{
synchronized(typeid(ArrayAllocLengthLock))
{
if(*length == cast(ubyte)oldlength)
if(*length == oldlength)
*length = cast(ubyte)newlength;
else
return false;
}
}
else
{
if(*length == cast(ubyte)oldlength)
if(*length == oldlength)
*length = cast(ubyte)newlength;
else
return false;
Expand All @@ -276,7 +288,7 @@ bool __setArrayAllocLength(ref BlkInfo info, size_t newlength, bool isshared, si
// new size does not fit inside block
return false;
auto length = cast(ushort *)(info.base + info.size - MEDPAD);
if(oldlength != ~0)
static if(is(typeof(oldlength)))
{
if(isshared)
{
Expand Down Expand Up @@ -308,22 +320,22 @@ bool __setArrayAllocLength(ref BlkInfo info, size_t newlength, bool isshared, si
// new size does not fit inside block
return false;
auto length = cast(size_t *)(info.base);
if(oldlength != ~0)
static if(is(typeof(oldlength)))
{
if(isshared)
{
synchronized(typeid(ArrayAllocLengthLock))
{
if(*length == oldlength)
*length = newlength;
*length = cast(size_t)newlength;
else
return false;
}
}
else
{
if(*length == oldlength)
*length = newlength;
*length = cast(size_t)newlength;
else
return false;
}
Expand All @@ -335,7 +347,7 @@ bool __setArrayAllocLength(ref BlkInfo info, size_t newlength, bool isshared, si
}
}
return true; // resize succeeded
}
};

/**
get the start of the array for the given block
Expand Down Expand Up @@ -549,7 +561,7 @@ void __insertBlkInfoCache(BlkInfo bi, BlkInfo *curpos) nothrow
* It doesn't matter what the current allocated length of the array is, the
* user is telling the runtime that he knows what he is doing.
*/
extern(C) void _d_arrayshrinkfit(const TypeInfo ti, void[] arr)
extern(C) void _d_arrayshrinkfit(const TypeInfo ti, void[] arr) nothrow
{
// note, we do not care about shared. We are setting the length no matter
// what, so no lock is required.
Expand Down