mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 22:47:59 +02:00
add has_double_field
This commit is contained in:
parent
96f4300158
commit
8fac3d62ce
@ -125,6 +125,7 @@ interface
|
||||
procedure insertdef(def:TDefEntry);override;
|
||||
function is_packed: boolean;
|
||||
function has_single_field(out def:tdef): boolean;
|
||||
function has_double_field(out def1,def2:tdef; out offset:integer): integer;
|
||||
{ collects all management operators of the specified type in list (which
|
||||
is not cleared); the entries are copies and thus must be freed by the
|
||||
caller }
|
||||
@ -1623,6 +1624,47 @@ implementation
|
||||
result:=usefieldalignment=bit_alignment;
|
||||
end;
|
||||
|
||||
function tabstractrecordsymtable.has_double_field(out def1,def2:tdef; out offset:integer): integer;
|
||||
var
|
||||
i,cnt: longint;
|
||||
currentsymlist: TFPHashObjectList;
|
||||
currentdef: tdef;
|
||||
sym: tfieldvarsym;
|
||||
begin
|
||||
has_double_field := 0;
|
||||
offset := 0;
|
||||
if (defowner.typ=recorddef) and
|
||||
trecorddef(defowner).isunion then
|
||||
exit;
|
||||
currentsymlist:=symlist;
|
||||
if currentsymlist = nil then
|
||||
exit;
|
||||
if currentsymlist.Count <> 2 then
|
||||
exit;
|
||||
currentdef := nil;
|
||||
if is_normal_fieldvarsym(tsym(currentsymlist[0])) then
|
||||
begin
|
||||
sym:=tfieldvarsym(currentsymlist[0]);
|
||||
def1 := sym.vardef;
|
||||
end
|
||||
else
|
||||
exit;
|
||||
if is_normal_fieldvarsym(tsym(currentsymlist[1])) then
|
||||
begin
|
||||
sym:=tfieldvarsym(currentsymlist[1]);
|
||||
def2 := sym.vardef;
|
||||
end
|
||||
else
|
||||
exit;
|
||||
offset := sym.fieldoffset;
|
||||
if(def2.typ = def1.typ)then
|
||||
cnt := 2
|
||||
else
|
||||
cnt := 1;
|
||||
if((offset = 0))then
|
||||
cnt := 0;
|
||||
has_double_field := cnt;
|
||||
end;
|
||||
|
||||
function tabstractrecordsymtable.has_single_field(out def:tdef): boolean;
|
||||
var
|
||||
@ -1655,7 +1697,7 @@ implementation
|
||||
exit;
|
||||
end;
|
||||
result:=true;
|
||||
sym:=tfieldvarsym(currentsymlist[i])
|
||||
sym:=tfieldvarsym(currentsymlist[i]);
|
||||
end;
|
||||
end;
|
||||
if assigned(sym) then
|
||||
|
Loading…
Reference in New Issue
Block a user