Browse Source

Optimize {$DEFINE x := y} and refactor tmacro.buftext.

Rika Ichinose 2 years ago
parent
commit
2596af84fa
3 changed files with 39 additions and 64 deletions
  1. 9 35
      compiler/scanner.pas
  2. 25 11
      compiler/symsym.pas
  3. 5 18
      compiler/symtable.pas

+ 9 - 35
compiler/scanner.pas

@@ -2544,8 +2544,8 @@ type
         hs  : string;
         hs  : string;
         bracketcount : longint;
         bracketcount : longint;
         mac : tmacro;
         mac : tmacro;
-        macropos : longint;
-        macrobuffer : pmacrobuffer;
+        macropos : SizeInt;
+        macrobuffer : array[0..maxmacrolen-1] of char;
       begin
       begin
         current_scanner.skipspace;
         current_scanner.skipspace;
         hs:=current_scanner.readid;
         hs:=current_scanner.readid;
@@ -2566,11 +2566,7 @@ type
             mac.defined:=true;
             mac.defined:=true;
             mac.is_compiler_var:=false;
             mac.is_compiler_var:=false;
           { delete old definition }
           { delete old definition }
-            if assigned(mac.buftext) then
-             begin
-               freemem(mac.buftext,mac.buflen);
-               mac.buftext:=nil;
-             end;
+            mac.free_buftext;
           end;
           end;
         Message1(parser_c_macro_defined,mac.name);
         Message1(parser_c_macro_defined,mac.name);
         mac.is_used:=true;
         mac.is_used:=true;
@@ -2594,7 +2590,6 @@ type
              if is_keyword(hs) then
              if is_keyword(hs) then
                Message(scan_e_keyword_cant_be_a_macro);
                Message(scan_e_keyword_cant_be_a_macro);
 
 
-             new(macrobuffer);
              macropos:=0;
              macropos:=0;
              { parse macro, brackets are counted so it's possible
              { parse macro, brackets are counted so it's possible
                to have a $ifdef etc. in the macro }
                to have a $ifdef etc. in the macro }
@@ -2613,22 +2608,15 @@ type
                  #26 :
                  #26 :
                    current_scanner.end_of_file;
                    current_scanner.end_of_file;
                end;
                end;
-               macrobuffer^[macropos]:=c;
-               inc(macropos);
                if macropos>=maxmacrolen then
                if macropos>=maxmacrolen then
                  Message(scan_f_macro_buffer_overflow);
                  Message(scan_f_macro_buffer_overflow);
+               macrobuffer[macropos]:=c;
+               inc(macropos);
                current_scanner.readchar;
                current_scanner.readchar;
              until false;
              until false;
 
 
-             { free buffer of macro ?}
-             if assigned(mac.buftext) then
-               freemem(mac.buftext,mac.buflen);
-             { get new mem }
-             getmem(mac.buftext,macropos);
-             mac.buflen:=macropos;
              { copy the text }
              { copy the text }
-             move(macrobuffer^,mac.buftext^,macropos);
-             dispose(macrobuffer);
+             move(pchar(@macrobuffer[0])^,mac.allocate_buftext(macropos)^,macropos);
           end
           end
         else
         else
           begin
           begin
@@ -2676,11 +2664,7 @@ type
             mac.defined:=true;
             mac.defined:=true;
             mac.is_compiler_var:=true;
             mac.is_compiler_var:=true;
           { delete old definition }
           { delete old definition }
-            if assigned(mac.buftext) then
-             begin
-               freemem(mac.buftext,mac.buflen);
-               mac.buftext:=nil;
-             end;
+            mac.free_buftext;
           end;
           end;
         Message1(parser_c_macro_defined,mac.name);
         Message1(parser_c_macro_defined,mac.name);
         mac.is_used:=true;
         mac.is_used:=true;
@@ -2714,14 +2698,8 @@ type
                        hs:='FALSE';
                        hs:='FALSE';
                    end;
                    end;
                  Message2(parser_c_macro_set_to,mac.name,hs);
                  Message2(parser_c_macro_set_to,mac.name,hs);
-                 { free buffer of macro ?}
-                 if assigned(mac.buftext) then
-                   freemem(mac.buftext,mac.buflen);
-                 { get new mem }
-                 getmem(mac.buftext,length(hs));
-                 mac.buflen:=length(hs);
                  { copy the text }
                  { copy the text }
-                 move(hs[1],mac.buftext^,mac.buflen);
+                 move(hs[1],mac.allocate_buftext(length(hs))^,length(hs));
                end
                end
              else
              else
                Message(scan_e_preproc_syntax_error);
                Message(scan_e_preproc_syntax_error);
@@ -2752,11 +2730,7 @@ type
              mac.defined:=false;
              mac.defined:=false;
              mac.is_compiler_var:=false;
              mac.is_compiler_var:=false;
              { delete old definition }
              { delete old definition }
-             if assigned(mac.buftext) then
-               begin
-                  freemem(mac.buftext,mac.buflen);
-                  mac.buftext:=nil;
-               end;
+             mac.free_buftext;
           end;
           end;
         Message1(parser_c_macro_undefined,mac.name);
         Message1(parser_c_macro_undefined,mac.name);
         mac.is_used:=true;
         mac.is_used:=true;

