How to overload member function pointer and a regualr member function

Basile B. via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Apr 26 01:24:08 PDT 2017


On Tuesday, 25 April 2017 at 18:58:58 UTC, Ali Çehreli wrote:
> On 04/25/2017 11:54 AM, Ali Çehreli wrote:
> My analysis is wrong because that writefln() is for the 
> bar(float) overload but I still think what you want is achieved.
>
> Ali

No it's ok, it works. The additional indirection is well avoided:

Let's take this module:

==================
#!dmd -release -inline -O
module runnable;

struct Foo
{
     private void function(int,float) _bar;
     void bar(float){}
     pragma(inline, false) void bar(int i, float f){_bar(i,f);}
}

struct FooInline
{
     private void function(int,float) _bar;
     void bar(float){}
     pragma(inline, true) void bar(int i, float f){_bar(i,f);}
}

void testInlined(ref FooInline foo)
{
     foo.bar(0,0);
}

void test(ref Foo foo)
{
     foo.bar(0,0);
}

void main()
{
     import disassembler, std.stdio;
     disassembler.symbolTable.addModule!runnable;
     prettyDisasm(&testInlined).writeln;
     prettyDisasm(&test, 2).writeln; // dig up to 2 levels, 
required for the indir.
}
==================

and looks at the output:


;------- SUB 0000000000459970h -------
; NAMED: testInlined
0000000000459970h  push rbp
0000000000459971h  mov rbp, rsp
0000000000459974h  sub rsp, 20h
0000000000459978h  mov qword ptr [rbp-08h], rdi
000000000045997Ch  xor edi, edi
000000000045997Eh  mov dword ptr [rbp-20h], edi
0000000000459981h  movss xmm0, dword ptr [rbp-20h]
0000000000459986h  mov rax, qword ptr [rbp-08h]
000000000045998Ah  call qword ptr [rax]
000000000045998Dh  mov rsp, rbp
0000000000459990h  pop rbp
0000000000459991h  ret
;-------------------------------------


;------- SUB 0000000000459934h -------
; XREFS: [00000000004599A6h]
0000000000459934h  push rbp
0000000000459935h  mov rbp, rsp
0000000000459938h  sub rsp, 10h
000000000045993Ch  mov qword ptr [rbp-08h], rdi
0000000000459940h  mov rdi, rsi
0000000000459943h  mov rax, qword ptr [rbp-08h]
0000000000459947h  call qword ptr [rax]
000000000045994Ah  mov rsp, rbp
000000000045994Dh  pop rbp
000000000045994Eh  ret
;-------------------------------------

;------- SUB 0000000000459994h -------
; NAMED: test
0000000000459994h  push rbp
0000000000459995h  mov rbp, rsp
0000000000459998h  sub rsp, 10h
000000000045999Ch  xor esi, esi
000000000045999Eh  mov dword ptr [rbp-10h], esi
00000000004599A1h  movss xmm0, dword ptr [rbp-10h]
00000000004599A6h  call 0000000000459934h
00000000004599ABh  mov rsp, rbp
00000000004599AEh  pop rbp
00000000004599AFh  ret
;-------------------------------------

  - testInlined() contains only the delegate call. (call qword ptr 
[rax])
  - test() contains a call (call 0000000000459934h) which contains 
the
    delegate call (call qword ptr [rax])

Actually i've even had to add (pragma inline false) to show the 
difference since DMD inlined automatically bar() in test().






More information about the Digitalmars-d-learn mailing list