mirror of
https://github.com/xomboverlord/ldc.git
synced 2026-03-01 01:53:16 +01:00
Created separate tests directory for D1.
This commit is contained in:
136
tests/d1/testincludes/std/IEEE.d
Normal file
136
tests/d1/testincludes/std/IEEE.d
Normal file
@@ -0,0 +1,136 @@
|
||||
// Written in the D programming language
|
||||
/*
|
||||
* Authors:
|
||||
* Walter Bright, Don Clugston
|
||||
* Copyright:
|
||||
* Copyright (c) 2001-2005 by Digital Mars,
|
||||
* All Rights Reserved,
|
||||
* www.digitalmars.com
|
||||
* License:
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* <ul>
|
||||
* <li> The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* </li>
|
||||
* <li> Altered source versions must be plainly marked as such, and must not
|
||||
* be misrepresented as being the original software.
|
||||
* </li>
|
||||
* <li> This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
* </li>
|
||||
* </ul>
|
||||
*/
|
||||
/* Cut down version for libtangobos-partial/dstress */
|
||||
|
||||
module tango.math.IEEE;
|
||||
|
||||
|
||||
private:
|
||||
/*
|
||||
* The following IEEE 'real' formats are currently supported:
|
||||
* 64 bit Big-endian 'double' (eg PowerPC)
|
||||
* 128 bit Big-endian 'quadruple' (eg SPARC)
|
||||
* 64 bit Little-endian 'double' (eg x86-SSE2)
|
||||
* 80 bit Little-endian, with implied bit 'real80' (eg x87, Itanium).
|
||||
* 128 bit Little-endian 'quadruple' (not implemented on any known processor!)
|
||||
*
|
||||
* Non-IEEE 128 bit Big-endian 'doubledouble' (eg PowerPC) has partial support
|
||||
*/
|
||||
version(LittleEndian) {
|
||||
static assert(real.mant_dig == 53 || real.mant_dig==64
|
||||
|| real.mant_dig == 113,
|
||||
"Only 64-bit, 80-bit, and 128-bit reals"
|
||||
" are supported for LittleEndian CPUs");
|
||||
} else {
|
||||
static assert(real.mant_dig == 53 || real.mant_dig==106
|
||||
|| real.mant_dig == 113,
|
||||
"Only 64-bit and 128-bit reals are supported for BigEndian CPUs."
|
||||
" double-double reals have partial support");
|
||||
}
|
||||
|
||||
// Constants used for extracting the components of the representation.
|
||||
// They supplement the built-in floating point properties.
|
||||
template floatTraits(T) {
|
||||
// EXPMASK is a ushort mask to select the exponent portion (without sign)
|
||||
// POW2MANTDIG = pow(2, real.mant_dig) is the value such that
|
||||
// (smallest_denormal)*POW2MANTDIG == real.min
|
||||
// EXPPOS_SHORT is the index of the exponent when represented as a ushort array.
|
||||
// SIGNPOS_BYTE is the index of the sign when represented as a ubyte array.
|
||||
static if (T.mant_dig == 24) { // float
|
||||
const ushort EXPMASK = 0x7F80;
|
||||
const ushort EXPBIAS = 0x3F00;
|
||||
const uint EXPMASK_INT = 0x7F80_0000;
|
||||
const uint MANTISSAMASK_INT = 0x007F_FFFF;
|
||||
const real POW2MANTDIG = 0x1p+24;
|
||||
version(LittleEndian) {
|
||||
const EXPPOS_SHORT = 1;
|
||||
} else {
|
||||
const EXPPOS_SHORT = 0;
|
||||
}
|
||||
} else static if (T.mant_dig == 53) { // double, or real==double
|
||||
const ushort EXPMASK = 0x7FF0;
|
||||
const ushort EXPBIAS = 0x3FE0;
|
||||
const uint EXPMASK_INT = 0x7FF0_0000;
|
||||
const uint MANTISSAMASK_INT = 0x000F_FFFF; // for the MSB only
|
||||
const real POW2MANTDIG = 0x1p+53;
|
||||
version(LittleEndian) {
|
||||
const EXPPOS_SHORT = 3;
|
||||
const SIGNPOS_BYTE = 7;
|
||||
} else {
|
||||
const EXPPOS_SHORT = 0;
|
||||
const SIGNPOS_BYTE = 0;
|
||||
}
|
||||
} else static if (T.mant_dig == 64) { // real80
|
||||
const ushort EXPMASK = 0x7FFF;
|
||||
const ushort EXPBIAS = 0x3FFE;
|
||||
const real POW2MANTDIG = 0x1p+63;
|
||||
version(LittleEndian) {
|
||||
const EXPPOS_SHORT = 4;
|
||||
const SIGNPOS_BYTE = 9;
|
||||
} else {
|
||||
const EXPPOS_SHORT = 0;
|
||||
const SIGNPOS_BYTE = 0;
|
||||
}
|
||||
} else static if (real.mant_dig == 113){ // quadruple
|
||||
const ushort EXPMASK = 0x7FFF;
|
||||
const real POW2MANTDIG = 0x1p+113;
|
||||
version(LittleEndian) {
|
||||
const EXPPOS_SHORT = 7;
|
||||
const SIGNPOS_BYTE = 15;
|
||||
} else {
|
||||
const EXPPOS_SHORT = 0;
|
||||
const SIGNPOS_BYTE = 0;
|
||||
}
|
||||
} else static if (real.mant_dig == 106) { // doubledouble
|
||||
const ushort EXPMASK = 0x7FF0;
|
||||
const real POW2MANTDIG = 0x1p+53; // doubledouble denormals are strange
|
||||
// and the exponent byte is not unique
|
||||
version(LittleEndian) {
|
||||
const EXPPOS_SHORT = 7; // [3] is also an exp short
|
||||
const SIGNPOS_BYTE = 15;
|
||||
} else {
|
||||
const EXPPOS_SHORT = 0; // [4] is also an exp short
|
||||
const SIGNPOS_BYTE = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public:
|
||||
/*********************************
|
||||
* Return 1 if sign bit of e is set, 0 if not.
|
||||
*/
|
||||
|
||||
int signbit(real x)
|
||||
{
|
||||
return ((cast(ubyte *)&x)[floatTraits!(real).SIGNPOS_BYTE] & 0x80) != 0;
|
||||
}
|
||||
10
tests/d1/testincludes/std/compat.d
Normal file
10
tests/d1/testincludes/std/compat.d
Normal file
@@ -0,0 +1,10 @@
|
||||
module std.compat;
|
||||
|
||||
extern (C) int printf(char *, ...);
|
||||
|
||||
alias char[] string;
|
||||
alias wchar[] wstring;
|
||||
alias dchar[] dstring;
|
||||
|
||||
alias Exception Error;
|
||||
alias bool bit;
|
||||
250
tests/d1/testincludes/std/gc.d
Normal file
250
tests/d1/testincludes/std/gc.d
Normal file
@@ -0,0 +1,250 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 1999-2006 by Digital Mars, www.digitalmars.com
|
||||
* Written by Walter Bright
|
||||
*
|
||||
* This software is provided 'as-is', without any express or implied
|
||||
* warranty. In no event will the authors be held liable for any damages
|
||||
* arising from the use of this software.
|
||||
*
|
||||
* Permission is granted to anyone to use this software for any purpose,
|
||||
* including commercial applications, and to alter it and redistribute it
|
||||
* freely, subject to the following restrictions:
|
||||
*
|
||||
* o The origin of this software must not be misrepresented; you must not
|
||||
* claim that you wrote the original software. If you use this software
|
||||
* in a product, an acknowledgment in the product documentation would be
|
||||
* appreciated but is not required.
|
||||
* o Altered source versions must be plainly marked as such, and must not
|
||||
* be misrepresented as being the original software.
|
||||
* o This notice may not be removed or altered from any source
|
||||
* distribution.
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* The garbage collector normally works behind the scenes without needing any
|
||||
* specific interaction. These functions are for advanced applications that
|
||||
* benefit from tuning the operation of the collector.
|
||||
* Macros:
|
||||
* WIKI=Phobos/StdGc
|
||||
*/
|
||||
|
||||
module std.gc;
|
||||
|
||||
import tango.core.Memory;
|
||||
|
||||
/**
|
||||
* Add p to list of roots. Roots are references to memory allocated by the
|
||||
collector that are maintained in memory outside the collector pool. The garbage
|
||||
collector will by default look for roots in the stacks of each thread, the
|
||||
registers, and the default static data segment. If roots are held elsewhere,
|
||||
use addRoot() or addRange() to tell the collector not to free the memory it
|
||||
points to.
|
||||
*/
|
||||
void addRoot(void *p) // add p to list of roots
|
||||
{
|
||||
GC.addRoot(p);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove p from list of roots.
|
||||
*/
|
||||
void removeRoot(void *p) // remove p from list of roots
|
||||
{
|
||||
GC.removeRoot(p);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add range to scan for roots.
|
||||
*/
|
||||
void addRange(void *pbot, void *ptop) // add range to scan for roots
|
||||
{
|
||||
GC.addRange(pbot, ptop-pbot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove range.
|
||||
*/
|
||||
void removeRange(void *pbot) // remove range
|
||||
{
|
||||
GC.removeRange(pbot);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark a gc allocated block of memory as possibly containing pointers.
|
||||
*/
|
||||
void hasPointers(void* p)
|
||||
{
|
||||
GC.clrAttr(p, GC.BlkAttr.NO_SCAN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark a gc allocated block of memory as definitely NOT containing pointers.
|
||||
*/
|
||||
void hasNoPointers(void* p)
|
||||
{
|
||||
GC.setAttr(p, GC.BlkAttr.NO_SCAN);
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark a gc allocated block of memory pointed to by p as being populated with
|
||||
* an array of TypeInfo ti (as many as will fit).
|
||||
*/
|
||||
//void setTypeInfo(TypeInfo ti, void* p);
|
||||
|
||||
/**
|
||||
* Allocate nbytes of uninitialized data.
|
||||
* The allocated memory will be scanned for pointers during
|
||||
* a gc collection cycle, unless
|
||||
* it is followed by a call to hasNoPointers().
|
||||
*/
|
||||
void[] malloc(size_t nbytes)
|
||||
{
|
||||
void* p = GC.malloc(nbytes);
|
||||
if (p is null)
|
||||
return null;
|
||||
else
|
||||
return p[0..nbytes];
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize allocated memory block pointed to by p to be at least nbytes long.
|
||||
* It will try to resize the memory block in place.
|
||||
* If nbytes is 0, the memory block is free'd.
|
||||
* If p is null, the memory block is allocated using malloc.
|
||||
* The returned array may not be at the same location as the original
|
||||
* memory block.
|
||||
* The allocated memory will be scanned for pointers during
|
||||
* a gc collection cycle, unless
|
||||
* it is followed by a call to hasNoPointers().
|
||||
*/
|
||||
void[] realloc(void* p, size_t nbytes)
|
||||
{
|
||||
p = GC.realloc(p, nbytes);
|
||||
if (p is null)
|
||||
return null;
|
||||
else
|
||||
return p[0..nbytes];
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempt to enlarge the memory block pointed to by p
|
||||
* by at least minbytes beyond its current capacity,
|
||||
* up to a maximum of maxbytes.
|
||||
* Returns:
|
||||
* 0 if could not extend p,
|
||||
* total size of entire memory block if successful.
|
||||
*/
|
||||
size_t extend(void* p, size_t minbytes, size_t maxbytes)
|
||||
{
|
||||
return GC.extend(p, maxbytes, minbytes);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns capacity (size of the memory block) that p
|
||||
* points to the beginning of.
|
||||
* If p does not point into the gc memory pool, or does
|
||||
* not point to the beginning of an allocated memory block,
|
||||
* 0 is returned.
|
||||
*/
|
||||
size_t capacity(void* p)
|
||||
{
|
||||
return GC.sizeOf(p);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set gc behavior to match that of 1.0.
|
||||
*/
|
||||
void setV1_0()
|
||||
{
|
||||
}
|
||||
|
||||
/***********************************
|
||||
* Run a full garbage collection cycle.
|
||||
*
|
||||
* The collector normally runs synchronously with a storage allocation request
|
||||
(i.e. it never happens when in code that does not allocate memory). In some
|
||||
circumstances, for example when a particular task is finished, it is convenient
|
||||
to explicitly run the collector and free up all memory used by that task. It
|
||||
can also be helpful to run a collection before starting a new task that would
|
||||
be annoying if it ran a collection in the middle of that task. Explicitly
|
||||
running a collection can also be done in a separate very low priority thread,
|
||||
so that if the program is idly waiting for input, memory can be cleaned up.
|
||||
*/
|
||||
|
||||
void fullCollect()
|
||||
{
|
||||
GC.collect();
|
||||
}
|
||||
|
||||
/***********************************
|
||||
* Run a generational garbage collection cycle.
|
||||
* Takes less time than a fullcollect(), but isn't
|
||||
* as effective.
|
||||
*/
|
||||
|
||||
void genCollect()
|
||||
{
|
||||
GC.collect();
|
||||
}
|
||||
|
||||
//void genCollectNoStack();
|
||||
|
||||
/**
|
||||
* Minimizes physical memory usage
|
||||
*/
|
||||
void minimize()
|
||||
{
|
||||
GC.collect();
|
||||
}
|
||||
|
||||
/***************************************
|
||||
* disable() temporarily disables garbage collection cycle, enable()
|
||||
* then reenables them.
|
||||
*
|
||||
* This is used for brief time critical sections of code, so the amount of time
|
||||
* it will take is predictable.
|
||||
* If the collector runs out of memory while it is disabled, it will throw an
|
||||
* std.outofmemory.OutOfMemoryException.
|
||||
* The disable() function calls can be nested, but must be
|
||||
* matched with corresponding enable() calls.
|
||||
* By default collections are enabled.
|
||||
*/
|
||||
|
||||
void disable()
|
||||
{
|
||||
GC.disable();
|
||||
}
|
||||
|
||||
/**
|
||||
* ditto
|
||||
*/
|
||||
void enable()
|
||||
{
|
||||
GC.enable();
|
||||
}
|
||||
|
||||
//void getStats(out GCStats stats);
|
||||
|
||||
/***************************************
|
||||
* Get handle to the collector.
|
||||
*/
|
||||
|
||||
//void* getGCHandle();
|
||||
|
||||
/***************************************
|
||||
* Set handle to the collector.
|
||||
*/
|
||||
|
||||
//void setGCHandle(void* p);
|
||||
|
||||
//void endGCHandle();
|
||||
|
||||
/*
|
||||
extern (C)
|
||||
{
|
||||
void gc_init();
|
||||
void gc_term();
|
||||
}
|
||||
*/
|
||||
11
tests/d1/testincludes/std/outofmemory.d
Normal file
11
tests/d1/testincludes/std/outofmemory.d
Normal file
@@ -0,0 +1,11 @@
|
||||
module std.outofmemory;
|
||||
import std.compat;
|
||||
|
||||
public import tango.core.Exception;
|
||||
|
||||
extern (C) void _d_OutOfMemory()
|
||||
{
|
||||
throw cast(OutOfMemoryException)
|
||||
cast(void *)
|
||||
OutOfMemoryException.classinfo.init;
|
||||
}
|
||||
30
tests/d1/testincludes/std/stdarg.d
Normal file
30
tests/d1/testincludes/std/stdarg.d
Normal file
@@ -0,0 +1,30 @@
|
||||
|
||||
/*
|
||||
* Placed in public domain.
|
||||
* Written by Hauke Duden and Walter Bright
|
||||
*/
|
||||
|
||||
/* This is for use with variable argument lists with extern(D) linkage. */
|
||||
|
||||
module std.stdarg;
|
||||
|
||||
version(LDC)
|
||||
{
|
||||
public import ldc.vararg;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
alias void* va_list;
|
||||
|
||||
template va_arg(T)
|
||||
{
|
||||
T va_arg(inout va_list _argptr)
|
||||
{
|
||||
T arg = *cast(T*)_argptr;
|
||||
_argptr = _argptr + ((T.sizeof + int.sizeof - 1) & ~(int.sizeof - 1));
|
||||
return arg;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user