[fpc-devel] Can someone confirm if this is a bug? (ancestor in TWRiter.WriteProperty)
Martin
lazarus at mfriebe.de
Tue Aug 18 04:10:15 CEST 2009
I am not very familiar with the code, so before reporting, I'd like to ask:
trunc\rtl\objpas\classes\writer.inc
procedure TWriter.WriteProperty(Instance: TPersistent; PropInfo: Pointer);
Imagine you a writing an Component, that does have an ancestor.
The same component should have
property Foo: TPersistentChild read FFoo write FFoo;
You should end up in the following code: (line 1091 in recent (a few
weeks) trunc )
// this is the last else, it's not a component, and it is not a collection
else
begin
SavedAncestor := Ancestor;
SavedPropPath := FPropPath;
try
FPropPath := FPropPath + PPropInfo(PropInfo)^.Name + '.';
if HasAncestor then
Ancestor := TPersistent(GetObjectProp(Ancestor,
PropInfo));
WriteProperties(TPersistent(ObjValue));
finally
Ancestor := SavedAncestor;
FPropPath := SavedPropPath;
end;
end;
--------------------------------------
if HasAncestor then
Ancestor := TPersistent(GetObjectProp(Ancestor,
PropInfo));
sets the ancestor to a persitent object
Now if TPersistentChild itself has
property Some: TComponent
then you end up again in TWriter.WriteProperty writing a tclass property
tkClass:
begin
ObjValue := TObject(GetObjectProp(Instance, PropInfo));
if HasAncestor then
begin
AncestorObj := TObject(GetObjectProp(Ancestor, PropInfo));
if Assigned(AncestorObj) then
if Assigned(ObjValue) and
(TComponent(AncestorObj).Owner = FRootAncestor) and
(TComponent(ObjValue).Owner = Root) and
(UpperCase(TComponent(AncestorObj).Name) =
UpperCase(TComponent(ObjValue).Name)) then
AncestorObj := ObjValue
// else
// AncestorObj := nil;
end else
AncestorObj := nil;
and this code assumes that the ancestor is a TComponent, but as seen
before, the ancestor is not.
Shall I report a bug, or do I miss understand something?
(is there a workaround?)
Martin
More information about the fpc-devel
mailing list