Browse Source

+ handle also optimizer switches by $push/$pop

florian 15 hours ago
parent
commit
602bea2a1d
3 changed files with 29 additions and 5 deletions
  1. 3 1
      compiler/globals.pas
  2. 13 4
      compiler/scandir.pas
  3. 13 0
      compiler/switches.pas

+ 3 - 1
compiler/globals.pas

@@ -277,7 +277,8 @@ Const
         psf_packenum_changed,
         psf_packrecords_changed,
         psf_setalloc_changed,
-        psf_asmmode_changed
+        psf_asmmode_changed,
+        psf_optimizerswitches_changed
       );
       tpendingstateflags = set of tpendingstateflag;
 
@@ -292,6 +293,7 @@ Const
         nextpackrecords : shortint;
         nextsetalloc : shortint;
         nextasmmode : tasmmode;
+        nextoptimizerswitches : toptimizerswitches;
         flags : tpendingstateflags;
       end;
 

+ 13 - 4
compiler/scandir.pas

@@ -42,6 +42,7 @@ unit scandir;
         packenum,
         packrecords : shortint;
         asmmode : tasmmode;
+        optimizerswitches : toptimizerswitches;
       end;
 
     type
@@ -1221,15 +1222,17 @@ unit scandir;
         { Support also the ON and OFF as switch }
         hs:=current_scanner.readid;
         if (hs='ON') then
-          current_settings.optimizerswitches:=level2optimizerswitches
+          recordpendingoptimizerswitches(level2optimizerswitches)
         else if (hs='OFF') then
-          current_settings.optimizerswitches:=[]
+          recordpendingoptimizerswitches([])
         else if (hs='DEFAULT') then
-          current_settings.optimizerswitches:=init_settings.optimizerswitches
+          recordpendingoptimizerswitches(init_settings.optimizerswitches)
         else
           begin
             if not UpdateOptimizerStr(hs,current_settings.optimizerswitches) then
-              Message1(scan_e_illegal_optimization_specifier,hs);
+              Message1(scan_e_illegal_optimization_specifier,hs)
+            else
+              recordpendingoptimizerswitches(current_settings.optimizerswitches)
           end;
       end;
 
@@ -1355,6 +1358,7 @@ unit scandir;
           recordpendingpackrecords(switchesstatestack[switchesstatestackpos].packrecords);
           recordpendingsetalloc(switchesstatestack[switchesstatestackpos].setalloc);
           recordpendingasmmode(switchesstatestack[switchesstatestackpos].asmmode);
+          recordpendingoptimizerswitches(switchesstatestack[switchesstatestackpos].optimizerswitches);
           pendingstate.nextmessagerecord:=switchesstatestack[switchesstatestackpos].pmessage;
           { flushpendingswitchesstate will reset the message state }
           current_settings.pmessage:=nil;
@@ -1424,6 +1428,11 @@ unit scandir;
       else
         switchesstatestack[switchesstatestackpos].asmmode:=current_settings.asmmode;
 
+      if psf_optimizerswitches_changed in pendingstate.flags then
+        switchesstatestack[switchesstatestackpos].optimizerswitches:=pendingstate.nextoptimizerswitches
+      else
+        switchesstatestack[switchesstatestackpos].optimizerswitches:=current_settings.optimizerswitches;
+
       switchesstatestack[switchesstatestackpos].pmessage:=pendingstate.nextmessagerecord;
       Inc(switchesstatestackpos);
     end;

+ 13 - 0
compiler/switches.pas

@@ -42,6 +42,7 @@ procedure recordpendingsetalloc(alloc:shortint);
 procedure recordpendingpackenum(size:shortint);
 procedure recordpendingpackrecords(size:shortint);
 procedure recordpendingasmmode(asmmode:tasmmode);
+procedure recordpendingoptimizerswitches(optimizerswitches:toptimizerswitches);
 procedure flushpendingswitchesstate;
 
 implementation
@@ -388,6 +389,13 @@ procedure recordpendingpackrecords(size:shortint);
   end;
 
 
+procedure recordpendingoptimizerswitches(optimizerswitches:toptimizerswitches);
+  begin
+    pendingstate.nextoptimizerswitches:=optimizerswitches;
+    include(pendingstate.flags,psf_optimizerswitches_changed);
+  end;
+
+
 procedure flushpendingswitchesstate;
   var
     tmpproccal: tproccalloption;
@@ -432,6 +440,11 @@ procedure flushpendingswitchesstate;
         current_settings.asmmode:=pendingstate.nextasmmode;
         exclude(pendingstate.flags,psf_asmmode_changed);
       end;
+    if psf_optimizerswitches_changed in pendingstate.flags then
+      begin
+        current_settings.optimizerswitches:=pendingstate.nextoptimizerswitches;
+        exclude(pendingstate.flags,psf_optimizerswitches_changed);
+      end;
     { process pending verbosity changes (warnings on, etc) }
     if pendingstate.nextverbositystr<>'' then
       begin