Browse Source

* Handle finish state separately

Michaël Van Canneyt 1 năm trước cách đây
mục cha
commit
c96ef4902b
4 tập tin đã thay đổi với 16 bổ sung1 xóa
  1. 2 0
      compiler/ctask.pas
  2. 2 0
      compiler/finput.pas
  3. 7 0
      compiler/fmodule.pas
  4. 5 1
      compiler/pmodules.pas

+ 2 - 0
compiler/ctask.pas

@@ -211,6 +211,7 @@ begin
       ms_registered : cancontinue:=true;
       ms_compile : cancontinue:=true;
       ms_compiling_waitimpl : cancontinue:=m.usedunitsloaded(false,firstwaiting);
+      ms_compiling_waitfinish : cancontinue:=m.nowaitingforunits;
       ms_compiling_waitintf : cancontinue:=m.usedunitsloaded(true,firstwaiting);
       ms_compiling_wait : cancontinue:=m.usedunitsloaded(true,firstwaiting);
       ms_compiled : cancontinue:=true;
@@ -249,6 +250,7 @@ begin
                    (m as tppumodule).post_load_or_compile(m.compilecount>1);
     ms_compiling_waitintf : pmodules.parse_unit_interface_declarations(m);
     ms_compiling_waitimpl : pmodules.proc_unit_implementation(m);
+    ms_compiling_waitfinish : pmodules.proc_unit_implementation(m);
     ms_compiling_wait : pmodules.proc_program_declarations(m,m.islibrary);
     ms_processed : ;
   else

+ 2 - 0
compiler/finput.pas

@@ -121,6 +121,7 @@ interface
           ms_compile,
           ms_compiling_waitintf,
           ms_compiling_waitimpl,
+          ms_compiling_waitfinish,
           ms_compiling_wait,
           ms_compiled,
           ms_processed,
@@ -136,6 +137,7 @@ interface
           'Compile',
           'Compiling_Waiting_interface',
           'Compiling_Waiting_implementation',
+          'Compiling_Waiting_finish',
           'Compiling_Waiting',
           'Compiled',
           'Processed',

+ 7 - 0
compiler/fmodule.pas

@@ -257,6 +257,7 @@ interface
         function  addusedunit(hp:tmodule;inuses:boolean;usym:tunitsym):tused_unit;
         function  usesmodule_in_interface(m : tmodule) : boolean;
         function usedunitsloaded(interface_units: boolean; out firstwaiting : tmodule): boolean;
+        function nowaitingforunits : Boolean;
         procedure updatemaps;
         function  derefidx_unit(id:longint):longint;
         function  resolve_unit(id:longint):tmodule;
@@ -1063,6 +1064,12 @@ implementation
         end;
     end;
 
+    function tmodule.nowaitingforunits: Boolean;
+
+    begin
+      Result:=waitingforunit.count=0;
+    end;
+
     function tmodule.usesmodule_in_interface(m: tmodule): boolean;
 
     var

+ 5 - 1
compiler/pmodules.pas

@@ -33,6 +33,7 @@ uses fmodule;
     function proc_package(curr: tmodule) : boolean;
     function proc_program(curr: tmodule; islibrary : boolean) : boolean;
     function proc_program_declarations(curr : tmodule; islibrary : boolean) : boolean;
+    procedure finish_unit(module:tmodule;immediate:boolean);
 
 implementation
 
@@ -1053,7 +1054,6 @@ type
     pfinishstate=^tfinishstate;
 
 
-    procedure finish_unit(module:tmodule;immediate:boolean);forward;
 
     function proc_unit_implementation(curr: tmodule):boolean;
 
@@ -1084,6 +1084,8 @@ type
 
         if not curr.interface_only then
           begin
+            if (curr.modulename^='FMX.UTILS') then
+              Writeln('Here');
             Message1(parser_u_parsing_implementation,curr.modulename^);
             if curr.in_interface then
               internalerror(200212285);
@@ -1126,6 +1128,8 @@ type
 
         if result then
           finish_unit(curr,true)
+        else
+          curr.state:=ms_compiling_waitfinish;
       end;
 
     function parse_unit_interface_declarations(curr : tmodule) : boolean;