Browse Source

* fix from Peter arraysize warning (nav Newsgroup msg)

marco 22 years ago
parent
commit
094ab8b446
2 changed files with 46 additions and 37 deletions
  1. 5 3
      compiler/nmem.pas
  2. 41 34
      compiler/symdef.pas

+ 5 - 3
compiler/nmem.pas

@@ -658,8 +658,7 @@ implementation
                   is_pwidechar(left.resulttype.def) then
                   is_pwidechar(left.resulttype.def) then
                 begin
                 begin
                   { convert pointer to array }
                   { convert pointer to array }
-                  htype.setdef(tarraydef.create(0,$7fffffff,s32bittype));
-                  tarraydef(htype.def).setelementtype(tpointerdef(left.resulttype.def).pointertype);
+                  htype.setdef(tarraydef.create_from_pointer(tpointerdef(left.resulttype.def).pointertype));
                   inserttypeconv(left,htype);
                   inserttypeconv(left,htype);
 
 
                   resulttype:=tarraydef(htype.def).elementtype;
                   resulttype:=tarraydef(htype.def).elementtype;
@@ -925,7 +924,10 @@ begin
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.70  2003-10-31 18:44:18  peter
+  Revision 1.71  2003-11-05 14:18:03  marco
+   * fix from Peter arraysize warning (nav Newsgroup msg)
+
+  Revision 1.70  2003/10/31 18:44:18  peter
     * don't search for compatible procvars when the proc is not
     * don't search for compatible procvars when the proc is not
       overloaded
       overloaded
 
 

+ 41 - 34
compiler/symdef.pas

@@ -365,6 +365,7 @@ interface
           lowrange,
           lowrange,
           highrange  : longint;
           highrange  : longint;
           rangetype  : ttype;
           rangetype  : ttype;
+          IsConvertedPointer,
           IsDynamicArray,
           IsDynamicArray,
           IsVariant,
           IsVariant,
           IsConstructor,
           IsConstructor,
@@ -373,6 +374,7 @@ interface
           _elementtype : ttype;
           _elementtype : ttype;
        public
        public
           function elesize : longint;
           function elesize : longint;
+          constructor create_from_pointer(const elemt : ttype);
           constructor create(l,h : longint;const t : ttype);
           constructor create(l,h : longint;const t : ttype);
           constructor ppuload(ppufile:tcompilerppufile);
           constructor ppuload(ppufile:tcompilerppufile);
           procedure ppuwrite(ppufile:tcompilerppufile);override;
           procedure ppuwrite(ppufile:tcompilerppufile);override;
@@ -2703,9 +2705,18 @@ implementation
          IsConstructor:=false;
          IsConstructor:=false;
          IsArrayOfConst:=false;
          IsArrayOfConst:=false;
          IsDynamicArray:=false;
          IsDynamicArray:=false;
+         IsConvertedPointer:=false;
       end;
       end;
 
 
 
 
+    constructor tarraydef.create_from_pointer(const elemt : ttype);
+      begin
+         self.create(0,$7fffffff,s32bittype);
+         IsConvertedPointer:=true;
+         setelementtype(elemt);
+      end;
+      
+      
     constructor tarraydef.ppuload(ppufile:tcompilerppufile);
     constructor tarraydef.ppuload(ppufile:tcompilerppufile);
       begin
       begin
          inherited ppuloaddef(ppufile);
          inherited ppuloaddef(ppufile);
@@ -2780,53 +2791,46 @@ implementation
 
 
     function tarraydef.size : longint;
     function tarraydef.size : longint;
       var
       var
-        _resultsize,
-        newsize,
-        cachedsize: TConstExprInt;
+        newsize : TConstExprInt;
       begin
       begin
         if IsDynamicArray then
         if IsDynamicArray then
           begin
           begin
             size:=POINTER_SIZE;
             size:=POINTER_SIZE;
             exit;
             exit;
           end;
           end;
-        cachedsize := elesize;
         {Tarraydef.size may never be called for an open array!}
         {Tarraydef.size may never be called for an open array!}
         if highrange<lowrange then
         if highrange<lowrange then
             internalerror(99080501);
             internalerror(99080501);
-        newsize:=(int64(highrange)-int64(lowrange)+1)*cachedsize;
-        if (cachedsize>0) and
-            (
-             (TConstExprInt(highrange)-TConstExprInt(lowrange) > $7fffffff) or
-             { () are needed around elesize-1 to avoid a possible
-               integer overflow for elesize=1 !! PM }
-             (($7fffffff div cachedsize + (cachedsize -1)) < (int64(highrange) - int64(lowrange)))
-            ) Then
-          begin
-             Message(sym_e_segment_too_large);
-             _resultsize := 4
-          end
+        newsize:=(int64(highrange)-int64(lowrange)+1)*elesize;
+        { prevent an overflow }
+        if newsize>high(longint) then
+          result:=high(longint)
         else
         else
-          begin
-            { prevent an overflow }
-            if newsize>high(longint) then
-              _resultsize:=high(longint)
-            else
-              _resultsize:=newsize;
-          end;
-
-        size := _resultsize;
+          result:=newsize;
       end;
       end;
 
 
 
 
-     procedure tarraydef.setelementtype(t: ttype);
-       begin
-         _elementtype:=t;
-         If IsDynamicArray then
-            exit;
-         if (TConstExprInt(highrange)-TConstExprInt(lowrange) > $7fffffff) then
+    procedure tarraydef.setelementtype(t: ttype);
+      var
+        cachedsize : TConstExprInt;
+      begin
+        _elementtype:=t;
+       if not(IsDynamicArray or
+              IsConvertedPointer or
+              (highrange<lowrange)) then
+         begin
+           { cache element size for performance on multidimensional arrays }
+           cachedsize := elesize;
+           if (cachedsize>0) and
+               (
+                (TConstExprInt(highrange)-TConstExprInt(lowrange) > $7fffffff) or
+                { () are needed around cachedsize-1 to avoid a possible
+                  integer overflow for cachedsize=1 !! PM }
+                (($7fffffff div cachedsize + (cachedsize -1)) < (int64(highrange) - int64(lowrange)))
+               ) Then
              Message(sym_e_segment_too_large);
              Message(sym_e_segment_too_large);
-       end;
-
+         end;    
+      end;
 
 
 
 
     function tarraydef.alignment : longint;
     function tarraydef.alignment : longint;
@@ -6108,7 +6112,10 @@ implementation
 end.
 end.
 {
 {
   $Log$
   $Log$
-  Revision 1.187  2003-11-01 15:50:03  peter
+  Revision 1.188  2003-11-05 14:18:03  marco
+   * fix from Peter arraysize warning (nav Newsgroup msg)
+
+  Revision 1.187  2003/11/01 15:50:03  peter
     * fix check for valid procdef in property rtti
     * fix check for valid procdef in property rtti
 
 
   Revision 1.186  2003/10/29 21:56:28  peter
   Revision 1.186  2003/10/29 21:56:28  peter