digitalmars.D.bugs - [Issue 2312] New: unexpected function addresses dump behaviour
- d-bugmail puremagic.com (86/86) Aug 25 2008 http://d.puremagic.com/issues/show_bug.cgi?id=2312
- d-bugmail puremagic.com (9/9) Aug 25 2008 http://d.puremagic.com/issues/show_bug.cgi?id=2312
- d-bugmail puremagic.com (10/10) Aug 25 2008 http://d.puremagic.com/issues/show_bug.cgi?id=2312
http://d.puremagic.com/issues/show_bug.cgi?id=2312 Summary: unexpected function addresses dump behaviour Product: D Version: 1.034 Platform: PC OS/Version: Windows Status: NEW Severity: normal Priority: P2 Component: DMD AssignedTo: bugzilla digitalmars.com ReportedBy: enzo.petrelli fastwebnet.it /*************************** OS: Vista SP1 Compiler/linker: Digital Mars D Compiler v1.034 Tango/tangobos Lib: tango-0.99.7-bin-win32-dmd.1.033 Compiled with: no compile/link flag During a test session where the dump of function addresses was required, an unexpected result was shown, as in the following simplified test code. The expected result was to see three equal series of three different addresses. It should also be noted that the requested padding with '0's for hex values in writefln does not work for void* ***************************/ import std.cstream; class DClass { void func1() { return; } void func2() { return; } void func3() { return; } } void main() { DClass oObj = new DClass; std.cstream.dout.writefln(" object: 0x%08X", cast(void*) &oObj); std.cstream.dout.writefln(); // case 1: std.cstream.dout.writefln("object.func1: 0x%08X", cast(void*) &oObj.func1); std.cstream.dout.writefln("object.func2: 0x%08X", cast(void*) &oObj.func2); std.cstream.dout.writefln("object.func3: 0x%08X", cast(void*) &oObj.func3); // case 2: alias void delegate() DlgPtr; DlgPtr pDlg = &oObj.func1; std.cstream.dout.writefln("object.pfunc1:0x%08X", cast(void*) pDlg); pDlg = &oObj.func2; std.cstream.dout.writefln("object.pfunc2:0x%08X", cast(void*) pDlg); pDlg = &oObj.func3; std.cstream.dout.writefln("object.pfunc3:0x%08X", cast(void*) pDlg); // case 3: alias void function() FncPtr; FncPtr pFnc = cast(FncPtr) &oObj.func1; std.cstream.dout.writefln("object.pfunc1:0x%08X", cast(void*) pFnc); pFnc = cast(FncPtr) &oObj.func2; std.cstream.dout.writefln("object.pfunc2:0x%08X", cast(void*) pFnc); pFnc = cast(FncPtr) &oObj.func3; std.cstream.dout.writefln("object.pfunc3:0x%08X", cast(void*) pFnc); } /* output obtained: object: 0x 12FE38 object.func1: 0x 19D3FF0 object.func2: 0x 19D3FF0 object.func3: 0x 19D3FF0 object.pfunc1:0x 19D3FF0 object.pfunc2:0x 19D3FF0 object.pfunc3:0x 19D3FF0 object.pfunc1:0x 402010 object.pfunc2:0x 402018 object.pfunc3:0x 402020 */ --
Aug 25 2008
http://d.puremagic.com/issues/show_bug.cgi?id=2312 Taking the address of a member function results in a delegate. Casting the delegate to a void* gives the value of the 'this' part of the delegate, which is oObj in the example, and always the same value. Casting the address of a member function directly to a function pointer gives the address of the function, hence the 3 different values in the last group. The hex formatting is still an issue, though. --
Aug 25 2008
http://d.puremagic.com/issues/show_bug.cgi?id=2312 bugzilla digitalmars.com changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEW |RESOLVED Resolution| |INVALID writefln doesn't format exactly like printf does. To get the desired hex result, cast to int, not void*. --
Aug 25 2008