Explorar el Código

* Applied and expanded patch from Luiz Americo to implement faster notifyobservers (bug ID 23419)

git-svn-id: trunk@23089 -
michael hace 12 años
padre
commit
66553a253e
Se han modificado 2 ficheros con 8 adiciones y 12 borrados
  1. 4 6
      rtl/objpas/classes/lists.inc
  2. 4 6
      rtl/objpas/classes/persist.inc

+ 4 - 6
rtl/objpas/classes/lists.inc

@@ -667,7 +667,7 @@ begin
     Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
   If not Assigned(FObservers) then
     FObservers:=TFPList.Create;
-  FObservers.Add(AObserver);
+  FObservers.Add(I);
 end;
 
 procedure TList.FPODetachObserver(AObserver: TObject);
@@ -679,7 +679,7 @@ begin
     Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
   If Assigned(FObservers) then
     begin
-    FObservers.Remove(AObserver);
+    FObservers.Remove(I);
     If (FObservers.Count=0) then
       FreeAndNil(FObservers);
     end;
@@ -689,7 +689,6 @@ procedure TList.FPONotifyObservers(ASender: TObject;
   AOperation: TFPObservedOperation; Data : Pointer);
 
 Var
-  O : TObject;
   I : Integer;
   Obs : IFPObserver;
 
@@ -697,9 +696,8 @@ begin
   If Assigned(FObservers) then
     For I:=FObservers.Count-1 downto 0 do
       begin
-      O:=TObject(FObservers[i]);
-      If O.GetInterface(SGUIDObserver,Obs) then
-        Obs.FPOObservedChanged(Self,AOperation,Data);
+      Obs:=IFPObserver(FObservers[i]);
+      Obs.FPOObservedChanged(ASender,AOperation,Data);
       end;
 end;
 

+ 4 - 6
rtl/objpas/classes/persist.inc

@@ -68,7 +68,7 @@ begin
      Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
    If not Assigned(FObservers) then
      FObservers:=TFPList.Create;
-   FObservers.Add(AObserver);
+   FObservers.Add(I);
 end;
 
 procedure TPersistent.FPODetachObserver(AObserver: TObject);
@@ -80,7 +80,7 @@ begin
     Raise EObserver.CreateFmt(SErrNotObserver,[AObserver.ClassName]);
   If Assigned(FObservers) then
     begin
-    FObservers.Remove(AObserver);
+    FObservers.Remove(I);
     If (FObservers.Count=0) then
       FreeAndNil(FObservers);
     end;
@@ -89,7 +89,6 @@ end;
 procedure TPersistent.FPONotifyObservers(ASender: TObject;
   AOperation: TFPObservedOperation; Data : Pointer);
 Var
-  O : TObject;
   I : Integer;
   Obs : IFPObserver;
 
@@ -97,9 +96,8 @@ begin
   If Assigned(FObservers) then
     For I:=FObservers.Count-1 downto 0 do
       begin
-      O:=TObject(FObservers[i]);
-      If O.GetInterface(SGUIDObserver,Obs) then
-        Obs.FPOObservedChanged(ASender,AOperation,Data);
+      Obs:=IFPObserver(FObservers[i]);
+      Obs.FPOObservedChanged(Self,AOperation,Data);
       end;
 end;