Skip to content

Background delegates

gitbaum edited this page Jul 29, 2011 · 1 revision

Background: Delegates

Background: Delegates

Links

Delegates are a concept from C# for storing member function pointers (and ordinary function pointers, and static member function pointers, ...), but thereby avoiding virtual functions. More info is available at:

Evaluation of Two Code-Project Items

msp430-g++ (with Option -Os)

Example:

static void scw_notify_receivers( struct netpacket_handler_args* args )
{
   receivers[3]( 0x1a, 0x2b, 0 );
}

Sergey Ryazanov

Assembler output:

00002bf6 <_ZN7wiselib20scw_notify_receiversEP22netpacket_handler_args>:
  2bf6:       0c 43           clr     r12             ;
  2bf8:       7d 40 2b 00     mov.b   #43,    r13     ;#0x002b
  2bfc:       3e 40 1a 00     mov     #26,    r14     ;#0x001a
  2c00:       1f 42 80 11     mov     &0x1180,r15     ;0x1180
  2c04:       92 12 82 11     call    &0x1182         ;
  2c08:       30 41           ret

Don Clugston

Assembler output:

00002c22 <_ZN7wiselib20scw_notify_receiversEP22netpacket_handler_args>:
  2c22:       0b 12           push    r11             ;
  2c24:       0a 12           push    r10             ;
  2c26:       1d 42 88 11     mov     &0x1188,r13     ;0x1188
  2c2a:       1e 42 8a 11     mov     &0x118a,r14     ;0x118a
  2c2e:       1a 42 86 11     mov     &0x1186,r10     ;0x1186
  2c32:       0a 5e           add     r14,    r10     ;
  2c34:       0f 4d           mov     r13,    r15     ;
  2c36:       1f f3           and     #1,     r15     ;r3 As==01
  2c38:       4f 93           cmp.b   #0,     r15     ;r3 As==00
  2c3a:       05 24           jz      $+12            ;abs 0x2c46
  2c3c:       0f 4d           mov     r13,    r15     ;
  2c3e:       1f c3           bic     #1,     r15     ;r3 As==01
  2c40:       2f 5a           add     @r10,   r15     ;
  2c42:       2b 4f           mov     @r15,   r11     ;
  2c44:       01 3c           jmp     $+4             ;abs 0x2c48
  2c46:       0b 4d           mov     r13,    r11     ;
  2c48:       0c 43           clr     r12             ;
  2c4a:       7d 40 2b 00     mov.b   #43,    r13     ;#0x002b
  2c4e:       3e 40 1a 00     mov     #26,    r14     ;#0x001a
  2c52:       0f 4a           mov     r10,    r15     ;
  2c54:       8b 12           call    r11             ;
  2c56:       3a 41           pop     r10             ;
  2c58:       3b 41           pop     r11             ;
  2c5a:       30 41           ret

ba-elf-g++ (with Option -Os)

Example:

virtual void execute( void *data )
{
   del_( data );
   //del_ = isense_timer_delegate_t();
}

Sergey Ryazanov

Assembler output:

04001ee4 <__ZNK9delegate1IvPvEclES0_>:
 4001ee4:     9c 21 ff fc                     b.addi     r1,r1,-0x4
 4001ee8:     d4 01 48 00                     b.sw       0x0(r1),r9
 4001eec:     84 e3 00 04                     b.lwz      r7,0x4(r3)
 4001ef0:     48 00 38 00                     l.jalr     r7
 4001ef4:     84 63 00 00                     b.lwz      r3,0x0(r3)
 4001ef8:     85 21 00 00                     b.lwz      r9,0x0(r1)
 4001efc:     44 00 48 00                     l.jr       r9
 4001f00:     9c 21 00 04                     b.addi     r1,r1,0x4

04001f04 <__ZN7wiselib74_GLOBAL__N_.._.._external_interface_isense_isense_os.cpp_00000000_6B6A63C719iSenseTimerCallback7executeEPv>:
 4001f04:     03 ff ff f8                     l.j        4001ee4 <__ZNK9delegate1IvPvEclES0_>
 4001f08:     9c 63 00 04                     b.addi     r3,r3,0x4

Don Clugston

Assembler output:

04001f44 <__ZNK12fastdelegate13FastDelegate1IPvvEclES1_>:
 4001f44:     9c 21 ff e4                     b.addi     r1,r1,-0x1c
 4001f48:     d4 01 48 18                     b.sw       0x18(r1),r9
 4001f4c:     d4 01 c0 14                     b.sw       0x14(r1),r24
 4001f50:     d4 01 d0 10                     b.sw       0x10(r1),r26
 4001f54:     ab 44 00 00                     b.ori      r26,r4,0x0
 4001f58:     07 ff ff f6                     l.jal      4001f30 <__ZNK12fastdelegate6detail10ClosurePtrIMNS0_12GenericClassEFvPvEPFvS3_ES7_E16GetClosureMemPtrEv>
 4001f5c:     87 03 00 00                     b.lwz      r24,0x0(r3)
 4001f60:     d4 01 58 00                     b.sw       0x0(r1),r11
 4001f64:     d4 01 60 04                     b.sw       0x4(r1),r12
 4001f68:     d4 01 58 08                     b.sw       0x8(r1),r11
 4001f6c:     a4 eb 00 01                     b.andi     r7,r11,0x1
 4001f70:     bc 07 00 00                     b.sfeqi    r7,0x0
 4001f74:     10 00 00 06                     b.bf       4001f8c <__ZNK12fastdelegate13FastDelegate1IPvvEclES1_+0x48>
 4001f78:     d4 01 60 0c                     b.sw       0xc(r1),r12
 4001f7c:     e0 f8 60 00                     b.add      r7,r24,r12
 4001f80:     84 e7 00 00                     b.lwz      r7,0x0(r7)
 4001f84:     e0 e7 58 00                     b.add      r7,r7,r11
 4001f88:     85 67 ff ff                     b.lwz      r11,-0x1(r7)
 4001f8c:     e0 78 60 00                     b.add      r3,r24,r12
 4001f90:     48 00 58 00                     l.jalr     r11
 4001f94:     a8 9a 00 00                     b.ori      r4,r26,0x0
 4001f98:     87 41 00 10                     b.lwz      r26,0x10(r1)
 4001f9c:     87 01 00 14                     b.lwz      r24,0x14(r1)
 4001fa0:     85 21 00 18                     b.lwz      r9,0x18(r1)
 4001fa4:     44 00 48 00                     l.jr       r9
 4001fa8:     9c 21 00 1c                     b.addi     r1,r1,0x1c

04001fac <__ZN7wiselib74_GLOBAL__N_.._.._external_interface_isense_isense_os.cpp_00000000_1DE8CCC319iSenseTimerCallback7executeEPv>:
 4001fac:     03 ff ff e6                     l.j        4001f44 <__ZNK12fastdelegate13FastDelegate1IPvvEclES1_>
 4001fb0:     9c 63 00 04                     b.addi     r3,r3,0x4