| 1 |
commit 24eff817d5f7f8d6a98dfb9f400884f6fd338b56 |
|---|
| 2 |
Author: David Brown <dlang@davidb.org> |
|---|
| 3 |
Date: Sat Oct 13 09:38:01 2007 -0700 |
|---|
| 4 |
|
|---|
| 5 |
Floating arguments. |
|---|
| 6 |
|
|---|
| 7 |
diff --git a/tango/text/convert/Layout.d b/tango/text/convert/Layout.d |
|---|
| 8 |
index d58df9b..0a8f053 100644 |
|---|
| 9 |
--- a/tango/text/convert/Layout.d |
|---|
| 10 |
+++ b/tango/text/convert/Layout.d |
|---|
| 11 |
@@ -189,41 +189,75 @@ class Layout(T) |
|---|
| 12 |
|
|---|
| 13 |
version (X86_64) |
|---|
| 14 |
{ |
|---|
| 15 |
+ /* TODO: These don't need to be separate like this. */ |
|---|
| 16 |
Arg[64] arglist = void; |
|---|
| 17 |
int[64] intargs = void; |
|---|
| 18 |
byte[64] byteargs = void; |
|---|
| 19 |
long[64] longargs = void; |
|---|
| 20 |
short[64] shortargs = void; |
|---|
| 21 |
void[][64] voidargs = void; |
|---|
| 22 |
+ float[64] floatargs = void; |
|---|
| 23 |
+ double[64] doubleargs = void; |
|---|
| 24 |
+ real[64] realargs = void; |
|---|
| 25 |
|
|---|
| 26 |
foreach (i, arg; arguments) |
|---|
| 27 |
{ |
|---|
| 28 |
arglist[i] = args.ptr; |
|---|
| 29 |
- switch (arg.tsize) |
|---|
| 30 |
- { |
|---|
| 31 |
- case 1: |
|---|
| 32 |
- byteargs[i] = va_arg!(byte)(args); |
|---|
| 33 |
- arglist[i] = &byteargs[i]; |
|---|
| 34 |
- break; |
|---|
| 35 |
- case 2: |
|---|
| 36 |
- shortargs[i] = va_arg!(short)(args); |
|---|
| 37 |
- arglist[i] = &shortargs[i]; |
|---|
| 38 |
- break; |
|---|
| 39 |
- case 4: |
|---|
| 40 |
- intargs[i] = va_arg!(int)(args); |
|---|
| 41 |
- arglist[i] = &intargs[i]; |
|---|
| 42 |
- break; |
|---|
| 43 |
- case 8: |
|---|
| 44 |
- longargs[i] = va_arg!(long)(args); |
|---|
| 45 |
- arglist[i] = &longargs[i]; |
|---|
| 46 |
- break; |
|---|
| 47 |
- case 16: |
|---|
| 48 |
- voidargs[i] = va_arg!(void[])(args); |
|---|
| 49 |
- arglist[i] = &voidargs[i]; |
|---|
| 50 |
- break; |
|---|
| 51 |
- default: |
|---|
| 52 |
- assert (false, "Unknown size: " ~ Integer.toUtf8 (arg.tsize)); |
|---|
| 53 |
- } |
|---|
| 54 |
+ /* Since floating point types don't live on |
|---|
| 55 |
+ * the stack, they must be accessed by the |
|---|
| 56 |
+ * correct type. */ |
|---|
| 57 |
+ bool converted = false; |
|---|
| 58 |
+ switch (arg.classinfo.name[9]) |
|---|
| 59 |
+ { |
|---|
| 60 |
+ case TypeCode.FLOAT: |
|---|
| 61 |
+ floatargs[i] = va_arg!(float)(args); |
|---|
| 62 |
+ arglist[i] = &floatargs[i]; |
|---|
| 63 |
+ converted = true; |
|---|
| 64 |
+ break; |
|---|
| 65 |
+ |
|---|
| 66 |
+ case TypeCode.DOUBLE: |
|---|
| 67 |
+ doubleargs[i] = va_arg!(double)(args); |
|---|
| 68 |
+ arglist[i] = &doubleargs[i]; |
|---|
| 69 |
+ converted = true; |
|---|
| 70 |
+ break; |
|---|
| 71 |
+ |
|---|
| 72 |
+ case TypeCode.REAL: |
|---|
| 73 |
+ realargs[i] = va_arg!(real)(args); |
|---|
| 74 |
+ arglist[i] = &realargs[i]; |
|---|
| 75 |
+ converted = true; |
|---|
| 76 |
+ break; |
|---|
| 77 |
+ |
|---|
| 78 |
+ default: |
|---|
| 79 |
+ break; |
|---|
| 80 |
+ } |
|---|
| 81 |
+ if (!converted) |
|---|
| 82 |
+ { |
|---|
| 83 |
+ switch (arg.tsize) |
|---|
| 84 |
+ { |
|---|
| 85 |
+ case 1: |
|---|
| 86 |
+ byteargs[i] = va_arg!(byte)(args); |
|---|
| 87 |
+ arglist[i] = &byteargs[i]; |
|---|
| 88 |
+ break; |
|---|
| 89 |
+ case 2: |
|---|
| 90 |
+ shortargs[i] = va_arg!(short)(args); |
|---|
| 91 |
+ arglist[i] = &shortargs[i]; |
|---|
| 92 |
+ break; |
|---|
| 93 |
+ case 4: |
|---|
| 94 |
+ intargs[i] = va_arg!(int)(args); |
|---|
| 95 |
+ arglist[i] = &intargs[i]; |
|---|
| 96 |
+ break; |
|---|
| 97 |
+ case 8: |
|---|
| 98 |
+ longargs[i] = va_arg!(long)(args); |
|---|
| 99 |
+ arglist[i] = &longargs[i]; |
|---|
| 100 |
+ break; |
|---|
| 101 |
+ case 16: |
|---|
| 102 |
+ voidargs[i] = va_arg!(void[])(args); |
|---|
| 103 |
+ arglist[i] = &voidargs[i]; |
|---|
| 104 |
+ break; |
|---|
| 105 |
+ default: |
|---|
| 106 |
+ assert (false, "Unknown size: " ~ Integer.toUtf8 (arg.tsize)); |
|---|
| 107 |
+ } |
|---|
| 108 |
+ } |
|---|
| 109 |
} |
|---|
| 110 |
} |
|---|
| 111 |
else |
|---|