Browse Source

Merged revisions 6770,6778,6782-6783 via svnmerge from
http://svn.freepascal.org/svn/fpc/trunk

r6770 (florian)
* experimental ie fix for dispinterfaces with rtti


r6778 (florian)
* fix memory leak in graph, resolves #8467
* small cleanups


r6782 (marco)
* patch from #8480 committed. #0#0 also copied.


r6783 (florian)
* fixed patch for #8480

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

florian 18 years ago
parent
commit
0e9ed66c0b

+ 3 - 2
compiler/ncgrtti.pas

@@ -705,10 +705,10 @@ implementation
               longint([
               longint([
 {$endif USE_PACKSET1}
 {$endif USE_PACKSET1}
                 TCompilerIntfFlag(ord(ifHasGuid)*ord(assigned(def.iidguid))),
                 TCompilerIntfFlag(ord(ifHasGuid)*ord(assigned(def.iidguid))),
-                TCompilerIntfFlag(ord(ifHasStrGUID)*ord(assigned(def.iidstr)))
+                TCompilerIntfFlag(ord(ifHasStrGUID)*ord(assigned(def.iidstr))),
+                TCompilerIntfFlag(ord(ifDispInterface)*ord(def.objecttype=odt_dispinterface))
               ])
               ])
               {
               {
-              ifDispInterface,
               ifDispatch, }
               ifDispatch, }
               ));
               ));
 {$ifdef cpurequiresproperalignment}
 {$ifdef cpurequiresproperalignment}
@@ -751,6 +751,7 @@ implementation
                current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkclass));
                current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkclass));
              odt_object:
              odt_object:
                current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkobject));
                current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkobject));
+             odt_dispinterface,
              odt_interfacecom:
              odt_interfacecom:
                current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkinterface));
                current_asmdata.asmlists[al_rtti].concat(Tai_const.Create_8bit(tkinterface));
              odt_interfacecorba:
              odt_interfacecorba:

+ 20 - 31
packages/base/graph/inc/graph.inc

@@ -47,8 +47,6 @@ const
    StdBufferSize = 4096;   { Buffer size for FloodFill }
    StdBufferSize = 4096;   { Buffer size for FloodFill }
 
 
 type
 type
-
-
   tinttable = array[0..16383] of smallint;
   tinttable = array[0..16383] of smallint;
   pinttable = ^tinttable;
   pinttable = ^tinttable;
 
 
@@ -1864,31 +1862,23 @@ end;
      FillPattern:=FillpatternTable[UserFill];
      FillPattern:=FillpatternTable[UserFill];
    end;
    end;
 
 
-
-
-
-
-
   procedure DrawPoly(numpoints : word;var polypoints);
   procedure DrawPoly(numpoints : word;var polypoints);
-
-      type
-            ppointtype = ^pointtype;
-        pt = array[0..16000] of pointtype;
-
-      var
-            i : longint;
-
+    type
+      ppointtype = ^pointtype;
+      pt = array[0..16000] of pointtype;
+    var
+      i : longint;
     begin
     begin
-         if numpoints < 2 then
-           begin
-             _GraphResult := grError;
-             exit;
-           end;
-         for i:=0 to numpoints-2 do
-           line(pt(polypoints)[i].x,
-                pt(polypoints)[i].y,
-                pt(polypoints)[i+1].x,
-                pt(polypoints)[i+1].y);
+      if numpoints < 2 then
+        begin
+          _GraphResult := grError;
+          exit;
+        end;
+      for i:=0 to numpoints-2 do
+        line(pt(polypoints)[i].x,
+             pt(polypoints)[i].y,
+             pt(polypoints)[i+1].x,
+             pt(polypoints)[i+1].y);
     end;
     end;
 
 
 
 
@@ -1984,8 +1974,7 @@ end;
     DriverName:=InternalDriverName;   { DOS Graphics driver }
     DriverName:=InternalDriverName;   { DOS Graphics driver }
 
 
     if (Graphdriver=Detect)
     if (Graphdriver=Detect)
-       or (GraphMode = detectMode)
-       then
+       or (GraphMode = detectMode) then
       begin
       begin
         internDetectGraph(GraphDriver,GraphMode,true);
         internDetectGraph(GraphDriver,GraphMode,true);
         If _GraphResult = grNotDetected then Exit;
         If _GraphResult = grNotDetected then Exit;
