Commit eb5f748a by Iain Buclaw

libphobos: Merge upstream druntime 109f0f2e

Backports more extern(C) bindings and platform ports.

Reviewed-on: https://github.com/dlang/druntime/pull/2569

From-SVN: r270490
parent 16a51cf5
4b2674b36b1f6aac75db2a5aa38d67d4be55a987 109f0f2e11aaaddd2b158117928e10c3c4688870
The first line of this file holds the git revision number of the last The first line of this file holds the git revision number of the last
merge done from the dlang/druntime repository. merge done from the dlang/druntime repository.
...@@ -464,10 +464,14 @@ extern (C) bool runModuleUnitTests() ...@@ -464,10 +464,14 @@ extern (C) bool runModuleUnitTests()
import core.sys.freebsd.execinfo; import core.sys.freebsd.execinfo;
else version (NetBSD) else version (NetBSD)
import core.sys.netbsd.execinfo; import core.sys.netbsd.execinfo;
else version (DragonFlyBSD)
import core.sys.dragonflybsd.execinfo;
else version (Windows) else version (Windows)
import core.sys.windows.stacktrace; import core.sys.windows.stacktrace;
else version (Solaris) else version (Solaris)
import core.sys.solaris.execinfo; import core.sys.solaris.execinfo;
else version (CRuntime_UClibc)
import core.sys.linux.execinfo;
static if ( __traits( compiles, new LibBacktrace(0) ) ) static if ( __traits( compiles, new LibBacktrace(0) ) )
{ {
...@@ -591,10 +595,14 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) ...@@ -591,10 +595,14 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null )
import core.sys.freebsd.execinfo; import core.sys.freebsd.execinfo;
else version (NetBSD) else version (NetBSD)
import core.sys.netbsd.execinfo; import core.sys.netbsd.execinfo;
else version (DragonFlyBSD)
import core.sys.dragonflybsd.execinfo;
else version (Windows) else version (Windows)
import core.sys.windows.stacktrace; import core.sys.windows.stacktrace;
else version (Solaris) else version (Solaris)
import core.sys.solaris.execinfo; import core.sys.solaris.execinfo;
else version (CRuntime_UClibc)
import core.sys.linux.execinfo;
// avoid recursive GC calls in finalizer, trace handlers should be made @nogc instead // avoid recursive GC calls in finalizer, trace handlers should be made @nogc instead
import core.memory : gc_inFinalizer; import core.memory : gc_inFinalizer;
...@@ -709,6 +717,8 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) ...@@ -709,6 +717,8 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null )
version (linux) enum enableDwarf = true; version (linux) enum enableDwarf = true;
else version (FreeBSD) enum enableDwarf = true; else version (FreeBSD) enum enableDwarf = true;
else version (DragonFlyBSD) enum enableDwarf = true;
else version (Darwin) enum enableDwarf = true;
else enum enableDwarf = false; else enum enableDwarf = false;
static if (enableDwarf) static if (enableDwarf)
...@@ -832,6 +842,18 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) ...@@ -832,6 +842,18 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null )
symEnd = eptr - buf.ptr; symEnd = eptr - buf.ptr;
} }
} }
else version (DragonFlyBSD)
{
// format is: 0x00000000 <_D6module4funcAFZv+0x78> at module
auto bptr = cast(char*) memchr( buf.ptr, '<', buf.length );
auto eptr = cast(char*) memchr( buf.ptr, '+', buf.length );
if ( bptr++ && eptr )
{
symBeg = bptr - buf.ptr;
symEnd = eptr - buf.ptr;
}
}
else version (Solaris) else version (Solaris)
{ {
// format is object'symbol+offset [pc] // format is object'symbol+offset [pc]
...@@ -896,7 +918,7 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null ) ...@@ -896,7 +918,7 @@ Throwable.TraceInfo defaultTraceHandler( void* ptr = null )
{ {
static enum FIRSTFRAME = 0; static enum FIRSTFRAME = 0;
} }
import core.sys.windows.windows : CONTEXT; import core.sys.windows.winnt : CONTEXT;
auto s = new StackTrace(FIRSTFRAME, cast(CONTEXT*)ptr); auto s = new StackTrace(FIRSTFRAME, cast(CONTEXT*)ptr);
return s; return s;
} }
......
...@@ -2041,46 +2041,49 @@ else version (FreeBSD) ...@@ -2041,46 +2041,49 @@ else version (FreeBSD)
{ {
version (none) // < 8-CURRENT version (none) // < 8-CURRENT
{ {
real acosl(real x) { return acos(x); } extern (D)
real asinl(real x) { return asin(x); } {
pure real atanl(real x) { return atan(x); } real acosl(real x) { return acos(x); }
real atan2l(real y, real x) { return atan2(y, x); } real asinl(real x) { return asin(x); }
pure real cosl(real x) { return cos(x); } pure real atanl(real x) { return atan(x); }
pure real sinl(real x) { return sin(x); } real atan2l(real y, real x) { return atan2(y, x); }
pure real tanl(real x) { return tan(x); } pure real cosl(real x) { return cos(x); }
real exp2l(real x) { return exp2(x); } pure real sinl(real x) { return sin(x); }
pure real frexpl(real value, int* exp) { return frexp(value, exp); } pure real tanl(real x) { return tan(x); }
int ilogbl(real x) { return ilogb(x); } real exp2l(real x) { return exp2(x); }
real ldexpl(real x, int exp) { return ldexp(x, exp); } pure real frexpl(real value, int* exp) { return frexp(value, exp); }
real logbl(real x) { return logb(x); } int ilogbl(real x) { return ilogb(x); }
//real modfl(real value, real *iptr); // nontrivial conversion real ldexpl(real x, int exp) { return ldexp(x, exp); }
real scalbnl(real x, int n) { return scalbn(x, n); } real logbl(real x) { return logb(x); }
real scalblnl(real x, c_long n) { return scalbln(x, n); } //real modfl(real value, real *iptr); // nontrivial conversion
pure real fabsl(real x) { return fabs(x); } real scalbnl(real x, int n) { return scalbn(x, n); }
real hypotl(real x, real y) { return hypot(x, y); } real scalblnl(real x, c_long n) { return scalbln(x, n); }
real sqrtl(real x) { return sqrt(x); } pure real fabsl(real x) { return fabs(x); }
pure real ceill(real x) { return ceil(x); } real hypotl(real x, real y) { return hypot(x, y); }
pure real floorl(real x) { return floor(x); } real sqrtl(real x) { return sqrt(x); }
pure real nearbyintl(real x) { return nearbyint(x); } pure real ceill(real x) { return ceil(x); }
pure real rintl(real x) { return rint(x); } pure real floorl(real x) { return floor(x); }
c_long lrintl(real x) { return lrint(x); } pure real nearbyintl(real x) { return nearbyint(x); }
pure real roundl(real x) { return round(x); } pure real rintl(real x) { return rint(x); }
c_long lroundl(real x) { return lround(x); } c_long lrintl(real x) { return lrint(x); }
long llroundl(real x) { return llround(x); } pure real roundl(real x) { return round(x); }
pure real truncl(real x) { return trunc(x); } c_long lroundl(real x) { return lround(x); }
real fmodl(real x, real y) { return fmod(x, y); } long llroundl(real x) { return llround(x); }
real remainderl(real x, real y) { return remainder(x, y); } pure real truncl(real x) { return trunc(x); }
real remquol(real x, real y, int* quo) { return remquo(x, y, quo); } real fmodl(real x, real y) { return fmod(x, y); }
pure real copysignl(real x, real y) { return copysign(x, y); } real remainderl(real x, real y) { return remainder(x, y); }
// pure double nan(char* tagp); real remquol(real x, real y, int* quo) { return remquo(x, y, quo); }
// pure float nanf(char* tagp); pure real copysignl(real x, real y) { return copysign(x, y); }
// pure real nanl(char* tagp); //pure double nan(char* tagp);
real nextafterl(real x, real y) { return nextafter(x, y); } //pure float nanf(char* tagp);
real nexttowardl(real x, real y) { return nexttoward(x, y); } //pure real nanl(char* tagp);
real fdiml(real x, real y) { return fdim(x, y); } real nextafterl(real x, real y) { return nextafter(x, y); }
pure real fmaxl(real x, real y) { return fmax(x, y); } real nexttowardl(real x, real y) { return nexttoward(x, y); }
pure real fminl(real x, real y) { return fmin(x, y); } real fdiml(real x, real y) { return fdim(x, y); }
pure real fmal(real x, real y, real z) { return fma(x, y, z); } pure real fmaxl(real x, real y) { return fmax(x, y); }
pure real fminl(real x, real y) { return fmin(x, y); }
pure real fmal(real x, real y, real z) { return fma(x, y, z); }
}
} }
else else
{ {
...@@ -2205,49 +2208,49 @@ else version (FreeBSD) ...@@ -2205,49 +2208,49 @@ else version (FreeBSD)
/// ///
float acoshf(float x); float acoshf(float x);
/// ///
real acoshl(real x) { return acosh(x); } extern(D) real acoshl(real x) { return acosh(x); }
/// ///
pure double asinh(double x); pure double asinh(double x);
/// ///
pure float asinhf(float x); pure float asinhf(float x);
/// ///
pure real asinhl(real x) { return asinh(x); } extern(D) pure real asinhl(real x) { return asinh(x); }
/// ///
double atanh(double x); double atanh(double x);
/// ///
float atanhf(float x); float atanhf(float x);
/// ///
real atanhl(real x) { return atanh(x); } extern(D) real atanhl(real x) { return atanh(x); }
/// ///
double cosh(double x); double cosh(double x);
/// ///
float coshf(float x); float coshf(float x);
/// ///
real coshl(real x) { return cosh(x); } extern(D) real coshl(real x) { return cosh(x); }
/// ///
double sinh(double x); double sinh(double x);
/// ///
float sinhf(float x); float sinhf(float x);
/// ///
real sinhl(real x) { return sinh(x); } extern(D) real sinhl(real x) { return sinh(x); }
/// ///
pure double tanh(double x); pure double tanh(double x);
/// ///
pure float tanhf(float x); pure float tanhf(float x);
/// ///
pure real tanhl(real x) { return tanh(x); } extern(D) pure real tanhl(real x) { return tanh(x); }
/// ///
double exp(double x); double exp(double x);
/// ///
float expf(float x); float expf(float x);
/// ///
real expl(real x) { return exp(x); } extern(D) real expl(real x) { return exp(x); }
/// ///
double exp2(double x); double exp2(double x);
...@@ -2259,7 +2262,7 @@ else version (FreeBSD) ...@@ -2259,7 +2262,7 @@ else version (FreeBSD)
/// ///
float expm1f(float x); float expm1f(float x);
/// ///
real expm1l(real x) { return expm1(x); } extern(D) real expm1l(real x) { return expm1(x); }
/// ///
pure double frexp(double value, int* exp); pure double frexp(double value, int* exp);
...@@ -2281,29 +2284,29 @@ else version (FreeBSD) ...@@ -2281,29 +2284,29 @@ else version (FreeBSD)
/// ///
float logf(float x); float logf(float x);
/// ///
real logl(real x) { return log(x); } extern(D) real logl(real x) { return log(x); }
/// ///
double log10(double x); double log10(double x);
/// ///
float log10f(float x); float log10f(float x);
/// ///
real log10l(real x) { return log10(x); } extern(D) real log10l(real x) { return log10(x); }
/// ///
double log1p(double x); double log1p(double x);
/// ///
float log1pf(float x); float log1pf(float x);
/// ///
real log1pl(real x) { return log1p(x); } extern(D) real log1pl(real x) { return log1p(x); }
private enum real ONE_LN2 = 1 / 0x1.62e42fefa39ef358p-1L; private enum real ONE_LN2 = 1 / 0x1.62e42fefa39ef358p-1L;
/// ///
double log2(double x) { return log(x) * ONE_LN2; } extern(D) double log2(double x) { return log(x) * ONE_LN2; }
/// ///
float log2f(float x) { return logf(x) * ONE_LN2; } extern(D) float log2f(float x) { return logf(x) * ONE_LN2; }
/// ///
real log2l(real x) { return logl(x) * ONE_LN2; } extern(D) real log2l(real x) { return logl(x) * ONE_LN2; }
/// ///
double logb(double x); double logb(double x);
...@@ -2330,7 +2333,7 @@ else version (FreeBSD) ...@@ -2330,7 +2333,7 @@ else version (FreeBSD)
/// ///
pure float cbrtf(float x); pure float cbrtf(float x);
/// ///
pure real cbrtl(real x) { return cbrt(x); } extern(D) pure real cbrtl(real x) { return cbrt(x); }
/// ///
pure double fabs(double x); pure double fabs(double x);
...@@ -2347,7 +2350,7 @@ else version (FreeBSD) ...@@ -2347,7 +2350,7 @@ else version (FreeBSD)
/// ///
float powf(float x, float y); float powf(float x, float y);
/// ///
real powl(real x, real y) { return pow(x, y); } extern(D) real powl(real x, real y) { return pow(x, y); }
/// ///
double sqrt(double x); double sqrt(double x);
...@@ -2359,28 +2362,28 @@ else version (FreeBSD) ...@@ -2359,28 +2362,28 @@ else version (FreeBSD)
/// ///
pure float erff(float x); pure float erff(float x);
/// ///
pure real erfl(real x) { return erf(x); } extern(D) pure real erfl(real x) { return erf(x); }
/// ///
double erfc(double x); double erfc(double x);
/// ///
float erfcf(float x); float erfcf(float x);
/// ///
real erfcl(real x) { return erfc(x); } extern(D) real erfcl(real x) { return erfc(x); }
/// ///
double lgamma(double x); double lgamma(double x);
/// ///
float lgammaf(float x); float lgammaf(float x);
/// ///
real lgammal(real x) { return lgamma(x); } extern(D) real lgammal(real x) { return lgamma(x); }
/// ///
double tgamma(double x); double tgamma(double x);
/// ///
float tgammaf(float x); float tgammaf(float x);
/// ///
real tgammal(real x) { return tgamma(x); } extern(D) real tgammal(real x) { return tgamma(x); }
/// ///
pure double ceil(double x); pure double ceil(double x);
...@@ -2412,7 +2415,7 @@ else version (FreeBSD) ...@@ -2412,7 +2415,7 @@ else version (FreeBSD)
/// ///
long llrintf(float x); long llrintf(float x);
/// ///
long llrintl(real x) { return llrint(x); } extern(D) long llrintl(real x) { return llrint(x); }
/// ///
pure double round(double x); pure double round(double x);
...@@ -2532,13 +2535,13 @@ else version (NetBSD) ...@@ -2532,13 +2535,13 @@ else version (NetBSD)
/// ///
pure real rintl(real x); pure real rintl(real x);
/// ///
c_long lrintl(real x) { return cast(c_long)rintl(x); } extern(D) c_long lrintl(real x) { return cast(c_long)rintl(x); }
/// ///
pure real roundl(real x); pure real roundl(real x);
/// ///
c_long lroundl(real x) { return cast(c_long)roundl(x);} extern(D) c_long lroundl(real x) { return cast(c_long)roundl(x);}
/// ///
long llroundl(real x) { return cast(long)roundl(x);} extern(D) long llroundl(real x) { return cast(long)roundl(x);}
/// ///
pure real truncl(real x); pure real truncl(real x);
/// ///
...@@ -2558,7 +2561,7 @@ else version (NetBSD) ...@@ -2558,7 +2561,7 @@ else version (NetBSD)
/// ///
real nextafterl(real x, real y); real nextafterl(real x, real y);
/// ///
real nexttowardl(real x, real y) { return nexttoward(cast(double) x, cast(double) y); } extern(D) real nexttowardl(real x, real y) { return nexttoward(cast(double) x, cast(double) y); }
/// ///
real fdiml(real x, real y); real fdiml(real x, real y);
/// ///
...@@ -2740,13 +2743,13 @@ else version (NetBSD) ...@@ -2740,13 +2743,13 @@ else version (NetBSD)
/// ///
float log1pf(float x); float log1pf(float x);
/// ///
real log1pl(real x) { return log1p(cast(double) x); } extern(D) real log1pl(real x) { return log1p(cast(double) x); }
private enum real ONE_LN2 = 1 / 0x1.62e42fefa39ef358p-1L; private enum real ONE_LN2 = 1 / 0x1.62e42fefa39ef358p-1L;
/// ///
double log2(double x) { return log(x) * ONE_LN2; } extern(D) double log2(double x) { return log(x) * ONE_LN2; }
/// ///
float log2f(float x) { return logf(x) * ONE_LN2; } extern(D) float log2f(float x) { return logf(x) * ONE_LN2; }
/// ///
real log2l(real x) { return logl(x) * ONE_LN2; } real log2l(real x) { return logl(x) * ONE_LN2; }
...@@ -2804,7 +2807,7 @@ else version (NetBSD) ...@@ -2804,7 +2807,7 @@ else version (NetBSD)
/// ///
pure float erff(float x); pure float erff(float x);
/// ///
pure real erfl(real x) { return erf(cast(double) x); } extern(D) pure real erfl(real x) { return erf(cast(double) x); }
/// ///
double erfc(double x); double erfc(double x);
...@@ -2857,7 +2860,7 @@ else version (NetBSD) ...@@ -2857,7 +2860,7 @@ else version (NetBSD)
/// ///
long llrintf(float x); long llrintf(float x);
/// ///
long llrintl(real x) { return cast(long)rintl(x); } extern(D) long llrintl(real x) { return cast(long)rintl(x); }
/// ///
pure double round(double x); pure double round(double x);
...@@ -3988,399 +3991,399 @@ else version (CRuntime_UClibc) ...@@ -3988,399 +3991,399 @@ else version (CRuntime_UClibc)
/// ///
float acosf(float x); float acosf(float x);
/// ///
real acosl(real x) { return acos(cast(double) x); } extern(D) real acosl(real x) { return acos(cast(double) x); }
/// ///
double asin(double x); double asin(double x);
/// ///
float asinf(float x); float asinf(float x);
/// ///
real asinl(real x) { return asin(cast(double) x); } extern(D) real asinl(real x) { return asin(cast(double) x); }
/// ///
pure double atan(double x); pure double atan(double x);
/// ///
pure float atanf(float x); pure float atanf(float x);
/// ///
pure real atanl(real x) { return atan(cast(double) x); } extern(D) pure real atanl(real x) { return atan(cast(double) x); }
/// ///
double atan2(double y, double x); double atan2(double y, double x);
/// ///
float atan2f(float y, float x); float atan2f(float y, float x);
/// ///
real atan2l(real y, real x) { return atan2(cast(double) x, cast(double) y); } extern(D) real atan2l(real y, real x) { return atan2(cast(double) x, cast(double) y); }
/// ///
pure double cos(double x); pure double cos(double x);
/// ///
pure float cosf(float x); pure float cosf(float x);
/// ///
pure real cosl(real x) { return cos(cast(double) x); } extern(D) pure real cosl(real x) { return cos(cast(double) x); }
/// ///
pure double sin(double x); pure double sin(double x);
/// ///
pure float sinf(float x); pure float sinf(float x);
/// ///
pure real sinl(real x) { return sin(cast(double) x); } extern(D) pure real sinl(real x) { return sin(cast(double) x); }
/// ///
pure double tan(double x); pure double tan(double x);
/// ///
pure float tanf(float x); pure float tanf(float x);
/// ///
pure real tanl(real x) { return tan(cast(double) x); } extern(D) pure real tanl(real x) { return tan(cast(double) x); }
/// ///
double acosh(double x); double acosh(double x);
/// ///
float acoshf(float x); float acoshf(float x);
/// ///
real acoshl(real x) { return acosh(cast(double) x); } extern(D) real acoshl(real x) { return acosh(cast(double) x); }
/// ///
pure double asinh(double x); pure double asinh(double x);
/// ///
pure float asinhf(float x); pure float asinhf(float x);
/// ///
pure real asinhl(real x) { return asinh(cast(double) x); } extern(D) pure real asinhl(real x) { return asinh(cast(double) x); }
/// ///
double atanh(double x); double atanh(double x);
/// ///
float atanhf(float x); float atanhf(float x);
/// ///
real atanhl(real x) { return atanh(cast(double) x); } extern(D) real atanhl(real x) { return atanh(cast(double) x); }
/// ///
double cosh(double x); double cosh(double x);
/// ///
float coshf(float x); float coshf(float x);
/// ///
real coshl(real x) { return cosh(cast(double) x); } extern(D) real coshl(real x) { return cosh(cast(double) x); }
/// ///
double sinh(double x); double sinh(double x);
/// ///
float sinhf(float x); float sinhf(float x);
/// ///
real sinhl(real x) { return sinh(cast(double) x); } extern(D) real sinhl(real x) { return sinh(cast(double) x); }
/// ///
double tanh(double x); double tanh(double x);
/// ///
float tanhf(float x); float tanhf(float x);
/// ///
real tanhl(real x) { return tanh(cast(double) x); } extern(D) real tanhl(real x) { return tanh(cast(double) x); }
/// ///
double exp(double x); double exp(double x);
/// ///
float expf(float x); float expf(float x);
/// ///
real expl(real x) { return exp(cast(double) x); } extern(D) real expl(real x) { return exp(cast(double) x); }
/// ///
double exp2(double x); double exp2(double x);
/// ///
float exp2f(float x); float exp2f(float x);
/// ///
real exp2l(real x) { return exp2(cast(double) x); } extern(D) real exp2l(real x) { return exp2(cast(double) x); }
/// ///
double expm1(double x); double expm1(double x);
/// ///
float expm1f(float x); float expm1f(float x);
/// ///
real expm1l(real x) { return expm1(cast(double) x); } extern(D) real expm1l(real x) { return expm1(cast(double) x); }
/// ///
pure double frexp(double value, int* exp); pure double frexp(double value, int* exp);
/// ///
pure float frexpf(float value, int* exp); pure float frexpf(float value, int* exp);
/// ///
pure real frexpl(real value, int* exp) { return frexp(cast(double) value, exp); } extern(D) pure real frexpl(real value, int* exp) { return frexp(cast(double) value, exp); }
/// ///
int ilogb(double x); int ilogb(double x);
/// ///
int ilogbf(float x); int ilogbf(float x);
/// ///
int ilogbl(real x) { return ilogb(cast(double) x); } extern(D) int ilogbl(real x) { return ilogb(cast(double) x); }
/// ///
double ldexp(double x, int exp); double ldexp(double x, int exp);
/// ///
float ldexpf(float x, int exp); float ldexpf(float x, int exp);
/// ///
real ldexpl(real x, int exp) { return ldexp(cast(double) x, exp); } extern(D) real ldexpl(real x, int exp) { return ldexp(cast(double) x, exp); }
/// ///
double log(double x); double log(double x);
/// ///
float logf(float x); float logf(float x);
/// ///
real logl(real x) { return log(cast(double) x); } extern(D) real logl(real x) { return log(cast(double) x); }
/// ///
double log10(double x); double log10(double x);
/// ///
float log10f(float x); float log10f(float x);
/// ///
real log10l(real x) { return log10(cast(double) x); } extern(D) real log10l(real x) { return log10(cast(double) x); }
/// ///
double log1p(double x); double log1p(double x);
/// ///
float log1pf(float x); float log1pf(float x);
/// ///
real log1pl(real x) { return log1p(cast(double) x); } extern(D) real log1pl(real x) { return log1p(cast(double) x); }
/// ///
double log2(double x); double log2(double x);
/// ///
float log2f(float x); float log2f(float x);
/// ///
real log2l(real x) { return log2(cast(double) x); } extern(D) real log2l(real x) { return log2(cast(double) x); }
/// ///
double logb(double x); double logb(double x);
/// ///
float logbf(float x); float logbf(float x);
/// ///
real logbl(real x) { return logb(cast(double) x); } extern(D) real logbl(real x) { return logb(cast(double) x); }
/// ///
pure double modf(double value, double* iptr); pure double modf(double value, double* iptr);
/// ///
pure float modff(float value, float* iptr); pure float modff(float value, float* iptr);
/// ///
pure real modfl(real value, real *iptr) { return modf(cast(double) value, cast(double*) iptr); } extern(D) pure real modfl(real value, real *iptr) { return modf(cast(double) value, cast(double*) iptr); }
/// ///
double scalbn(double x, int n); double scalbn(double x, int n);
/// ///
float scalbnf(float x, int n); float scalbnf(float x, int n);
/// ///
real scalbnl(real x, int n) { return scalbln(cast(double) x, n); } extern(D) real scalbnl(real x, int n) { return scalbln(cast(double) x, n); }
/// ///
double scalbln(double x, c_long n); double scalbln(double x, c_long n);
/// ///
float scalblnf(float x, c_long n); float scalblnf(float x, c_long n);
/// ///
real scalblnl(real x, c_long n) { return scalbln(cast(double) x, n); } extern(D) real scalblnl(real x, c_long n) { return scalbln(cast(double) x, n); }
/// ///
pure double cbrt(double x); pure double cbrt(double x);
/// ///
pure float cbrtf(float x); pure float cbrtf(float x);
/// ///
pure real cbrtl(real x) { return cbrt(cast(double) x); } extern(D) pure real cbrtl(real x) { return cbrt(cast(double) x); }
/// ///
pure double fabs(double x); pure double fabs(double x);
/// ///
pure float fabsf(float x); pure float fabsf(float x);
/// ///
pure real fabsl(real x) { return fabs(cast(double) x); } extern(D) pure real fabsl(real x) { return fabs(cast(double) x); }
/// ///
double hypot(double x, double y); double hypot(double x, double y);
/// ///
float hypotf(float x, float y); float hypotf(float x, float y);
/// ///
real hypotl(real x, real y) { return hypot(cast(double) x, cast(double) y); } extern(D) real hypotl(real x, real y) { return hypot(cast(double) x, cast(double) y); }
/// ///
double pow(double x, double y); double pow(double x, double y);
/// ///
float powf(float x, float y); float powf(float x, float y);
/// ///
real powl(real x, real y) { return pow(cast(double) x, cast(double) y); } extern(D) real powl(real x, real y) { return pow(cast(double) x, cast(double) y); }
/// ///
double sqrt(double x); double sqrt(double x);
/// ///
float sqrtf(float x); float sqrtf(float x);
/// ///
real sqrtl(real x) { return sqrt(cast(double) x); } extern(D) real sqrtl(real x) { return sqrt(cast(double) x); }
/// ///
pure double erf(double x); pure double erf(double x);
/// ///
pure float erff(float x); pure float erff(float x);
/// ///
pure real erfl(real x) { return erf(cast(double) x); } extern(D) pure real erfl(real x) { return erf(cast(double) x); }
/// ///
double erfc(double x); double erfc(double x);
/// ///
float erfcf(float x); float erfcf(float x);
/// ///
real erfcl(real x) { return erfc(cast(double) x); } extern(D) real erfcl(real x) { return erfc(cast(double) x); }
/// ///
double lgamma(double x); double lgamma(double x);
/// ///
float lgammaf(float x); float lgammaf(float x);
/// ///
real lgammal(real x) { return lgamma(cast(double) x); } extern(D) real lgammal(real x) { return lgamma(cast(double) x); }
/// ///
double tgamma(double x); double tgamma(double x);
/// ///
float tgammaf(float x); float tgammaf(float x);
/// ///
real tgammal(real x) { return tgamma(cast(double) x); } extern(D) real tgammal(real x) { return tgamma(cast(double) x); }
/// ///
pure double ceil(double x); pure double ceil(double x);
/// ///
pure float ceilf(float x); pure float ceilf(float x);
/// ///
pure real ceill(real x) { return ceil(cast(double) x); } extern(D) pure real ceill(real x) { return ceil(cast(double) x); }
/// ///
pure double floor(double x); pure double floor(double x);
/// ///
pure float floorf(float x); pure float floorf(float x);
/// ///
pure real floorl(real x) { return floor(cast(double) x); } extern(D) pure real floorl(real x) { return floor(cast(double) x); }
/// ///
pure double nearbyint(double x); pure double nearbyint(double x);
/// ///
pure float nearbyintf(float x); pure float nearbyintf(float x);
/// ///
pure real nearbyintl(real x) { return nearbyint(cast(double) x); } extern(D) pure real nearbyintl(real x) { return nearbyint(cast(double) x); }
/// ///
pure double rint(double x); pure double rint(double x);
/// ///
pure float rintf(float x); pure float rintf(float x);
/// ///
pure real rintl(real x) { return rint(cast(double) x); } extern(D) pure real rintl(real x) { return rint(cast(double) x); }
/// ///
c_long lrint(double x); c_long lrint(double x);
/// ///
c_long lrintf(float x); c_long lrintf(float x);
/// ///
c_long lrintl(real x) { return lrint(cast(double) x); } extern(D) c_long lrintl(real x) { return lrint(cast(double) x); }
/// ///
long llrint(double x); long llrint(double x);
/// ///
long llrintf(float x); long llrintf(float x);
/// ///
long llrintl(real x) { return llrint(cast(double) x); } extern(D) long llrintl(real x) { return llrint(cast(double) x); }
/// ///
pure double round(double x); pure double round(double x);
/// ///
pure float roundf(float x); pure float roundf(float x);
/// ///
pure real roundl(real x) { return round(cast(double) x); } extern(D) pure real roundl(real x) { return round(cast(double) x); }
/// ///
c_long lround(double x); c_long lround(double x);
/// ///
c_long lroundf(float x); c_long lroundf(float x);
/// ///
c_long lroundl(real x) { return lround(cast(double) x); } extern(D) c_long lroundl(real x) { return lround(cast(double) x); }
/// ///
long llround(double x); long llround(double x);
/// ///
long llroundf(float x); long llroundf(float x);
/// ///
long llroundl(real x) { return llround(cast(double) x); } extern(D) long llroundl(real x) { return llround(cast(double) x); }
/// ///
pure double trunc(double x); pure double trunc(double x);
/// ///
pure float truncf(float x); pure float truncf(float x);
/// ///
pure real truncl(real x) { return trunc(cast(double) x); } extern(D) pure real truncl(real x) { return trunc(cast(double) x); }
/// ///
double fmod(double x, double y); double fmod(double x, double y);
/// ///
float fmodf(float x, float y); float fmodf(float x, float y);
/// ///
real fmodl(real x, real y) { return fmod(cast(double) x, cast(double) y); } extern(D) real fmodl(real x, real y) { return fmod(cast(double) x, cast(double) y); }
/// ///
double remainder(double x, double y); double remainder(double x, double y);
/// ///
float remainderf(float x, float y); float remainderf(float x, float y);
/// ///
real remainderl(real x, real y) { return remainder(cast(double) x, cast(double) y); } extern(D) real remainderl(real x, real y) { return remainder(cast(double) x, cast(double) y); }
/// ///
double remquo(double x, double y, int* quo); double remquo(double x, double y, int* quo);
/// ///
float remquof(float x, float y, int* quo); float remquof(float x, float y, int* quo);
/// ///
real remquol(real x, real y, int* quo) { return remquo(cast(double) x, cast(double) y, quo); } extern(D) real remquol(real x, real y, int* quo) { return remquo(cast(double) x, cast(double) y, quo); }
/// ///
pure double copysign(double x, double y); pure double copysign(double x, double y);
/// ///
pure float copysignf(float x, float y); pure float copysignf(float x, float y);
/// ///
pure real copysignl(real x, real y) { return copysign(cast(double) x, cast(double) y); } extern(D) pure real copysignl(real x, real y) { return copysign(cast(double) x, cast(double) y); }
/// ///
pure double nan(char* tagp); pure double nan(char* tagp);
/// ///
pure float nanf(char* tagp); pure float nanf(char* tagp);
/// ///
pure real nanl(char* tagp) { return nan(tagp); } extern(D) pure real nanl(char* tagp) { return nan(tagp); }
/// ///
double nextafter(double x, double y); double nextafter(double x, double y);
/// ///
float nextafterf(float x, float y); float nextafterf(float x, float y);
/// ///
real nextafterl(real x, real y) { return nextafter(cast(double) x, cast(double) y); } extern(D) real nextafterl(real x, real y) { return nextafter(cast(double) x, cast(double) y); }
/// ///
double nexttoward(double x, real y); double nexttoward(double x, real y);
/// ///
float nexttowardf(float x, real y); float nexttowardf(float x, real y);
/// ///
real nexttowardl(real x, real y) { return nexttoward(cast(double) x, cast(double) y); } extern(D) real nexttowardl(real x, real y) { return nexttoward(cast(double) x, cast(double) y); }
/// ///
double fdim(double x, double y); double fdim(double x, double y);
/// ///
float fdimf(float x, float y); float fdimf(float x, float y);
/// ///
real fdiml(real x, real y) { return fdim(cast(double) x, cast(double) y); } extern(D) real fdiml(real x, real y) { return fdim(cast(double) x, cast(double) y); }
/// ///
pure double fmax(double x, double y); pure double fmax(double x, double y);
/// ///
pure float fmaxf(float x, float y); pure float fmaxf(float x, float y);
/// ///
pure real fmaxl(real x, real y) { return fmax(cast(double) x, cast(double) y); } extern(D) pure real fmaxl(real x, real y) { return fmax(cast(double) x, cast(double) y); }
/// ///
pure double fmin(double x, double y); pure double fmin(double x, double y);
/// ///
pure float fminf(float x, float y); pure float fminf(float x, float y);
/// ///
pure real fminl(real x, real y) { return fmin(cast(double) x, cast(double) y); } extern(D) pure real fminl(real x, real y) { return fmin(cast(double) x, cast(double) y); }
/// ///
pure double fma(double x, double y, double z); pure double fma(double x, double y, double z);
/// ///
pure float fmaf(float x, float y, float z); pure float fmaf(float x, float y, float z);
/// ///
pure real fmal(real x, real y, real z) { return fma(cast(double) x, cast(double) y, cast(double) z); } extern(D) pure real fmal(real x, real y, real z) { return fma(cast(double) x, cast(double) y, cast(double) z); }
} }
else else
{ {
......
...@@ -120,6 +120,13 @@ version (CRuntime_Glibc) ...@@ -120,6 +120,13 @@ version (CRuntime_Glibc)
enum F_SETLK = 6; enum F_SETLK = 6;
enum F_SETLKW = 7; enum F_SETLKW = 7;
} }
else version (SystemZ)
{
static assert(off_t.sizeof == 8);
enum F_GETLK = 5;
enum F_SETLK = 6;
enum F_SETLKW = 7;
}
else else
static if ( __USE_FILE_OFFSET64 ) static if ( __USE_FILE_OFFSET64 )
{ {
......
...@@ -239,7 +239,8 @@ else version (Darwin) ...@@ -239,7 +239,8 @@ else version (Darwin)
// POSIX_SPAWN_SETSCHEDPARAM = 0x10, // not supported // POSIX_SPAWN_SETSCHEDPARAM = 0x10, // not supported
// POSIX_SPAWN_SETSCHEDULER = 0x20, // ditto // POSIX_SPAWN_SETSCHEDULER = 0x20, // ditto
POSIX_SPAWN_SETEXEC = 0x40, POSIX_SPAWN_SETEXEC = 0x40,
POSIX_SPAWN_START_SUSPENDED = 0x80 POSIX_SPAWN_START_SUSPENDED = 0x80,
POSIX_SPAWN_CLOEXEC_DEFAULT = 0x4000
} }
alias posix_spawnattr_t = void*; alias posix_spawnattr_t = void*;
alias posix_spawn_file_actions_t = void*; alias posix_spawn_file_actions_t = void*;
...@@ -288,6 +289,8 @@ else version (NetBSD) ...@@ -288,6 +289,8 @@ else version (NetBSD)
uint len; uint len;
posix_spawn_file_actions_entry_t* fae; posix_spawn_file_actions_entry_t* fae;
} }
alias posix_spawnattr_t = posix_spawnattr;
alias posix_spawn_file_actions_t = posix_spawn_file_actions;
} }
else version (OpenBSD) else version (OpenBSD)
{ {
......
...@@ -799,12 +799,12 @@ version (CRuntime_Glibc) ...@@ -799,12 +799,12 @@ version (CRuntime_Glibc)
alias __ino_t = c_ulong; alias __ino_t = c_ulong;
alias __ino64_t = ulong; alias __ino64_t = ulong;
alias __mode_t = uint; alias __mode_t = uint;
alias __nlink_t = uint; alias __nlink_t = ulong;
alias __uid_t = uint; alias __uid_t = uint;
alias __gid_t = uint; alias __gid_t = uint;
alias __off_t = c_long; alias __off_t = c_long;
alias __off64_t = long; alias __off64_t = long;
alias __blksize_t = int; alias __blksize_t = c_long;
alias __blkcnt_t = c_long; alias __blkcnt_t = c_long;
alias __blkcnt64_t = long; alias __blkcnt64_t = long;
alias __timespec = timespec; alias __timespec = timespec;
......
...@@ -1187,7 +1187,7 @@ class Thread ...@@ -1187,7 +1187,7 @@ class Thread
} }
else else
{ {
// NOTE: pthread_setschedprio is not implemented on Darwin or FreeBSD, so use // NOTE: pthread_setschedprio is not implemented on Darwin, FreeBSD or DragonFlyBSD, so use
// the more complicated get/set sequence below. // the more complicated get/set sequence below.
int policy; int policy;
sched_param param; sched_param param;
...@@ -3202,8 +3202,11 @@ extern (C) @nogc nothrow ...@@ -3202,8 +3202,11 @@ extern (C) @nogc nothrow
version (CRuntime_Glibc) int pthread_getattr_np(pthread_t thread, pthread_attr_t* attr); version (CRuntime_Glibc) int pthread_getattr_np(pthread_t thread, pthread_attr_t* attr);
version (FreeBSD) int pthread_attr_get_np(pthread_t thread, pthread_attr_t* attr); version (FreeBSD) int pthread_attr_get_np(pthread_t thread, pthread_attr_t* attr);
version (NetBSD) int pthread_attr_get_np(pthread_t thread, pthread_attr_t* attr); version (NetBSD) int pthread_attr_get_np(pthread_t thread, pthread_attr_t* attr);
version (DragonFlyBSD) int pthread_attr_get_np(pthread_t thread, pthread_attr_t* attr);
version (Solaris) int thr_stksegment(stack_t* stk); version (Solaris) int thr_stksegment(stack_t* stk);
version (CRuntime_Bionic) int pthread_getattr_np(pthread_t thid, pthread_attr_t* attr); version (CRuntime_Bionic) int pthread_getattr_np(pthread_t thid, pthread_attr_t* attr);
version (CRuntime_Musl) int pthread_getattr_np(pthread_t, pthread_attr_t*);
version (CRuntime_UClibc) int pthread_getattr_np(pthread_t thread, pthread_attr_t* attr);
} }
...@@ -3292,6 +3295,19 @@ private void* getStackBottom() nothrow @nogc ...@@ -3292,6 +3295,19 @@ private void* getStackBottom() nothrow @nogc
addr += size; addr += size;
return addr; return addr;
} }
else version (DragonFlyBSD)
{
pthread_attr_t attr;
void* addr; size_t size;
pthread_attr_init(&attr);
pthread_attr_get_np(pthread_self(), &attr);
pthread_attr_getstack(&attr, &addr, &size);
pthread_attr_destroy(&attr);
version (StackGrowsDown)
addr += size;
return addr;
}
else version (Solaris) else version (Solaris)
{ {
stack_t stk; stack_t stk;
...@@ -3311,6 +3327,30 @@ private void* getStackBottom() nothrow @nogc ...@@ -3311,6 +3327,30 @@ private void* getStackBottom() nothrow @nogc
addr += size; addr += size;
return addr; return addr;
} }
else version (CRuntime_Musl)
{
pthread_attr_t attr;
void* addr; size_t size;
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstack(&attr, &addr, &size);
pthread_attr_destroy(&attr);
version (StackGrowsDown)
addr += size;
return addr;
}
else version (CRuntime_UClibc)
{
pthread_attr_t attr;
void* addr; size_t size;
pthread_getattr_np(pthread_self(), &attr);
pthread_attr_getstack(&attr, &addr, &size);
pthread_attr_destroy(&attr);
version (StackGrowsDown)
addr += size;
return addr;
}
else else
static assert(false, "Platform not supported."); static assert(false, "Platform not supported.");
} }
...@@ -4569,8 +4609,10 @@ private: ...@@ -4569,8 +4609,10 @@ private:
version (Posix) import core.sys.posix.sys.mman; // mmap version (Posix) import core.sys.posix.sys.mman; // mmap
version (FreeBSD) import core.sys.freebsd.sys.mman : MAP_ANON; version (FreeBSD) import core.sys.freebsd.sys.mman : MAP_ANON;
version (NetBSD) import core.sys.netbsd.sys.mman : MAP_ANON; version (NetBSD) import core.sys.netbsd.sys.mman : MAP_ANON;
version (DragonFlyBSD) import core.sys.dragonflybsd.sys.mman : MAP_ANON;
version (CRuntime_Glibc) import core.sys.linux.sys.mman : MAP_ANON; version (CRuntime_Glibc) import core.sys.linux.sys.mman : MAP_ANON;
version (Darwin) import core.sys.darwin.sys.mman : MAP_ANON; version (Darwin) import core.sys.darwin.sys.mman : MAP_ANON;
version (CRuntime_UClibc) import core.sys.linux.sys.mman : MAP_ANON;
static if ( __traits( compiles, mmap ) ) static if ( __traits( compiles, mmap ) )
{ {
...@@ -5612,6 +5654,27 @@ version (FreeBSD) unittest ...@@ -5612,6 +5654,27 @@ version (FreeBSD) unittest
thr.join(); thr.join();
} }
version (DragonFlyBSD) unittest
{
static void loop()
{
pthread_attr_t attr;
pthread_attr_init(&attr);
auto thr = pthread_self();
foreach (i; 0 .. 50)
pthread_attr_get_np(thr, &attr);
pthread_attr_destroy(&attr);
}
auto thr = new Thread(&loop).start();
foreach (i; 0 .. 50)
{
thread_suspendAll();
thread_resumeAll();
}
thr.join();
}
unittest unittest
{ {
// use >PAGESIZE to avoid stack overflow (e.g. in an syscall) // use >PAGESIZE to avoid stack overflow (e.g. in an syscall)
......
...@@ -272,7 +272,7 @@ extern (C) int _aApplyRwc1(in wchar[] aa, dg_t dg) ...@@ -272,7 +272,7 @@ extern (C) int _aApplyRwc1(in wchar[] aa, dg_t dg)
if (d & ~0x7F) if (d & ~0x7F)
{ {
char[4] buf; char[4] buf = void;
auto b = toUTF8(buf, d); auto b = toUTF8(buf, d);
foreach (char c2; b) foreach (char c2; b)
...@@ -348,7 +348,7 @@ extern (C) int _aApplyRdc1(in dchar[] aa, dg_t dg) ...@@ -348,7 +348,7 @@ extern (C) int _aApplyRdc1(in dchar[] aa, dg_t dg)
if (d & ~0x7F) if (d & ~0x7F)
{ {
char[4] buf; char[4] buf = void;
auto b = toUTF8(buf, d); auto b = toUTF8(buf, d);
foreach (char c2; b) foreach (char c2; b)
...@@ -741,7 +741,7 @@ extern (C) int _aApplyRwc2(in wchar[] aa, dg2_t dg) ...@@ -741,7 +741,7 @@ extern (C) int _aApplyRwc2(in wchar[] aa, dg2_t dg)
if (d & ~0x7F) if (d & ~0x7F)
{ {
char[4] buf; char[4] buf = void;
auto b = toUTF8(buf, d); auto b = toUTF8(buf, d);
foreach (char c2; b) foreach (char c2; b)
...@@ -819,7 +819,7 @@ extern (C) int _aApplyRdc2(in dchar[] aa, dg2_t dg) ...@@ -819,7 +819,7 @@ extern (C) int _aApplyRdc2(in dchar[] aa, dg2_t dg)
if (d & ~0x7F) if (d & ~0x7F)
{ {
char[4] buf; char[4] buf = void;
auto b = toUTF8(buf, d); auto b = toUTF8(buf, d);
foreach (char c2; b) foreach (char c2; b)
......
...@@ -115,7 +115,7 @@ string rt_envvarsOption(string opt, scope rt_configCallBack dg) @nogc nothrow ...@@ -115,7 +115,7 @@ string rt_envvarsOption(string opt, scope rt_configCallBack dg) @nogc nothrow
if (opt.length >= 32) if (opt.length >= 32)
assert(0); assert(0);
char[40] var; char[40] var = void;
var[0 .. 4] = "DRT_"; var[0 .. 4] = "DRT_";
foreach (i, c; opt) foreach (i, c; opt)
var[4 + i] = cast(char) toupper(c); var[4 + i] = cast(char) toupper(c);
......
...@@ -42,6 +42,10 @@ version (NetBSD) ...@@ -42,6 +42,10 @@ version (NetBSD)
{ {
import core.stdc.fenv; import core.stdc.fenv;
} }
version (DragonFlyBSD)
{
import core.stdc.fenv;
}
extern (C) void _d_monitor_staticctor(); extern (C) void _d_monitor_staticctor();
extern (C) void _d_monitor_staticdtor(); extern (C) void _d_monitor_staticdtor();
......
...@@ -193,7 +193,8 @@ else version (Windows) ...@@ -193,7 +193,8 @@ else version (Windows)
{ {
pragma(lib, "snn.lib"); pragma(lib, "snn.lib");
} }
import core.sys.windows.windows; import core.sys.windows.winbase /+: CRITICAL_SECTION, DeleteCriticalSection,
EnterCriticalSection, InitializeCriticalSection, LeaveCriticalSection+/;
alias Mutex = CRITICAL_SECTION; alias Mutex = CRITICAL_SECTION;
...@@ -206,6 +207,7 @@ else version (Posix) ...@@ -206,6 +207,7 @@ else version (Posix)
{ {
import core.sys.posix.pthread; import core.sys.posix.pthread;
@nogc:
alias Mutex = pthread_mutex_t; alias Mutex = pthread_mutex_t;
__gshared pthread_mutexattr_t gattr; __gshared pthread_mutexattr_t gattr;
...@@ -244,17 +246,17 @@ struct Monitor ...@@ -244,17 +246,17 @@ struct Monitor
private: private:
@property ref shared(Monitor*) monitor(Object h) pure nothrow @property ref shared(Monitor*) monitor(Object h) pure nothrow @nogc
{ {
return *cast(shared Monitor**)&h.__monitor; return *cast(shared Monitor**)&h.__monitor;
} }
private shared(Monitor)* getMonitor(Object h) pure private shared(Monitor)* getMonitor(Object h) pure @nogc
{ {
return atomicLoad!(MemoryOrder.acq)(h.monitor); return atomicLoad!(MemoryOrder.acq)(h.monitor);
} }
void setMonitor(Object h, shared(Monitor)* m) pure void setMonitor(Object h, shared(Monitor)* m) pure @nogc
{ {
atomicStore!(MemoryOrder.rel)(h.monitor, m); atomicStore!(MemoryOrder.rel)(h.monitor, m);
} }
...@@ -296,7 +298,7 @@ shared(Monitor)* ensureMonitor(Object h) ...@@ -296,7 +298,7 @@ shared(Monitor)* ensureMonitor(Object h)
} }
} }
void deleteMonitor(Monitor* m) void deleteMonitor(Monitor* m) @nogc
{ {
destroyMutex(&m.mtx); destroyMutex(&m.mtx);
free(m); free(m);
......
...@@ -75,6 +75,21 @@ else version (FreeBSD) ...@@ -75,6 +75,21 @@ else version (FreeBSD)
return a; return a;
} }
} }
else version (DragonFlyBSD)
{
alias extern (C) int function(scope void *, scope const void *, scope const void *) Cmp;
extern (C) void qsort_r(scope void *base, size_t nmemb, size_t size, scope void *thunk, Cmp cmp);
extern (C) void[] _adSort(return scope void[] a, TypeInfo ti)
{
extern (C) int cmp(scope void* ti, scope const void* p1, scope const void* p2)
{
return (cast(TypeInfo)ti).compare(p1, p2);
}
qsort_r(a.ptr, a.length, ti.tsize, cast(void*)ti, &cmp);
return a;
}
}
else version (Darwin) else version (Darwin)
{ {
alias extern (C) int function(scope void *, scope const void *, scope const void *) Cmp; alias extern (C) int function(scope void *, scope const void *, scope const void *) Cmp;
...@@ -90,6 +105,21 @@ else version (Darwin) ...@@ -90,6 +105,21 @@ else version (Darwin)
return a; return a;
} }
} }
else version (CRuntime_UClibc)
{
alias extern (C) int function(scope const void *, scope const void *, scope void *) __compar_d_fn_t;
extern (C) void qsort_r(scope void *base, size_t nmemb, size_t size, __compar_d_fn_t cmp, scope void *arg);
extern (C) void[] _adSort(return scope void[] a, TypeInfo ti)
{
extern (C) int cmp(scope const void* p1, scope const void* p2, scope void* ti)
{
return (cast(TypeInfo)ti).compare(p1, p2);
}
qsort_r(a.ptr, a.length, ti.tsize, &cmp, cast(void*)ti);
return a;
}
}
else else
{ {
private TypeInfo tiglobal; private TypeInfo tiglobal;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment