[fpc-pascal] Procedural generics question
Benito van der Zander
benito at benibela.de
Tue Aug 25 23:47:35 CEST 2020
Hi,
that is generating rather odd code (r40721)
project1.lpr:9 begin
0000000000401090 55 push %rbp
0000000000401091 4889e5 mov %rsp,%rbp
0000000000401094 488d6424f0 lea -0x10(%rsp),%rsp
0000000000401099 48895df8 mov %rbx,-0x8(%rbp)
project1.lpr:10 if TypeInfo(T) =
TypeInfo(Integer) then WriteLn('an integer');
000000000040109D 488d1584af0700 lea 0x7af84(%rip),%rdx
# 0x47c028 <RTTI_$SYSTEM_$$_LONGINT>
00000000004010A4 488d057daf0700 lea 0x7af7d(%rip),%rax
# 0x47c028 <RTTI_$SYSTEM_$$_LONGINT>
00000000004010AB 4839c2 cmp %rax,%rdx
00000000004010AE 752b jne 0x4010db
<ADD$1$CRC713F463B+75>
00000000004010B0 e8cbcf0100 callq 0x41e080 <fpc_get_output>
00000000004010B5 4889c3 mov %rax,%rbx
00000000004010B8 488d15412f0600 lea 0x62f41(%rip),%rdx
# 0x464000 <_$PROJECT1$_Ld1>
00000000004010BF 4889de mov %rbx,%rsi
00000000004010C2 31ff xor %edi,%edi
00000000004010C4 e867d30100 callq 0x41e430
<fpc_write_text_shortstr>
00000000004010C9 e8d2700100 callq 0x4181a0 <fpc_iocheck>
00000000004010CE 4889df mov %rbx,%rdi
00000000004010D1 e85ad20100 callq 0x41e330 <fpc_writeln_end>
00000000004010D6 e8c5700100 callq 0x4181a0 <fpc_iocheck>
project1.lpr:11 if TypeInfo(T) =
TypeInfo(String) then WriteLn('a string');
00000000004010DB 488d0546af0700 lea 0x7af46(%rip),%rax
# 0x47c028 <RTTI_$SYSTEM_$$_LONGINT>
00000000004010E2 488d1537b20700 lea 0x7b237(%rip),%rdx
# 0x47c320 <RTTI_$SYSTEM_$$_SHORTSTRING>
00000000004010E9 4839d0 cmp %rdx,%rax
00000000004010EC 752b jne 0x401119
<ADD$1$CRC713F463B+137>
00000000004010EE e88dcf0100 callq 0x41e080 <fpc_get_output>
00000000004010F3 4889c3 mov %rax,%rbx
00000000004010F6 488d15132f0600 lea 0x62f13(%rip),%rdx
# 0x464010 <_$PROJECT1$_Ld2>
00000000004010FD 4889de mov %rbx,%rsi
0000000000401100 31ff xor %edi,%edi
0000000000401102 e829d30100 callq 0x41e430
<fpc_write_text_shortstr>
0000000000401107 e894700100 callq 0x4181a0 <fpc_iocheck>
000000000040110C 4889df mov %rbx,%rdi
000000000040110F e81cd20100 callq 0x41e330 <fpc_writeln_end>
0000000000401114 e887700100 callq 0x4181a0 <fpc_iocheck>
project1.lpr:12 end;
The compiler should know everything about TypeInfo(T) and optimize it
away where possible
Cheers,
Benito
On 25.08.20 04:32, leledumbo via fpc-pascal wrote:
>> I remember something like this in RTTI though but can't find it in your
> docs yet for generics.
>
> {$mode objfpc}
>
> uses
> typinfo;
>
> generic procedure Add<T>;
> begin
> if TypeInfo(T) = TypeInfo(Integer) then WriteLn('an integer');
> if TypeInfo(T) = TypeInfo(String) then WriteLn('a string');
> end;
>
> begin
> specialize Add<Integer>;
> specialize Add<String>;
> end.
>
>
>
> --
> Sent from: http://free-pascal-general.1045716.n5.nabble.com/
> _______________________________________________
> fpc-pascal maillist - fpc-pascal at lists.freepascal.org
> https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20200825/0ecd0fac/attachment-0001.htm>
More information about the fpc-pascal
mailing list