Adjust tfieldvarsym (and by extension tabstractvarsym) so that it can be created as not registered if needed.

git-svn-id: trunk@32372 -
This commit is contained in:
svenbarth 2015-11-20 10:43:25 +00:00
parent fe39de1573
commit 922646d106
7 changed files with 28 additions and 28 deletions

View File

@ -343,7 +343,7 @@ implementation
{ create static fields representing all enums }
for i:=0 to tenumdef(def).symtable.symlist.count-1 do
begin
fsym:=cfieldvarsym.create(tenumsym(tenumdef(def).symtable.symlist[i]).realname,vs_final,enumclass,[]);
fsym:=cfieldvarsym.create(tenumsym(tenumdef(def).symtable.symlist[i]).realname,vs_final,enumclass,[],true);
enumclass.symtable.insert(fsym);
sym:=make_field_static(enumclass.symtable,fsym);
{ add alias for the field representing ordinal(0), for use in
@ -373,12 +373,12 @@ implementation
if tenumdef(def).has_jumps then
begin
{ add field for the value }
fsym:=cfieldvarsym.create('__fpc_fenumval',vs_final,s32inttype,[]);
fsym:=cfieldvarsym.create('__fpc_fenumval',vs_final,s32inttype,[],true);
enumclass.symtable.insert(fsym);
tobjectsymtable(enumclass.symtable).addfield(fsym,vis_strictprivate);
{ add class field with hash table that maps from FPC-declared ordinal value -> enum instance }
juhashmap:=search_system_type('JUHASHMAP').typedef;
fsym:=cfieldvarsym.create('__fpc_ord2enum',vs_final,juhashmap,[]);
fsym:=cfieldvarsym.create('__fpc_ord2enum',vs_final,juhashmap,[],true);
enumclass.symtable.insert(fsym);
make_field_static(enumclass.symtable,fsym);
{ add custom constructor }
@ -435,7 +435,7 @@ implementation
"Values" instance method -- that's also the reason why we insert the
field only now, because we cannot disable duplicate identifier
checking when creating the "Values" method }
fsym:=cfieldvarsym.create('$VALUES',vs_final,arrdef,[]);
fsym:=cfieldvarsym.create('$VALUES',vs_final,arrdef,[],true);
fsym.visibility:=vis_strictprivate;
enumclass.symtable.insert(fsym,false);
sym:=make_field_static(enumclass.symtable,fsym);

View File

@ -266,7 +266,7 @@ implementation
to it from the structure or linking will fail }
if symtablestack.top.symtabletype in [recordsymtable,ObjectSymtable] then
begin
sym:=cfieldvarsym.create(orgname,varspez,hdef,[]);
sym:=cfieldvarsym.create(orgname,varspez,hdef,[],true);
symtablestack.top.insert(sym);
sym:=make_field_static(symtablestack.top,tfieldvarsym(sym));
end

View File

