annotate lphobos/std/stdarg.d @ 70:fb265a6efea1 trunk

[svn r74] Fixed passing types with different alignment to D-style variadic functions. Fixed casting integer to pointer.
author lindquist
date Sun, 28 Oct 2007 19:33:50 +0100
parents d4a678905d5e
children 5825d48b27d1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
65
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
1
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
2 /*
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
3 * Placed in public domain.
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
4 * Written by Hauke Duden and Walter Bright
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
5 */
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
6
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
7 /* This is for use with variable argument lists with extern(D) linkage. */
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
8
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
9 module std.stdarg;
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
10
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
11 alias void* va_list;
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
12
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
13 T va_arg(T)(inout va_list vp)
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
14 {
70
fb265a6efea1 [svn r74] Fixed passing types with different alignment to D-style variadic functions.
lindquist
parents: 65
diff changeset
15 static assert((T.sizeof & (T.sizeof -1)) == 0);
fb265a6efea1 [svn r74] Fixed passing types with different alignment to D-style variadic functions.
lindquist
parents: 65
diff changeset
16 va_list vptmp = cast(va_list)((cast(size_t)vp + T.sizeof - 1) & ~(T.sizeof - 1));
fb265a6efea1 [svn r74] Fixed passing types with different alignment to D-style variadic functions.
lindquist
parents: 65
diff changeset
17 vp = vptmp + T.sizeof;
65
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
18 return *cast(T*)vptmp;
d4a678905d5e [svn r69] forgot std.stdarg
lindquist
parents:
diff changeset
19 }