Determine the "type" of a delegate

teo teo.ubuntu at yahoo.com
Mon Mar 28 12:47:44 PDT 2011


On Mon, 28 Mar 2011 08:48:18 -0400, Steven Schveighoffer wrote:

> On Sat, 26 Mar 2011 06:46:22 -0400, teo <teo.ubuntu at yahoo.com> wrote:
> 
>> Having a delegate d, I can use d.ptr to get a void* pointer to the
>> environment used to construct the delegate. How can I determine from
>> that pointer whether that is a class object?
> 
> AFAIK, you can't.
> 
> -Steve

I tried to find a solution, but since I don't exactly know the anatomy of 
the class object it is not an easy task. Is there any info on how the 
class object is laid out in memory? Basically I casted the pointer to an 
Object and then dumped the first 64 bytes looking for hints.

Here is the code:
import std.stdio;

struct S
{
	void t() { writeln("S"); }
}

class C
{
	void t() { writeln("C"); }
}

void main()
{
	auto c = new C();
	S s;
	auto t1 = &c.t;
	auto t2 = &s.t;
	writeln("the class:");
	dump(t1.ptr);
	writeln("the struct:");
	dump(t2.ptr);
}

void dump(void* p)
{
	dump(cast(Object)p);
}

void dump(Object o)
{
	auto size = size_t.sizeof * 8;
	writeln("object:");
	auto b1 = (cast(ubyte*)(cast(size_t*)o))[0 .. size];
	dump(b1);
	writeln("classinfo:");
	auto b2 = (cast(ubyte*)(cast(size_t*)o.classinfo))[0 .. size];
	dump(b2);
}

void dump(ubyte[] buffer)
{
	auto l = 16;
	auto n = buffer.length / l + (buffer.length % l > 0 ? 1 : 0);
	for (int i = 0; i < n; i++)
	{
		auto s = i * l;
		auto e = s + l;
		writefln("  %02x", buffer[s .. (e > $) ? $ : e]);
	}
}

BTW: I am getting strange results from writefln - the format is not obeyed
the class:
object:
  [f0, e4, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0]
  [75, 74, 66, 2d, 33, 32, 6c, 65,  0,  0,  0,  0,  0,  0,  0,  8]
  [a0, 1b, 4a,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0]
  [75, 74, 66, 2d, 31, 36, 6c, 65,  0,  0,  0,  0,  0,  0,  0,  8]
classinfo:
  [b0, f9, 49,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0]
  [10,  0,  0,  0,  0,  0,  0,  0, d0, e4, 49,  0,  0,  0,  0,  0]
  [06, 00, 00, 00, 00, 00, 00, 00, e0, e4, 49, 00, 00, 00, 00, 00]
  [07, 00, 00, 00, 00, 00, 00, 00, f0, e4, 49, 00, 00, 00, 00, 00]
the struct:
object:
  [00, 21, 0e, 7b, 57, 7f, 00, 00, 00, 00, 00, 00, 00, 00, 00, 00]
  [80, be, fc, 7a, 57, 7f,  0,  0, 78, c1, 45,  0,  0,  0,  0,  0]
  [40, 72, a6, 10, ff, 7f,  0,  0, 2c, c1, 45,  0,  0,  0,  0,  0]
  [a0, 72, a6, 10, ff, 7f,  0,  0, 45, 3b, 46,  0,  0,  0,  0,  0]
classinfo:
Segmentation fault


More information about the Digitalmars-d mailing list