瀏覽代碼

Merged revisions 7629-7630,7632 via svnmerge from
svn+ssh://[email protected]/FPC/svn/fpc/trunk

........
r7629 | jonas | 2007-06-11 00:02:11 +0200 (Mon, 11 Jun 2007) | 2 lines

* fixed memory leak in debug info generation for bitpacked records

........
r7630 | jonas | 2007-06-11 00:02:53 +0200 (Mon, 11 Jun 2007) | 2 lines

* fixed memory leak in conversion of realconstn to currency

........
r7632 | jonas | 2007-06-11 11:11:42 +0200 (Mon, 11 Jun 2007) | 2 lines

* fixed bitsize of qwords in bitpacked records (mantis #9054)

........

git-svn-id: branches/fixes_2_2@7633 -

Jonas Maebe 18 年之前
父節點
當前提交
a0babc4df6
共有 5 個文件被更改,包括 55 次插入15 次删除
  1. 1 0
      .gitattributes
  2. 12 6
      compiler/dbgstabs.pas
  3. 5 3
      compiler/ncnv.pas
  4. 6 6
      compiler/symdef.pas
  5. 31 0
      tests/webtbs/tw9054.pp

+ 1 - 0
.gitattributes

@@ -8135,6 +8135,7 @@ tests/webtbs/tw8861.pp svneol=native#text/plain
 tests/webtbs/tw8870.pp svneol=native#text/plain
 tests/webtbs/tw8870.pp svneol=native#text/plain
 tests/webtbs/tw8883.pp svneol=native#text/plain
 tests/webtbs/tw8883.pp svneol=native#text/plain
 tests/webtbs/tw8919.pp svneol=native#text/plain
 tests/webtbs/tw8919.pp svneol=native#text/plain
+tests/webtbs/tw9054.pp svneol=native#text/plain
 tests/webtbs/ub1873.pp svneol=native#text/plain
 tests/webtbs/ub1873.pp svneol=native#text/plain
 tests/webtbs/ub1883.pp svneol=native#text/plain
 tests/webtbs/ub1883.pp svneol=native#text/plain
 tests/webtbs/uw0555.pp svneol=native#text/plain
 tests/webtbs/uw0555.pp svneol=native#text/plain

+ 12 - 6
compiler/dbgstabs.pas

@@ -724,6 +724,9 @@ implementation
             result:=state.stabstring;
             result:=state.stabstring;
           end;
           end;
 
 
+      var
+        tempstr: pchar;
+
       begin
       begin
         result:=nil;
         result:=nil;
         case def.typ of
         case def.typ of
@@ -754,13 +757,16 @@ implementation
               result:=def_stabstr_evaluate(def,'ar$1;$2;$3;$4',[def_stab_number(tarraydef(def).rangedef),
               result:=def_stabstr_evaluate(def,'ar$1;$2;$3;$4',[def_stab_number(tarraydef(def).rangedef),
                  tostr(tarraydef(def).lowrange),tostr(tarraydef(def).highrange),def_stab_number(tarraydef(def).elementdef)])
                  tostr(tarraydef(def).lowrange),tostr(tarraydef(def).highrange),def_stab_number(tarraydef(def).elementdef)])
             else
             else
-              // will only show highrange-lowrange+1 bits in gdb
-              result:=def_stabstr_evaluate(def,'@s$1;@S;S$2',
-                [tostr(TConstExprInt(tarraydef(def).elepackedbitsize) * tarraydef(def).elecount),def_stabstr_evaluate(tarraydef(def).rangedef,'r${numberstring};$1;$2;',
-                  [tostr(tarraydef(def).lowrange),tostr(tarraydef(def).highrange)
-                ])]);
+              begin
 // the @P seems to be ignored by gdb
 // the @P seems to be ignored by gdb
-//              result:=def_stabstr_evaluate(def,'ar$1;$2;$3;$4;@P;',[def_stab_number(tarraydef(def).rangedef),tostr(tarraydef(def).lowrange),tostr(tarraydef(def).highrange),def_stab_number(tarraydef(def).elementdef)]);
+//                result:=def_stabstr_evaluate(def,'ar$1;$2;$3;$4;@P;',[def_stab_number(tarraydef(def).rangedef),tostr(tarraydef(def).lowrange),tostr(tarraydef(def).highrange),def_stab_number(tarraydef(def).elementdef)]);
+                tempstr:=def_stabstr_evaluate(tarraydef(def).rangedef,'r${numberstring};$1;$2;',
+                  [tostr(tarraydef(def).lowrange),tostr(tarraydef(def).highrange)]);
+                // will only show highrange-lowrange+1 bits in gdb
+                result:=def_stabstr_evaluate(def,'@s$1;@S;S$2',
+                  [tostr(TConstExprInt(tarraydef(def).elepackedbitsize) * tarraydef(def).elecount),tempstr]);
+                freemem(tempstr);
+              end;
           procdef :
           procdef :
             result:=procdef_stabstr(tprocdef(def));
             result:=procdef_stabstr(tprocdef(def));
           procvardef :
           procvardef :

+ 5 - 3
compiler/ncnv.pas

@@ -1081,9 +1081,11 @@ implementation
         if left.nodetype=realconstn then
         if left.nodetype=realconstn then
           result:=cordconstnode.create(round(trealconstnode(left).value_real),resultdef,false)
           result:=cordconstnode.create(round(trealconstnode(left).value_real),resultdef,false)
         else
         else
-          result:=ccallnode.createinternres('fpc_round_real',
-            ccallparanode.create(left,nil),resultdef);
-        left:=nil;
+          begin
+            result:=ccallnode.createinternres('fpc_round_real',
+              ccallparanode.create(left,nil),resultdef);
+            left:=nil;
+          end;
       end;
       end;
 
 
 
 

+ 6 - 6
compiler/symdef.pas

@@ -1506,14 +1506,14 @@ implementation
         if ordtype = uvoid then
         if ordtype = uvoid then
           exit;
           exit;
 
 
-        if (low >= 0) and
+        if (ordtype = u64bit) or
+           ((ordtype = s64bit) and
+            ((low <= (system.low(int64) div 2)) or
+             (high > (system.high(int64) div 2)))) then
+          result := 64
+        else if (low >= 0) and
            (high <= 1) then
            (high <= 1) then
           result := 1
           result := 1
-        else if (ordtype = u64bit) or
-                ((ordtype = s64bit) and
-                 ((low <= (system.low(int64) div 2)) or
-                  (high > (system.high(int64) div 2)))) then
-          result := 64
         else
         else
           begin
           begin
             if (low>=0) then
             if (low>=0) then

+ 31 - 0
tests/webtbs/tw9054.pp

@@ -0,0 +1,31 @@
+{$mode macpas}
+
+program FatalError_2006082312;
+
+type
+  UInt16 = Word;
+  UInt64 = QWord;
+
+  CoreMidiPacket = packed record
+    timeStamp: UInt64;
+    length: UInt16;
+    data: packed array [0..255] of byte
+  end;
+
+procedure test(var gCoreMidiPacket: CoreMidiPacket);
+begin
+  with gCoreMidiPacket do
+    begin
+      timeStamp := high(int64);
+      length := $2345;
+    end
+end;
+
+var
+  gcmp: CoreMidiPacket;
+begin
+  test(gcmp);
+  if (gcmp.timestamp <> high(int64)) or
+     (gcmp.length<>$2345) then
+    halt(1);
+end.