+ add method has_non_trivial_init_child() to tdef which provides access to the symtable's

sto_has_non_trivial_init flag

git-svn-id: trunk@39253 -
This commit is contained in:
svenbarth 2018-06-20 19:00:11 +00:00
parent cc153176f3
commit 61bde67082
2 changed files with 30 additions and 0 deletions

View File

@ -110,6 +110,7 @@ interface
function alignment:shortint;override;
function is_publishable : boolean;override;
function needs_inittable : boolean;override;
function has_non_trivial_init_child(check_parent:boolean):boolean;override;
function rtti_mangledname(rt:trttitype):TSymStr;override;
function OwnerHierarchyName: string; override;
function fullownerhierarchyname(skipprocparams:boolean):TSymStr;override;
@ -346,6 +347,7 @@ interface
{ debug }
function needs_inittable : boolean;override;
function needs_separate_initrtti:boolean;override;
function has_non_trivial_init_child(check_parent:boolean):boolean;override;
end;
trecorddefclass = class of trecorddef;
@ -458,6 +460,7 @@ interface
function is_publishable : boolean;override;
function needs_inittable : boolean;override;
function needs_separate_initrtti : boolean;override;
function has_non_trivial_init_child(check_parent:boolean):boolean;override;
function rtti_mangledname(rt:trttitype):TSymStr;override;
function vmt_mangledname : TSymStr;
function vmt_def: trecorddef;
@ -2102,6 +2105,12 @@ implementation
end;
function tstoreddef.has_non_trivial_init_child(check_parent:boolean):boolean;
begin
result:=false;
end;
function tstoreddef.is_intregable : boolean;
var
recsize,temp: longint;
@ -4546,6 +4555,12 @@ implementation
end;
function trecorddef.has_non_trivial_init_child(check_parent:boolean):boolean;
begin
result:=trecordsymtable(symtable).has_non_trivial_init;
end;
procedure trecorddef.buildderef;
begin
inherited buildderef;
@ -7248,6 +7263,19 @@ implementation
result:=not (objecttype in [odt_interfacecom,odt_interfacecorba,odt_dispinterface]);
end;
function tobjectdef.has_non_trivial_init_child(check_parent:boolean):boolean;
begin
if objecttype in [odt_class,odt_object] then
begin
result:=tobjectsymtable(symtable).has_non_trivial_init or
(check_parent and assigned(childof) and childof.has_non_trivial_init_child(true));
end
else
result:=false;
end;
function tobjectdef.rtti_mangledname(rt: trttitype): TSymStr;
begin
if not(objecttype in [odt_objcclass,odt_objcprotocol]) then

View File

@ -88,6 +88,8 @@ interface
function getsymtable(t:tgetsymtable):TSymtable;virtual;
function is_publishable:boolean;virtual;abstract;
function needs_inittable:boolean;virtual;abstract;
{ contains a (managed) child that is not initialized to 0/Nil }
function has_non_trivial_init_child(check_parent:boolean):boolean;virtual;abstract;
function needs_separate_initrtti:boolean;virtual;abstract;
procedure ChangeOwner(st:TSymtable);
function getreusablesymtab: tsymtable;