mirror of
https://github.com/byteworksinc/ORCA-C.git
synced 2025-02-22 03:29:04 +00:00
Record which anon struct/union an anonymous member field came from.
This is preparatory to supporting designated initializers. Any struct/union type with an anonymous member now forces .sym file generation to end, since we do not have a scheme for serializing this information in a .sym file. It would be possible to do so, but for now we just avoid this situation for simplicity.
This commit is contained in:
parent
3f450bdb80
commit
5500833180
@ -376,7 +376,11 @@ type
|
|||||||
pnext: identPtr); {next parameter}
|
pnext: identPtr); {next parameter}
|
||||||
external: (inlineDefinition: boolean); {(potential) inline definition of function?}
|
external: (inlineDefinition: boolean); {(potential) inline definition of function?}
|
||||||
global,private: ();
|
global,private: ();
|
||||||
none: (anonMemberField: boolean); {field from an anonymous struct/union member?}
|
none: (
|
||||||
|
case anonMemberField: boolean of {field from an anonymous struct/union member?}
|
||||||
|
true : (anonMember: identPtr); {containing anonymous struct/union}
|
||||||
|
false: ();
|
||||||
|
);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{mini-assembler}
|
{mini-assembler}
|
||||||
|
@ -18,7 +18,7 @@ uses CCommon, MM, Scanner, Symbol, CGI;
|
|||||||
{$segment 'HEADER'}
|
{$segment 'HEADER'}
|
||||||
|
|
||||||
const
|
const
|
||||||
symFileVersion = 33; {version number of .sym file format}
|
symFileVersion = 34; {version number of .sym file format}
|
||||||
|
|
||||||
var
|
var
|
||||||
inhibitHeader: boolean; {should .sym includes be blocked?}
|
inhibitHeader: boolean; {should .sym includes be blocked?}
|
||||||
@ -1105,10 +1105,9 @@ procedure EndInclude {chPtr: ptr};
|
|||||||
WriteByte(ord(ip^.isForwardDeclared));
|
WriteByte(ord(ip^.isForwardDeclared));
|
||||||
WriteByte(ord(ip^.class));
|
WriteByte(ord(ip^.class));
|
||||||
WriteByte(ord(ip^.storage));
|
WriteByte(ord(ip^.storage));
|
||||||
if ip^.storage = none then
|
if ip^.storage = external then
|
||||||
WriteByte(ord(ip^.anonMemberField))
|
|
||||||
else if ip^.storage = external then
|
|
||||||
WriteByte(ord(ip^.inlineDefinition));
|
WriteByte(ord(ip^.inlineDefinition));
|
||||||
|
{if ip^.storage = none then ip^.anonMemberField must be false}
|
||||||
end; {WriteIdent}
|
end; {WriteIdent}
|
||||||
|
|
||||||
|
|
||||||
@ -1810,7 +1809,7 @@ var
|
|||||||
sp^.class := tokenEnum(ReadByte);
|
sp^.class := tokenEnum(ReadByte);
|
||||||
sp^.storage := storageType(ReadByte);
|
sp^.storage := storageType(ReadByte);
|
||||||
if sp^.storage = none then
|
if sp^.storage = none then
|
||||||
sp^.anonMemberField := boolean(ReadByte)
|
sp^.anonMemberField := false
|
||||||
else if sp^.storage = external then
|
else if sp^.storage = external then
|
||||||
sp^.inlineDefinition := boolean(ReadByte);
|
sp^.inlineDefinition := boolean(ReadByte);
|
||||||
ReadIdent := sp;
|
ReadIdent := sp;
|
||||||
|
20
Parser.pas
20
Parser.pas
@ -2811,15 +2811,15 @@ var
|
|||||||
tPtr: typePtr; {for building types}
|
tPtr: typePtr; {for building types}
|
||||||
anonMember: boolean; {processing an anonymous struct/union?}
|
anonMember: boolean; {processing an anonymous struct/union?}
|
||||||
|
|
||||||
procedure AddField(variable: identPtr; anonMemberField: boolean);
|
procedure AddField(variable: identPtr; anonMember: identPtr);
|
||||||
|
|
||||||
{ add a field to the field list }
|
{ add a field to the field list }
|
||||||
{ }
|
{ }
|
||||||
{ parameters }
|
{ parameters }
|
||||||
{ variable - field to add }
|
{ variable - field to add }
|
||||||
{ checkDups - check for duplicate-named fields }
|
{ anonMember - anonymous struct/union that this field }
|
||||||
{ anonMemberField - is this a field from an anonymous }
|
{ came from, if any (nil if not an anonymous }
|
||||||
{ struct/union member? }
|
{ member field) }
|
||||||
|
|
||||||
label 1;
|
label 1;
|
||||||
|
|
||||||
@ -2838,7 +2838,12 @@ var
|
|||||||
end; {while}
|
end; {while}
|
||||||
end; {if}
|
end; {if}
|
||||||
1: variable^.next := fl;
|
1: variable^.next := fl;
|
||||||
variable^.anonMemberField := anonMemberField;
|
if anonMember <> nil then begin
|
||||||
|
variable^.anonMemberField := true;
|
||||||
|
variable^.anonMember := anonMember;
|
||||||
|
end {if}
|
||||||
|
else
|
||||||
|
variable^.anonMemberField := false;
|
||||||
fl := variable;
|
fl := variable;
|
||||||
end; {AddField}
|
end; {AddField}
|
||||||
|
|
||||||
@ -2876,12 +2881,13 @@ var
|
|||||||
variable := NewSymbol(@'~anonymous', tPtr, ident,
|
variable := NewSymbol(@'~anonymous', tPtr, ident,
|
||||||
fieldListSpace, defined, false);
|
fieldListSpace, defined, false);
|
||||||
anonMember := true;
|
anonMember := true;
|
||||||
|
TermHeader; {cannot record anon member in .sym file}
|
||||||
end; {if}
|
end; {if}
|
||||||
end {if}
|
end {if}
|
||||||
else
|
else
|
||||||
Declarator(fieldDeclSpecifiers, variable, fieldListSpace, false);
|
Declarator(fieldDeclSpecifiers, variable, fieldListSpace, false);
|
||||||
if variable <> nil then {enter the var in the field list}
|
if variable <> nil then {enter the var in the field list}
|
||||||
AddField(variable, false);
|
AddField(variable, nil);
|
||||||
end; {if}
|
end; {if}
|
||||||
if kind = unionType then begin
|
if kind = unionType then begin
|
||||||
disp := 0;
|
disp := 0;
|
||||||
@ -2938,7 +2944,7 @@ var
|
|||||||
while tfl <> nil do begin
|
while tfl <> nil do begin
|
||||||
ufl := pointer(Malloc(sizeof(identRecord)));
|
ufl := pointer(Malloc(sizeof(identRecord)));
|
||||||
ufl^ := tfl^;
|
ufl^ := tfl^;
|
||||||
AddField(ufl, true);
|
AddField(ufl, variable);
|
||||||
ufl^.disp := ufl^.disp + disp;
|
ufl^.disp := ufl^.disp + disp;
|
||||||
tfl := tfl^.next;
|
tfl := tfl^.next;
|
||||||
end; {while}
|
end; {while}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user