Browse Source

fix range check error when array size > maxlongint

peter 21 years ago
parent
commit
fac96dd2ed
2 changed files with 36 additions and 4 deletions
  1. 30 1
      compiler/cutils.pas
  2. 6 3
      compiler/symdef.pas

+ 30 - 1
compiler/cutils.pas

@@ -39,8 +39,10 @@ interface
 
 
     {# Returns the minimal value between @var(a) and @var(b) }
     {# Returns the minimal value between @var(a) and @var(b) }
     function min(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     function min(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
+    function min(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
     {# Returns the maximum value between @var(a) and @var(b) }
     {# Returns the maximum value between @var(a) and @var(b) }
     function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
+    function max(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
     {# Returns the value in @var(x) swapped to different endian }
     {# Returns the value in @var(x) swapped to different endian }
     Function SwapInt64(x : int64): int64;{$ifdef USEINLINE}inline;{$endif}
     Function SwapInt64(x : int64): int64;{$ifdef USEINLINE}inline;{$endif}
     {# Returns the value in @var(x) swapped to different endian }
     {# Returns the value in @var(x) swapped to different endian }
@@ -152,6 +154,18 @@ uses
       end;
       end;
 
 
 
 
+    function min(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
+    {
+      return the minimal of a and b
+    }
+      begin
+         if a>b then
+           min:=b
+         else
+           min:=a;
+      end;
+
+
     function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     function max(a,b : longint) : longint;{$ifdef USEINLINE}inline;{$endif}
     {
     {
       return the maximum of a and b
       return the maximum of a and b
@@ -164,6 +178,18 @@ uses
       end;
       end;
 
 
 
 
+    function max(a,b : int64) : int64;{$ifdef USEINLINE}inline;{$endif}
+    {
+      return the maximum of a and b
+    }
+      begin
+         if a<b then
+           max:=b
+         else
+           max:=a;
+      end;
+
+
     Function SwapLong(x : longint): longint;{$ifdef USEINLINE}inline;{$endif}
     Function SwapLong(x : longint): longint;{$ifdef USEINLINE}inline;{$endif}
       var
       var
         y : word;
         y : word;
@@ -1162,7 +1188,10 @@ initialization
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.38  2004-03-29 19:19:35  florian
+  Revision 1.39  2004-05-22 23:33:18  peter
+  fix range check error when array size > maxlongint
+
+  Revision 1.38  2004/03/29 19:19:35  florian
     + arm floating point register saving implemented
     + arm floating point register saving implemented
     * hopefully stabs generation for MacOSX fixed
     * hopefully stabs generation for MacOSX fixed
     + some defines for arm added
     + some defines for arm added

+ 6 - 3
compiler/symdef.pas

@@ -3004,9 +3004,9 @@ implementation
          write_rtti_name;
          write_rtti_name;
          { size of elements }
          { size of elements }
          rttiList.concat(Tai_const.Create_32bit(elesize));
          rttiList.concat(Tai_const.Create_32bit(elesize));
-         { count of elements }
+         { count of elements, prevent overflow for 0..maxlongint }
          if not(IsDynamicArray) then
          if not(IsDynamicArray) then
-           rttiList.concat(Tai_const.Create_32bit(highrange-lowrange+1));
+           rttiList.concat(Tai_const.Create_32bit(min(int64(highrange)-lowrange+1,maxlongint)));
          { element type }
          { element type }
          rttiList.concat(Tai_const_symbol.Create(tstoreddef(elementtype.def).get_rtti_label(rt)));
          rttiList.concat(Tai_const_symbol.Create(tstoreddef(elementtype.def).get_rtti_label(rt)));
          { variant type }
          { variant type }
@@ -6184,7 +6184,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.236  2004-05-01 22:05:01  florian
+  Revision 1.237  2004-05-22 23:33:18  peter
+  fix range check error when array size > maxlongint
+
+  Revision 1.236  2004/05/01 22:05:01  florian
     + added lib support for Amiga/MorphOS syscalls
     + added lib support for Amiga/MorphOS syscalls
 
 
   Revision 1.235  2004/04/29 19:56:37  daniel
   Revision 1.235  2004/04/29 19:56:37  daniel