fpc/tests/test/tobject8.pp
sergei 8cbef5627e Fixed rtti/finalization of objects that have ancestors and fields of managed types:
* Link rtti to ancestor by writing rtti of ancestor as a field of type tkObject and offset zero. This is a cheat from formal point of view (as it replaces inheritance with aggregation), but is fine for the intended purpose of representing memory layout. Now RTL can handle entire instance of descendant object, and such objects can be statically allocated without leaks.
* Bypass finalization in inherited object destructors, as the instance is now entirely finalized in outermost destructor.
+ test

git-svn-id: trunk@16632 -
2010-12-24 14:46:29 +00:00

73 lines
1.1 KiB
ObjectPascal

{ %OPT=-gh }
// Validate that objects with parent are finalized when statically allocated
type
pobj = ^tobj;
tobj = object
public
foo: ansistring;
constructor init(const s: ansistring);
procedure test; virtual;
destructor done; virtual;
end;
pobj1 = ^tobj1;
tobj1 = object(tobj)
bar: ansistring;
constructor init(const s1,s2: ansistring);
procedure test; virtual;
destructor done; virtual;
end;
constructor tobj.init(const s: ansistring);
begin
foo:=s;
end;
destructor tobj.done;
begin
end;
constructor tobj1.init(const s1,s2: ansistring);
begin
inherited init(s1);
bar:=s2;
end;
destructor tobj1.done;
begin
inherited done;
end;
procedure tobj.test;
begin
end;
procedure tobj1.test;
begin
end;
var
s1, s2, s3, s4: ansistring;
obj: tobj1;
procedure local;
var
instance: tobj1;
begin
instance.init(s3,s4);
end;
begin
s1 := 'string1';
s2 := 'string2';
s3 := 'string3';
s4 := 'string4';
UniqueString(s1); // make it actually allocate memory for strings
UniqueString(s2);
UniqueString(s3);
UniqueString(s4);
local;
obj.init(s1,s2);
end.