Parcourir la source

compiler: re-added ms_moduleerror, small optimization

mattias il y a 1 semaine
Parent
commit
bfab984080
3 fichiers modifiés avec 27 ajouts et 17 suppressions
  1. 9 7
      compiler/ctask.pas
  2. 6 4
      compiler/finput.pas
  3. 12 6
      compiler/fmodule.pas

+ 9 - 7
compiler/ctask.pas

@@ -190,18 +190,19 @@ function ttask_handler.cancontinue(m: tmodule; checksub : boolean; out firstwait
   begin
     acandidate:=nil;
     itm:=m.used_units.First;
-    while (acandidate=Nil) and assigned(itm) do
+    while assigned(itm) do
       begin
       iscandidate:=Not (tused_unit(itm).u.state in [ms_processed,ms_compiled]);
       if iscandidate then
         begin
         acandidate:=tused_unit(itm).u;
-        if not cancontinue(acandidate,false,m2) then
-          acandidate:=nil;
+        if cancontinue(acandidate,false,m2) then
+          break;
         end;
       itm:=itm.Next;
       end;
-   end;
+    acandidate:=nil;
+  end;
 
 var
   m2 : tmodule;
@@ -215,12 +216,13 @@ begin
     ms_unknown : cancontinue:=true;
     ms_registered : cancontinue:=true;
     ms_compile : cancontinue:=true;
+    ms_compiling_wait : cancontinue:=m.usedunitsloaded(true,firstwaiting);
+    ms_compiling_waitintf : cancontinue:=m.usedunitsloaded(true,firstwaiting);
     ms_compiling_waitimpl : cancontinue:=m.usedunitsloaded(false,firstwaiting);
     ms_compiling_waitfinish : cancontinue:=m.nowaitingforunits(firstwaiting);
-    ms_compiling_waitintf : cancontinue:=m.usedunitsloaded(true,firstwaiting);
-    ms_compiling_wait : cancontinue:=m.usedunitsloaded(true,firstwaiting);
     ms_compiled : cancontinue:=true;
     ms_processed : cancontinue:=true;
+    ms_moduleerror : cancontinue:=true;
   else
     InternalError(2024011802);
   end;
@@ -268,10 +270,10 @@ begin
     ms_compile : parser.compile_module(m);
     ms_compiled : if (not m.is_initial) or m.is_unit  then
                    (m as tppumodule).post_load_or_compile(m,m.compilecount>1);
+    ms_compiling_wait : pmodules.proc_program_declarations(m,m.islibrary);
     ms_compiling_waitintf : pmodules.parse_unit_interface_declarations(m);
     ms_compiling_waitimpl : pmodules.proc_unit_implementation(m);
     ms_compiling_waitfinish : pmodules.finish_unit(m);
-    ms_compiling_wait : pmodules.proc_program_declarations(m,m.islibrary);
     ms_processed : ;
   else
     InternalError(2024011801);

+ 6 - 4
compiler/finput.pas

@@ -118,12 +118,13 @@ interface
           ms_registered, // tmodule created
           ms_load,       // loading ppu
           ms_compile,    // parsing and compiling
+          ms_compiling_wait,      // waiting for used units of program/library/package
           ms_compiling_waitintf,  // waiting for used units of interface section
           ms_compiling_waitimpl,  // waiting for used units of implementation section
           ms_compiling_waitfinish,// after impl section parsed, waiting for other impl sections needed by specializations
-          ms_compiling_wait,      // waiting for used units of program section
           ms_compiled,   // compiling complete, ppu written
-          ms_processed   // task complete
+          ms_processed,  // task complete
+          ms_moduleerror // not yet used: eventually set on error
         );
         tmodulestates = set of tmodulestate;
 
@@ -133,12 +134,13 @@ interface
           'Registered',
           'Load',
           'Compile',
+          'Compiling_Waiting',
           'Compiling_Waiting_interface',
           'Compiling_Waiting_implementation',
           'Compiling_Waiting_finish',
-          'Compiling_Waiting',
           'Compiled',
-          'Processed'
+          'Processed',
+          'Error'
         );
 
      type

+ 12 - 6
compiler/fmodule.pas

@@ -1071,8 +1071,9 @@ implementation
     function tmodule.usedunitsloaded(interface_units : boolean; out firstwaiting : tmodule): boolean;
 
       const
-        statesneeded : array[boolean] of tmodulestates = ([ms_processed, ms_compiled,ms_compiling_waitimpl, ms_compiling_waitfinish],
-                                                          [ms_processed, ms_compiled,ms_compiling_waitimpl, ms_compiling_waitfinish]);
+        statesneeded : array[boolean] of tmodulestates = (
+          [ms_processed, ms_compiled,ms_compiling_waitimpl, ms_compiling_waitfinish],
+          [ms_processed, ms_compiled,ms_compiling_waitimpl, ms_compiling_waitfinish]);
 
       var
         itm : TLinkedListItem;
@@ -1088,10 +1089,15 @@ implementation
           result:=tused_unit(itm).u.state in states;
           {$IFDEF DEBUG_CTASK}writeln('  ',ToString,' checking state of ', tused_unit(itm).u.ToString,' : ',tused_unit(itm).u.state,' : ',Result);{$ENDIF}
           if not result then
-             begin
-             if firstwaiting=Nil then
-                firstwaiting:=tused_unit(itm).u;
-             end;
+            begin
+            if firstwaiting=Nil then
+              begin
+              firstwaiting:=tused_unit(itm).u;
+              {$IFNDEF DEBUG_CTASK}
+              break;
+              {$ENDIF}
+              end;
+            end;
           itm:=itm.Next;
           end;
       end;