Win64 fixes

This commit is contained in:
Walter Bright 2012-09-11 19:39:15 -07:00
parent 2346ef9a68
commit 18f7d60f0d
3 changed files with 49 additions and 17 deletions

View file

@ -30,7 +30,7 @@ version(unittest) {
import core.exception; import core.exception;
} }
version (Windows) version (DigitalMars) version (Win32) version (DigitalMars)
{ {
version = DigitalMarsC; version = DigitalMarsC;
} }
@ -4656,6 +4656,8 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
//doFormat(putc, (&valti)[0 .. 1], p); //doFormat(putc, (&valti)[0 .. 1], p);
version(X86) version(X86)
argptr = p; argptr = p;
else version(Win64)
argptr = p;
else version(X86_64) else version(X86_64)
{ {
__va_list va; __va_list va;
@ -4706,6 +4708,8 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
//doFormat(putc, (&keyti)[0..1], pkey); //doFormat(putc, (&keyti)[0..1], pkey);
version (X86) version (X86)
argptr = pkey; argptr = pkey;
else version (Win64)
argptr = pkey;
else version (X86_64) else version (X86_64)
{ __va_list va; { __va_list va;
va.stack_args = pkey; va.stack_args = pkey;
@ -4721,6 +4725,8 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
//doFormat(putc, (&valti)[0..1], pvalue); //doFormat(putc, (&valti)[0..1], pvalue);
version (X86) version (X86)
argptr = pvalue; argptr = pvalue;
else version (Win64)
argptr = pvalue;
else version (X86_64) else version (X86_64)
{ __va_list va2; { __va_list va2;
va2.stack_args = pvalue; va2.stack_args = pvalue;
@ -4874,6 +4880,8 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
case Mangle.Tsarray: case Mangle.Tsarray:
version (X86) version (X86)
putArray(argptr, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next); putArray(argptr, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next);
else version (Win64)
putArray(argptr, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next);
else else
putArray((cast(__va_list*)argptr).stack_args, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next); putArray((cast(__va_list*)argptr).stack_args, (cast(TypeInfo_StaticArray)ti).len, cast()(cast(TypeInfo_StaticArray)ti).next);
return; return;
@ -4973,6 +4981,11 @@ void doFormat(void delegate(dchar) putc, TypeInfo[] arguments, va_list argptr)
s = tis.xtoString(argptr); s = tis.xtoString(argptr);
argptr += (tis.tsize() + 3) & ~3; argptr += (tis.tsize() + 3) & ~3;
} }
else version(Win64)
{
s = tis.xtoString(argptr);
argptr += (tis.tsize() + 3) & ~3;
}
else version (X86_64) else version (X86_64)
{ {
void[32] parmn = void; // place to copy struct if passed in regs void[32] parmn = void; // place to copy struct if passed in regs

View file

@ -262,7 +262,7 @@ class OutBuffer
auto psize = buffer.length; auto psize = buffer.length;
for (;;) for (;;)
{ {
version(Win32) version(Windows)
{ {
count = _vsnprintf(p,psize,f,args); count = _vsnprintf(p,psize,f,args);
if (count != -1) if (count != -1)
@ -270,7 +270,7 @@ class OutBuffer
psize *= 2; psize *= 2;
p = cast(char *) alloca(psize); // buffer too small, try again with larger size p = cast(char *) alloca(psize); // buffer too small, try again with larger size
} }
version(Posix) else version(Posix)
{ {
count = vsnprintf(p,psize,f,args); count = vsnprintf(p,psize,f,args);
if (count == -1) if (count == -1)
@ -286,6 +286,10 @@ class OutBuffer
+/ +/
p = cast(char *) alloca(psize); // buffer too small, try again with larger size p = cast(char *) alloca(psize); // buffer too small, try again with larger size
} }
else
{
static assert(0);
}
} }
write(cast(ubyte[]) p[0 .. count]); write(cast(ubyte[]) p[0 .. count]);
/+ /+
@ -301,21 +305,29 @@ class OutBuffer
* Append output of C's printf() to internal buffer. * Append output of C's printf() to internal buffer.
*/ */
version (X86_64)
void printf(string format, ...) void printf(string format, ...)
{ {
va_list ap; version (Win64)
va_start(ap, __va_argsave); {
vprintf(format, ap); va_list ap;
va_end(ap); ap = cast(va_list)&format;
} ap += format.sizeof;
else vprintf(format, ap);
void printf(string format, ...) }
{ else version (X86_64)
va_list ap; {
ap = cast(va_list)&format; va_list ap;
ap += format.sizeof; va_start(ap, __va_argsave);
vprintf(format, ap); vprintf(format, ap);
va_end(ap);
}
else
{
va_list ap;
ap = cast(va_list)&format;
ap += format.sizeof;
vprintf(format, ap);
}
} }
/***************************************** /*****************************************

View file

@ -1164,7 +1164,14 @@ class Stream : InputStream, OutputStream {
// writes data to stream using printf() syntax, // writes data to stream using printf() syntax,
// returns number of bytes written // returns number of bytes written
version (X86_64) version (Win64)
size_t printf(const(char)[] format, ...) {
va_list ap;
ap = cast(va_list) &format;
ap += format.sizeof;
return vprintf(format, ap);
}
else version (X86_64)
size_t printf(const(char)[] format, ...) { size_t printf(const(char)[] format, ...) {
va_list ap; va_list ap;
va_start(ap, __va_argsave); va_start(ap, __va_argsave);