@@ -2001,7 +1990,7 @@ end;
         { Actually set the graph mode...}
         { Actually set the graph mode...}
         if firstCallOfInitgraph then
         if firstCallOfInitgraph then
           begin
           begin
-        SaveVideoState;
+            SaveVideoState;
             firstCallOfInitgraph := false;
             firstCallOfInitgraph := false;
           end;
           end;
         SetGraphMode(GraphMode);
         SetGraphMode(GraphMode);
@@ -2026,7 +2015,7 @@ end;
 
 
            if firstCallOfInitgraph then
            if firstCallOfInitgraph then
              begin
              begin
-           SaveVideoState;
+               SaveVideoState;
                firstCallOfInitgraph := false;
                firstCallOfInitgraph := false;
              end;
              end;
            SetGraphMode(GraphMode);
            SetGraphMode(GraphMode);
@@ -2059,8 +2048,8 @@ end;
    { release memory allocated for fonts }
    { release memory allocated for fonts }
    for c := 1 to installedfonts do
    for c := 1 to installedfonts do
      with fonts[c] Do
      with fonts[c] Do
-     If assigned(instr) Then
-       Freemem(instr,instrlength);
+       If assigned(instr) Then
+         System.Freemem(instr,instrlength);
    { release memory allocated for modelist }
    { release memory allocated for modelist }
    list := ModeList;
    list := ModeList;
    while assigned(list) do
    while assigned(list) do

+ 1 - 5
packages/base/graph/inc/modes.inc

@@ -132,10 +132,7 @@ end;
               logln('Adding resolution '+strf(modenr)+' for drivernr '+strf(drivernr)+
               logln('Adding resolution '+strf(modenr)+' for drivernr '+strf(drivernr)+
                 ' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
                 ' ('+strf(mode.maxx)+'x'+strf(mode.maxy)+')');
 {$endif logging}
 {$endif logging}
-              if assigned(list) then
-                newLst^.next := list^.next
-              else
-                newLst^.next := nil;
+              newLst^.next := list;
               if assigned(prev) then
               if assigned(prev) then
                 prev^.next := newLst
                 prev^.next := newLst
               else
               else
@@ -170,7 +167,6 @@ end;
         list^.next := NewLst;
         list^.next := NewLst;
         move(mode, NewLst^, sizeof(Mode));
         move(mode, NewLst^, sizeof(Mode));
       end;
       end;
-
   end;
   end;
 
 
 
 

+ 5 - 4
rtl/inc/wstrings.inc

@@ -238,12 +238,13 @@ Procedure fpc_WideStr_Incr_Ref(Var S : Pointer);[Public,Alias:'FPC_WIDESTR_INCR_
       exit;
       exit;
 {$ifdef FPC_WINLIKEWIDESTRING}
 {$ifdef FPC_WINLIKEWIDESTRING}
     p:=NewWidestring(length(WideString(S)));
     p:=NewWidestring(length(WideString(S)));
-    move(s^,p^,length(WideString(s))*sizeof(widechar));
+    move(s^,p^,(length(WideString(s))+1)*sizeof(widechar)); // double #0 too
     s:=p;
     s:=p;
 {$else FPC_WINLIKEWIDESTRING}
 {$else FPC_WINLIKEWIDESTRING}
     { Let's be paranoid : Constant string ??}
     { Let's be paranoid : Constant string ??}
-    If PWideRec(S-WideFirstOff)^.Ref<0 then exit;
-      inclocked(PWideRec(S-WideFirstOff)^.Ref);
+    If PWideRec(S-WideFirstOff)^.Ref<0 then
+      exit;
+    inclocked(PWideRec(S-WideFirstOff)^.Ref);
 {$endif FPC_WINLIKEWIDESTRING}
 {$endif FPC_WINLIKEWIDESTRING}
   end;
   end;
 
 
@@ -377,7 +378,7 @@ begin
   if S2<>nil then
   if S2<>nil then
     begin
     begin
       S1:=NewWidestring(length(WideString(S2)));
       S1:=NewWidestring(length(WideString(S2)));
-      move(s2^,s1^,length(WideString(s1))*sizeof(widechar));
+      move(s2^,s1^,(length(WideString(s1))+1)*sizeof(widechar));
     end
     end
   else
   else
     S1:=nil;
     S1:=nil;