Forum > FPC development

[SOLVED] Improvement of TBinaryObjectWriter.WriteIdent

(1/2) > >>

lagprogramming:
rtl/objpas/classes/writer.inc has procedure TBinaryObjectWriter.WriteIdent(const Ident: string);


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---procedure TBinaryObjectWriter.WriteIdent(const Ident: string);begin  { Check if Ident is a special identifier before trying to just write    Ident directly }  if UpperCase(Ident) = 'NIL' then    WriteValue(vaNil)  else if UpperCase(Ident) = 'FALSE' then    WriteValue(vaFalse)  else if UpperCase(Ident) = 'TRUE' then    WriteValue(vaTrue)  else if UpperCase(Ident) = 'NULL' then    WriteValue(vaNull) else  begin    WriteValue(vaIdent);    WriteStr(Ident);  end;end; The original code may compute multiple times UpperCase(Ident), even though Ident remains unchanged. The patch replaces the series of ifs with a "Case UpperCase(Ident) of".


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---diff --git a/rtl/objpas/classes/writer.inc b/rtl/objpas/classes/writer.incindex 93e2d23734..64536cb29f 100644--- a/rtl/objpas/classes/writer.inc+++ b/rtl/objpas/classes/writer.inc@@ -214,17 +214,12 @@ procedure TBinaryObjectWriter.WriteDate(const Value: TDateTime);  procedure TBinaryObjectWriter.WriteIdent(const Ident: string); begin-  { Check if Ident is a special identifier before trying to just write-    Ident directly }-  if UpperCase(Ident) = 'NIL' then-    WriteValue(vaNil)-  else if UpperCase(Ident) = 'FALSE' then-    WriteValue(vaFalse)-  else if UpperCase(Ident) = 'TRUE' then-    WriteValue(vaTrue)-  else if UpperCase(Ident) = 'NULL' then-    WriteValue(vaNull) else-  begin+  Case UpperCase(Ident) of+    'NIL'   : WriteValue(vaNil);+    'FALSE' : WriteValue(vaFalse);+    'TRUE'  : WriteValue(vaTrue);+    'NULL'  : WriteValue(vaNull);+    else     WriteValue(vaIdent);     WriteStr(Ident);   end;

Josh:
Hi

I thought Case with Strings was a ObjFpc only feature, not supported in delphi etc, unless I am wrong of course

Bart:

--- Quote from: Josh on June 21, 2023, 09:58:37 pm ---I thought Case with Strings was a ObjFpc only feature, not supported in delphi etc, unless I am wrong of course

--- End quote ---
Yes, but why would that matter? It's source for fpc, not for Dephi.
Case of string gets translated by the compiler to multiple if..then..else IIRC.

A simpler apporach woud be to add a temporary variable to which UpperCase (Ident) and use that one for the comparisons.

Bart

lagprogramming:

--- Quote from: Bart on June 21, 2023, 10:45:13 pm ---
--- Quote from: Josh on June 21, 2023, 09:58:37 pm ---I thought Case with Strings was a ObjFpc only feature, not supported in delphi etc, unless I am wrong of course

--- End quote ---
Yes, but why would that matter? It's source for fpc, not for Dephi.
Case of string gets translated by the compiler to multiple if..then..else IIRC.

A simpler apporach woud be to add a temporary variable to which UpperCase (Ident) and use that one for the comparisons.

Bart

--- End quote ---