@ -1512,7 +1512,7 @@ implementation
sorg:=orgpattern;
if token=_ID then
begin
vs:=cfieldvarsym.create(sorg,vs_value,generrordef,[]);
vs:=cfieldvarsym.create(sorg,vs_value,generrordef,[],true);
{ normally the visibility is set via addfield, but sometimes
we collect symbols so we can add them in a batch of
@ -1739,7 +1739,7 @@ implementation
begin
consume(_ID);
consume(_COLON);
fieldvs:=cfieldvarsym.create(sorg,vs_value,generrordef,[]);
fieldvs:=cfieldvarsym.create(sorg,vs_value,generrordef,[],true);
variantdesc^^.variantselector:=fieldvs;
symtablestack.top.insert(fieldvs);
end;

View File

@ -481,18 +481,18 @@ implementation
type is not available. The rtti for pvmt will be written implicitly
by thev tblarray below }
systemunit.insert(ctypesym.create('$pvmt',pvmttype,true));
addfield(hrecst,cfieldvarsym.create('$length',vs_value,ptrsinttype,[]));
addfield(hrecst,cfieldvarsym.create('$mlength',vs_value,ptrsinttype,[]));
addfield(hrecst,cfieldvarsym.create('$parent',vs_value,pvmttype,[]));
addfield(hrecst,cfieldvarsym.create('$length',vs_value,ptrsinttype,[],true));
addfield(hrecst,cfieldvarsym.create('$mlength',vs_value,ptrsinttype,[],true));
addfield(hrecst,cfieldvarsym.create('$parent',vs_value,pvmttype,[],true));
{ it seems vmttype is used both for TP objects and Delphi classes,
so the next entry could either be the first virtual method (vm1)
(object) or the class name (class). We can't easily create separate
vtable formats for both, as gdb is hard coded to search for
__vtbl_ptr_type in all cases (JM) }
addfield(hrecst,cfieldvarsym.create('$vm1_or_classname',vs_value,cpointerdef.create(cshortstringtype),[]));
addfield(hrecst,cfieldvarsym.create('$vm1_or_classname',vs_value,cpointerdef.create(cshortstringtype),[],true));
vmtarraytype:=carraydef.create(0,0,s32inttype);
tarraydef(vmtarraytype).elementdef:=voidpointertype;
addfield(hrecst,cfieldvarsym.create('$__pfn',vs_value,vmtarraytype,[]));
addfield(hrecst,cfieldvarsym.create('$__pfn',vs_value,vmtarraytype,[],true));
addtype('$__vtbl_ptr_type',vmttype);
vmtarraytype:=carraydef.create(0,1,s32inttype);
tarraydef(vmtarraytype).elementdef:=pvmttype;
@ -500,14 +500,14 @@ implementation
end;
{ Add a type for methodpointers }
hrecst:=trecordsymtable.create('',1,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
addfield(hrecst,cfieldvarsym.create('$proc',vs_value,voidcodepointertype,[]));
addfield(hrecst,cfieldvarsym.create('$self',vs_value,voidpointertype,[]));
addfield(hrecst,cfieldvarsym.create('$proc',vs_value,voidcodepointertype,[],true));
addfield(hrecst,cfieldvarsym.create('$self',vs_value,voidpointertype,[],true));
methodpointertype:=crecorddef.create('',hrecst);
addtype('$methodpointer',methodpointertype);
{ Add a type for nested proc pointers }
hrecst:=trecordsymtable.create('',1,current_settings.alignment.recordalignmin,current_settings.alignment.maxCrecordalign);
addfield(hrecst,cfieldvarsym.create('$proc',vs_value,voidcodepointertype,[]));
addfield(hrecst,cfieldvarsym.create('$parentfp',vs_value,parentfpvoidpointertype,[]));
addfield(hrecst,cfieldvarsym.create('$proc',vs_value,voidcodepointertype,[],true));
addfield(hrecst,cfieldvarsym.create('$parentfp',vs_value,parentfpvoidpointertype,[],true));
nestedprocpointertype:=crecorddef.create('',hrecst);
addtype('$nestedprocpointer',nestedprocpointertype);
symtablestack.pop(systemunit);

View File

@ -1199,7 +1199,7 @@ implementation
fieldvardef:=cpointerdef.getreusable(vardef)
else
fieldvardef:=vardef;
result:=cfieldvarsym.create(sym.realname,vs_value,fieldvardef,[]);
result:=cfieldvarsym.create(sym.realname,vs_value,fieldvardef,[],true);
if nestedvarsst.symlist.count=0 then
include(tfieldvarsym(result).varoptions,vo_is_first_field);
nestedvarsst.insert(result);

View File

@ -4299,7 +4299,7 @@ implementation
end
else
pname:=@optionalname;
sym:=cfieldvarsym.create(pname^,vs_value,def,[]);
sym:=cfieldvarsym.create(pname^,vs_value,def,[],true);
symtable.insert(sym);
trecordsymtable(symtable).addfield(sym,vis_hidden);
result:=sym;
@ -6847,7 +6847,7 @@ implementation
tObjectSymtable(symtable).datasize:=align(tObjectSymtable(symtable).datasize,sizeof(pint));
tObjectSymtable(symtable).alignrecord(tObjectSymtable(symtable).datasize,sizeof(pint));
end;
vmt_field:=cfieldvarsym.create('_vptr$'+objname^,vs_value,voidpointertype,[]);
vmt_field:=cfieldvarsym.create('_vptr$'+objname^,vs_value,voidpointertype,[],true);
hidesym(vmt_field);
tObjectSymtable(symtable).insert(vmt_field);
tObjectSymtable(symtable).addfield(tfieldvarsym(vmt_field),vis_hidden);

View File

@ -179,7 +179,7 @@ interface
{ could also be part of tabstractnormalvarsym, but there's }
{ one byte left here till the next 4 byte alignment }
addr_taken : boolean;
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions;doregister:boolean);
constructor ppuload(st:tsymtyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
procedure buildderef;override;
@ -215,7 +215,7 @@ interface
{$else symansistr}
cachedmangledname: pshortstring; { mangled name for ObjC or Java }
{$endif symansistr}
constructor create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);virtual;
constructor create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions;doregister:boolean);virtual;
constructor ppuload(ppufile:tcompilerppufile);
{ do not override this routine in platform-specific subclasses,
override ppuwrite_platform instead }
@ -1583,9 +1583,9 @@ implementation
TABSTRACTVARSYM
****************************************************************************}
constructor tabstractvarsym.create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor tabstractvarsym.create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions;doregister:boolean);
begin
inherited create(st,n,true);
inherited create(st,n,doregister);
vardef:=def;
varspez:=vsp;
varstate:=vs_declared;
@ -1737,9 +1737,9 @@ implementation
TFIELDVARSYM
****************************************************************************}
constructor tfieldvarsym.create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
constructor tfieldvarsym.create(const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions;doregister:boolean);
begin
inherited create(fieldvarsym,n,vsp,def,vopts);
inherited create(fieldvarsym,n,vsp,def,vopts,doregister);
fieldoffset:=-1;
end;
@ -1829,7 +1829,7 @@ implementation
constructor tabstractnormalvarsym.create(st:tsymtyp;const n : string;vsp:tvarspez;def:tdef;vopts:tvaroptions);
begin
inherited create(st,n,vsp,def,vopts);
inherited create(st,n,vsp,def,vopts,true);
fillchar(localloc,sizeof(localloc),0);
fillchar(currentregloc,sizeof(localloc),0);
fillchar(initialloc,sizeof(initialloc),0);
@ -2198,14 +2198,14 @@ implementation
constructor tabsolutevarsym.create(const n : string;def:tdef);
begin
inherited create(absolutevarsym,n,vs_value,def,[]);
inherited create(absolutevarsym,n,vs_value,def,[],true);
ref:=nil;
end;
constructor tabsolutevarsym.create_ref(const n : string;def:tdef;_ref:tpropaccesslist);
begin
inherited create(absolutevarsym,n,vs_value,def,[]);
inherited create(absolutevarsym,n,vs_value,def,[],true);
ref:=_ref;
end;