digitalmars.D - TypeInfo
- Derek Parnell (106/106) Feb 21 2005 I ran into something unexpected today when dealing with variadic argumen...
- Walter (2/2) Feb 25 2005 That looks like a compiler bug. You should get the TypeInfo argument for
I ran into something unexpected today when dealing with variadic arguments.
Basically, I get a different arguments passed to my function under
different circumstances.
Foo A = new Foo(1,3,5); // I get 3 args, all ints.
Foo B += new Foo(1,3,5); // I get 4 args, the first is 'TypeInfo'
I don't understand why a 'new' for a simple assignment is different from a
'new' in an opAddAssign.
I found a work around but its a bit of a kludge.
The source code to demonstrate this is a bit long, sorry about that.
<--------------- code ------------------->
import std.stdarg;
import std.stdio;
class Foo{
static int baseid;
int id;
long[] Mem;
this(...)
{
baseid++;
id = baseid;
for (int i = 0; i < _arguments.length; i++)
{
if (_arguments[i] is typeid(int))
{
Mem.length = Mem.length + 1;
Mem[length-1] = cast(long)va_arg!(int)(_argptr);
}
else if (_arguments[i] is typeid(long))
{
Mem.length = Mem.length + 1;
Mem[length-1] = va_arg!(long)(_argptr);
}
else
{
writefln(
"unknown data element '%s'"
" at position %d"
" length %d",
_arguments[i].toString,
std.string.toString(i),
std.string.toString(_arguments[i].tsize())
);
// Skip over the bad data.
if (_arguments[i].tsize() == 0)
_argptr += 8; // Why is size 0 but I have to add 8?
else
_argptr +=
((_arguments[i].tsize() +
int.sizeof - 1) & ~(int.sizeof - 1));
}
};
}
// Does nothing special, just for the demo.
Foo opAddAssign(Foo x)
{
if (x.Mem.length > Mem.length)
Mem.length = x.Mem.length;
foreach(inout long a; Mem)
foreach(long b; x.Mem)
a += b;
return this;
}
// Debug display.
void ShowMe()
{
foreach(int i,long x; Mem)
{
writef("%d", x);
if (i != Mem.length-1)
writef(",");
}
writef("\n");
}
}
void main()
{
Foo A = new Foo;
A.ShowMe();
Foo B = new Foo;
B.ShowMe();
A = new Foo(cast(char)'a', 4.55, 1,2,3,"AA", B, 9,8,6);
A.ShowMe();
B = new Foo(1,2,3);
B.ShowMe();
B += A;
B.ShowMe();
B = new Foo(1,2,3);
B.ShowMe();
B += new Foo(cast(char)'a', 4.55, 1,2,3,"AA", B, 9,8,6);
B.ShowMe();
}
<---------------------------------------->
--
Derek
Melbourne, Australia
22/02/2005 3:11:39 PM
Feb 21 2005
That looks like a compiler bug. You should get the TypeInfo argument for both cases.
Feb 25 2005








"Walter" <newshound digitalmars.com>