Using the case statement I see a single call to uppercase. Assuming I add a new variable to store the uppercase value, do you think the pascal code would have an increased readability with a series of if then elses instead of a single case?

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING 00000000004B7A20 53                       push rbx00000000004B7A21 4154                     push r1200000000004B7A23 488D642488               lea rsp,[rsp-$78]00000000004B7A28 4889FB                   mov rbx,rdi00000000004B7A2B 4989F4                   mov r12,rsi00000000004B7A2E 48C744246800000000       mov qword ptr [rsp+$68],$0000000000000000004B7A37 48C744246000000000       mov qword ptr [rsp+$60],$0000000000000000004B7A40 4889E2                   mov rdx,rsp00000000004B7A43 488D742418               lea rsi,[rsp+$18]00000000004B7A48 BF01000000               mov edi,$0000000100000000004B7A4D E84E87F7FF               call -$000878B2    # $00000000004301A0 fpc_pushexceptaddr00000000004B7A52 4889C7                   mov rdi,rax00000000004B7A55 E88665F6FF               call -$00099A7A    # $000000000041DFE0 fpc_setjmp00000000004B7A5A 89442458                 mov [rsp+$58],eax00000000004B7A5E 85C0                     test eax,eax00000000004B7A60 0F85E2000000             jnz +$000000E2    # $00000000004B7B48 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+29600000000004B7A66 488D7C2460               lea rdi,[rsp+$60]00000000004B7A6B E8A0F3F6FF               call -$00090C60    # $0000000000426E10 FPC_ANSISTR_DECR_REF00000000004B7A70 488D7C2468               lea rdi,[rsp+$68]00000000004B7A75 4C89E6                   mov rsi,r1200000000004B7A78 E833260100               call +$00012633    # $00000000004CA0B0 SYSUTILS_$$_UPPERCASE$ANSISTRING$$ANSISTRING00000000004B7A7D 488B742468               mov rsi,[rsp+$68]00000000004B7A82 488D7C2460               lea rdi,[rsp+$60]00000000004B7A87 E8E4F3F6FF               call -$00090C1C    # $0000000000426E70 fpc_ansistr_assign00000000004B7A8C 488D357D852F00           lea rsi,[rip+$002F857D]00000000004B7A93 488B7C2460               mov rdi,[rsp+$60]00000000004B7A98 E8B303F7FF               call -$0008FC4D    # $0000000000427E50 FPC_ANSISTR_COMPARE_EQUAL00000000004B7A9D 4885C0                   test rax,rax00000000004B7AA0 7516                     jnz +$16    # $00000000004B7AB8 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+15200000000004B7AA2 BE0D000000               mov esi,$0000000D00000000004B7AA7 4889DF                   mov rdi,rbx00000000004B7AAA E851080000               call +$00000851    # $00000000004B8300 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEVALUE$TVALUETYPE00000000004B7AAF E994000000               jmp +$00000094    # $00000000004B7B48 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+29600000000004B7AB4 0F1F4000                 nop dword ptr [rax+$00]00000000004B7AB8 488D3521852F00           lea rsi,[rip+$002F8521]00000000004B7ABF 488B7C2460               mov rdi,[rsp+$60]00000000004B7AC4 E88703F7FF               call -$0008FC79    # $0000000000427E50 FPC_ANSISTR_COMPARE_EQUAL00000000004B7AC9 4885C0                   test rax,rax00000000004B7ACC 7512                     jnz +$12    # $00000000004B7AE0 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+19200000000004B7ACE BE08000000               mov esi,$0000000800000000004B7AD3 4889DF                   mov rdi,rbx00000000004B7AD6 E825080000               call +$00000825    # $00000000004B8300 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEVALUE$TVALUETYPE00000000004B7ADB E968000000               jmp +$00000068    # $00000000004B7B48 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+29600000000004B7AE0 488D3511852F00           lea rsi,[rip+$002F8511]00000000004B7AE7 488B7C2460               mov rdi,[rsp+$60]00000000004B7AEC E85F03F7FF               call -$0008FCA1    # $0000000000427E50 FPC_ANSISTR_COMPARE_EQUAL00000000004B7AF1 4885C0                   test rax,rax00000000004B7AF4 7512                     jnz +$12    # $00000000004B7B08 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+23200000000004B7AF6 BE09000000               mov esi,$0000000900000000004B7AFB 4889DF                   mov rdi,rbx00000000004B7AFE E8FD070000               call +$000007FD    # $00000000004B8300 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEVALUE$TVALUETYPE00000000004B7B03 EB43                     jmp +$43    # $00000000004B7B48 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+29600000000004B7B05 0F1F00                   nop dword ptr [rax]00000000004B7B08 488D35B9842F00           lea rsi,[rip+$002F84B9]00000000004B7B0F 488B7C2460               mov rdi,[rsp+$60]00000000004B7B14 E83703F7FF               call -$0008FCC9    # $0000000000427E50 FPC_ANSISTR_COMPARE_EQUAL00000000004B7B19 4885C0                   test rax,rax00000000004B7B1C 7512                     jnz +$12    # $00000000004B7B30 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+27200000000004B7B1E 31F6                     xor esi,esi00000000004B7B20 4889DF                   mov rdi,rbx00000000004B7B23 E8D8070000               call +$000007D8    # $00000000004B8300 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEVALUE$TVALUETYPE00000000004B7B28 EB1E                     jmp +$1E    # $00000000004B7B48 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+29600000000004B7B2A 660F1F440000             nop word ptr [rax+rax+$00]00000000004B7B30 BE07000000               mov esi,$0000000700000000004B7B35 4889DF                   mov rdi,rbx00000000004B7B38 E8C3070000               call +$000007C3    # $00000000004B8300 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEVALUE$TVALUETYPE00000000004B7B3D 4C89E6                   mov rsi,r1200000000004B7B40 4889DF                   mov rdi,rbx00000000004B7B43 E8D8070000               call +$000007D8    # $00000000004B8320 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITESTR$ANSISTRING00000000004B7B48 E89389F7FF               call -$0008766D    # $00000000004304E0 fpc_popaddrstack00000000004B7B4D 488D7C2468               lea rdi,[rsp+$68]00000000004B7B52 E8B9F2F6FF               call -$00090D47    # $0000000000426E10 FPC_ANSISTR_DECR_REF00000000004B7B57 488D7C2460               lea rdi,[rsp+$60]00000000004B7B5C E8AFF2F6FF               call -$00090D51    # $0000000000426E10 FPC_ANSISTR_DECR_REF00000000004B7B61 837C245800               cmp dword ptr [rsp+$58],$0000000000004B7B66 740F                     jz +$0F    # $00000000004B7B77 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+34300000000004B7B68 E8238BF7FF               call -$000874DD    # $0000000000430690 FPC_RERAISE00000000004B7B6D C744245800000000         mov [rsp+$58],$0000000000000000004B7B75 EBD1                     jmp -$2F    # $00000000004B7B48 CLASSES$_$TBINARYOBJECTWRITER_$__$$_WRITEIDENT$ANSISTRING+29600000000004B7B77 488D642478               lea rsp,[rsp+$78]00000000004B7B7C 415C                     pop r1200000000004B7B7E 5B                       pop rbx00000000004B7B7F C3                       ret

