Browse Source

* Provide more info when certain internal errors occur

Michaël Van Canneyt 1 week ago
parent
commit
1a52b14a70
2 changed files with 20 additions and 6 deletions
  1. 1 1
      compiler/ogbase.pas
  2. 19 5
      compiler/symtype.pas

+ 1 - 1
compiler/ogbase.pas

@@ -3948,7 +3948,7 @@ implementation
                 DoRelocationFixup(objsec);
                 {for size = 0 data is not valid PM }
                 if assigned(objsec.data) and (objsec.data.size<>objsec.size) then
-                  internalerror(2010092801);
+                  internalerror(2010092801,'wrong data size for '+objsec.FullName);
               end;
           end;
       end;

+ 19 - 5
compiler/symtype.pas

@@ -905,15 +905,28 @@ implementation
 
 
     procedure tderef.build(s:TObject);
+
+       procedure do_internal_error(i : integer);
+       // local proc so we do not have an implicit try..finally in the build proc.
+       var
+         msg : ansistring;
+       begin
+         if assigned(s) then
+           msg:=S.ToString
+         else
+           msg:='Nil object';
+         internalerror(i,'Cannot build:'+msg);
+       end;
+
       var
         len  : byte;
         st   : TSymtable;
         data : array[0..255] of byte;
         idx : word;
+
       begin
         { skip length byte }
         len:=1;
-
         if assigned(s) then
          begin
 { TODO: ugly hack}
@@ -922,7 +935,7 @@ implementation
                { if it has been registered but it wasn't put in a symbol table,
                  this symbol shouldn't be written to a ppu }
                if tsym(s).SymId=symid_registered_nost then
-                 Internalerror(2015102504);
+                 do_internal_error(2015102504);
                if not tsym(s).registered then
                  tsym(s).register_sym;
                st:=FindUnitSymtable(tsym(s).owner)
@@ -931,15 +944,16 @@ implementation
              begin
                { same as above }
                if tdef(s).defid=defid_registered_nost then
-                 Internalerror(2015102501);
+                 do_internal_error(2015102501);
                if tdef(s).typ=errordef then
-                 Internalerror(2024011501);
+                 do_internal_error(2024011501);
                if not tdef(s).registered then
                  tdef(s).register_def;
                st:=FindUnitSymtable(tdef(s).owner);
              end
            else
-             internalerror(2016090204);
+             // Unknown object type
+             do_internal_error(2016090204);
            if not st.iscurrentunit then
              begin
                { register that the unit is needed for resolving }