+ 25 - 11
compiler/symsym.pas

@@ -469,9 +469,6 @@ interface
        maxmacrolen=16*1024;
        maxmacrolen=16*1024;
 
 
     type
     type
-       pmacrobuffer = ^tmacrobuffer;
-       tmacrobuffer = array[0..maxmacrolen-1] of char;
-
        tmacro = class(tstoredsym)
        tmacro = class(tstoredsym)
           {Normally true, but false when a previously defined macro is undef-ed}
           {Normally true, but false when a previously defined macro is undef-ed}
           defined : boolean;
           defined : boolean;
@@ -490,6 +487,8 @@ interface
             override ppuwrite_platform instead }
             override ppuwrite_platform instead }
           procedure ppuwrite(ppufile:tcompilerppufile);override;final;
           procedure ppuwrite(ppufile:tcompilerppufile);override;final;
           destructor  destroy;override;
           destructor  destroy;override;
+          function allocate_buftext(len:longint) : pchar;
+          procedure free_buftext;
           function GetCopy:tmacro;
           function GetCopy:tmacro;
        end;
        end;
 
 
@@ -3114,10 +3113,7 @@ implementation
          is_used:=false;
          is_used:=false;
          buflen:= ppufile.getlongint;
          buflen:= ppufile.getlongint;
          if buflen > 0 then
          if buflen > 0 then
-           begin
-             getmem(buftext, buflen);
-             ppufile.getdata(buftext^, buflen)
-           end
+           ppufile.getdata(allocate_buftext(buflen)^, buflen)
          else
          else
            buftext:=nil;
            buftext:=nil;
       end;
       end;
@@ -3141,6 +3137,27 @@ implementation
       end;
       end;
 
 
 
 
+    function tmacro.allocate_buftext(len:longint) : pchar;
+      begin
+        result:=getmem(len);
+        if assigned(buftext) then
+          freemem(buftext);
+        buftext:=result;
+        buflen:=len;
+      end;
+
+
+    procedure tmacro.free_buftext;
+      begin
+        if assigned(buftext) then
+          begin
+            freemem(buftext);
+            buftext:=nil;
+            buflen:=0;
+          end;
+      end;
+
+
     function tmacro.GetCopy:tmacro;
     function tmacro.GetCopy:tmacro;
       var
       var
         p : tmacro;
         p : tmacro;
@@ -3151,10 +3168,7 @@ implementation
         p.is_compiler_var:=is_compiler_var;
         p.is_compiler_var:=is_compiler_var;
         p.buflen:=buflen;
         p.buflen:=buflen;
         if assigned(buftext) then
         if assigned(buftext) then
-          begin
-            getmem(p.buftext,buflen);
-            move(buftext^,p.buftext^,buflen);
-          end;
+          move(buftext^,p.allocate_buftext(buflen)^,buflen);
         Result:=p;
         Result:=p;
       end;
       end;
 
 

+ 5 - 18
compiler/symtable.pas

@@ -4919,13 +4919,10 @@ implementation
          else
          else
            begin
            begin
              mac.is_compiler_var:=false;
              mac.is_compiler_var:=false;
-             if assigned(mac.buftext) then
-               freemem(mac.buftext,mac.buflen);
+             mac.free_buftext;
            end;
            end;
          Message2(parser_c_macro_set_to,mac.name,value);
          Message2(parser_c_macro_set_to,mac.name,value);
-         mac.buflen:=length(value);
-         getmem(mac.buftext,mac.buflen);
-         move(value[1],mac.buftext^,mac.buflen);
+         move(value[1],mac.allocate_buftext(length(value))^,length(value));
          mac.defined:=true;
          mac.defined:=true;
       end;
       end;
 
 
@@ -4949,15 +4946,9 @@ implementation
                initialmacrosymtable.insertsym(mac);
                initialmacrosymtable.insertsym(mac);
            end
            end
          else
          else
-           begin
-             mac.is_compiler_var:=true;
-             if assigned(mac.buftext) then
-               freemem(mac.buftext,mac.buflen);
-           end;
+           mac.is_compiler_var:=true;
          Message2(parser_c_macro_set_to,mac.name,value);
          Message2(parser_c_macro_set_to,mac.name,value);
-         mac.buflen:=length(value);
-         getmem(mac.buftext,mac.buflen);
-         move(value[1],mac.buftext^,mac.buflen);
+         move(value[1],mac.allocate_buftext(length(value))^,length(value));
          mac.defined:=true;
          mac.defined:=true;
       end;
       end;
 
 
@@ -4979,11 +4970,7 @@ implementation
              mac.defined:=false;
              mac.defined:=false;
              mac.is_compiler_var:=false;
              mac.is_compiler_var:=false;
              { delete old definition }
              { delete old definition }
-             if assigned(mac.buftext) then
-               begin
-                  freemem(mac.buftext,mac.buflen);
-                  mac.buftext:=nil;
-               end;
+             mac.free_buftext;
            end;
            end;
       end;
       end;