Josh:
Personally i prefer the existing (mainly because I dont use Case Statements with Strings, i use if then else so its naturally readable to me, others will disagree  ;)). but adding a temp var for optimize speed would be fine.


--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ---procedure TBinaryObjectWriter.WriteIdent(const Ident: string);var TempIdent:String;begin  { Check if Ident is a special identifier before trying to just write    Ident directly }  TempIdent:=UpperCase(Ident);  if TempIdent = 'NIL' then     WriteValue(vaNil)  else if TempIdent = 'FALSE' then    WriteValue(vaFalse)  else if TempIdent = 'TRUE' then    WriteValue(vaTrue)  else if TempIdent = 'NULL' then    WriteValue(vaNull)   else  begin    WriteValue(vaIdent);    WriteStr(Ident);  end;end;      
for readability curious as to why your removing the comment.

--- Code: Pascal  [+][-]window.onload = function(){var x1 = document.getElementById("main_content_section"); if (x1) { var x = document.getElementsByClassName("geshi");for (var i = 0; i < x.length; i++) { x[i].style.maxHeight='none'; x[i].style.height = Math.min(x[i].clientHeight+15,306)+'px'; x[i].style.resize = "vertical";}};} ----  { Check if Ident is a special identifier before trying to just write-    Ident directly }

Navigation

[0] Message Index

[#] Next page

Go to full version