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

View File

@ -88,6 +88,8 @@ interface
function getsymtable(t:tgetsymtable):TSymtable;virtual; function getsymtable(t:tgetsymtable):TSymtable;virtual;
function is_publishable:boolean;virtual;abstract; function is_publishable:boolean;virtual;abstract;
function needs_inittable: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; function needs_separate_initrtti:boolean;virtual;abstract;
procedure ChangeOwner(st:TSymtable); procedure ChangeOwner(st:TSymtable);
function getreusablesymtab: tsymtable; function getreusablesymtab: tsymtable;