Download Reference Manual
The Developer's Library for D
About Wiki Forums Source Search Contact

Ticket #680: withfloats

File withfloats, 5.3 kB (added by d3z, 11 months ago)

Fix for 'float' varargs.

Line 
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