compiler:

- move objname, objrealname fields from tobjectdef to tabstractrecorddef, 
  - load and save them from/to ppu file, 
  - use tabstarctrecorddef in some more places where previously code worked for tobjectdef
  - change push_nested_hierarchy, pop_nested_hierarchy to handle records too

git-svn-id: branches/paul/extended_records@16519 -
This commit is contained in:
paul 2010-12-08 06:58:48 +00:00
parent d7c8d9e620
commit 26cef34005
8 changed files with 92 additions and 60 deletions

View File

@ -65,10 +65,10 @@ interface
{ helper functions - they insert nested objects hierarcy to the symtablestack { helper functions - they insert nested objects hierarcy to the symtablestack
with object hierarchy with object hierarchy
} }
function push_child_hierarcy(obj:tobjectdef):integer; function push_child_hierarcy(obj:tabstractrecorddef):integer;
function pop_child_hierarchy(obj:tobjectdef):integer; function pop_child_hierarchy(obj:tabstractrecorddef):integer;
function push_nested_hierarchy(obj:tobjectdef):integer; function push_nested_hierarchy(obj:tabstractrecorddef):integer;
function pop_nested_hierarchy(obj:tobjectdef):integer; function pop_nested_hierarchy(obj:tabstractrecorddef):integer;
implementation implementation
@ -97,15 +97,21 @@ implementation
Declaring it as string here results in an error when compiling (PFV) } Declaring it as string here results in an error when compiling (PFV) }
current_procinfo = 'error'; current_procinfo = 'error';
function push_child_hierarcy(obj:tobjectdef):integer; function push_child_hierarcy(obj:tabstractrecorddef):integer;
var var
_class,hp : tobjectdef; _class,hp : tobjectdef;
begin begin
if obj.typ=recorddef then
begin
symtablestack.push(obj.symtable);
result:=1;
exit;
end;
result:=0; result:=0;
{ insert class hierarchy in the reverse order } { insert class hierarchy in the reverse order }
hp:=nil; hp:=nil;
repeat repeat
_class:=obj; _class:=tobjectdef(obj);
while _class.childof<>hp do while _class.childof<>hp do
_class:=_class.childof; _class:=_class.childof;
hp:=_class; hp:=_class;
@ -114,20 +120,26 @@ implementation
until hp=obj; until hp=obj;
end; end;
function push_nested_hierarchy(obj:tobjectdef):integer; function push_nested_hierarchy(obj:tabstractrecorddef):integer;
begin begin
result:=0; result:=0;
if obj.owner.symtabletype=ObjectSymtable then if obj.owner.symtabletype in [ObjectSymtable,recordsymtable] then
inc(result,push_nested_hierarchy(tobjectdef(obj.owner.defowner))); inc(result,push_nested_hierarchy(tabstractrecorddef(obj.owner.defowner)));
inc(result,push_child_hierarcy(obj)); inc(result,push_child_hierarcy(obj));
end; end;
function pop_child_hierarchy(obj:tobjectdef):integer; function pop_child_hierarchy(obj:tabstractrecorddef):integer;
var var
_class : tobjectdef; _class : tobjectdef;
begin begin
if obj.typ=recorddef then
begin
symtablestack.pop(obj.symtable);
result:=1;
exit;
end;
result:=0; result:=0;
_class:=obj; _class:=tobjectdef(obj);
while assigned(_class) do while assigned(_class) do
begin begin
symtablestack.pop(_class.symtable); symtablestack.pop(_class.symtable);
@ -136,11 +148,11 @@ implementation
end; end;
end; end;
function pop_nested_hierarchy(obj:tobjectdef):integer; function pop_nested_hierarchy(obj:tabstractrecorddef):integer;
begin begin
result:=pop_child_hierarchy(obj); result:=pop_child_hierarchy(obj);
if obj.owner.symtabletype=ObjectSymtable then if obj.owner.symtabletype in [ObjectSymtable,recordsymtable] then
inc(result,pop_nested_hierarchy(tobjectdef(obj.owner.defowner))); inc(result,pop_nested_hierarchy(tabstractrecorddef(obj.owner.defowner)));
end; end;
procedure insert_funcret_para(pd:tabstractprocdef); procedure insert_funcret_para(pd:tabstractprocdef);

View File

@ -1608,8 +1608,8 @@ implementation
Message(type_e_ordinal_expr_expected); Message(type_e_ordinal_expr_expected);
consume(_OF); consume(_OF);
UnionSymtable:=trecordsymtable.create(current_settings.packrecords); UnionSymtable:=trecordsymtable.create('',current_settings.packrecords);
UnionDef:=trecorddef.create(unionsymtable); UnionDef:=trecorddef.create('',unionsymtable);
uniondef.isunion:=true; uniondef.isunion:=true;
startvarrecsize:=UnionSymtable.datasize; startvarrecsize:=UnionSymtable.datasize;
{ align the bitpacking to the next byte } { align the bitpacking to the next byte }

View File

@ -43,7 +43,7 @@ type
{$endif Test_Double_checksum} {$endif Test_Double_checksum}
const const
CurrentPPUVersion = 121; CurrentPPUVersion = 122;
{ buffer sizes } { buffer sizes }
maxentrysize = 1024; maxentrysize = 1024;

View File

@ -347,8 +347,8 @@ implementation
end; end;
addtype('$s64currency',s64currencytype); addtype('$s64currency',s64currencytype);
{ Add a type for virtual method tables } { Add a type for virtual method tables }
hrecst:=trecordsymtable.create(current_settings.packrecords); hrecst:=trecordsymtable.create('',current_settings.packrecords);
vmttype:=trecorddef.create(hrecst); vmttype:=trecorddef.create('',hrecst);
pvmttype:=tpointerdef.create(vmttype); pvmttype:=tpointerdef.create(vmttype);
{ can't use addtype for pvmt because the rtti of the pointed { can't use addtype for pvmt because the rtti of the pointed
type is not available. The rtti for pvmt will be written implicitly type is not available. The rtti for pvmt will be written implicitly
@ -371,10 +371,10 @@ implementation
tarraydef(vmtarraytype).elementdef:=pvmttype; tarraydef(vmtarraytype).elementdef:=pvmttype;
addtype('$vtblarray',vmtarraytype); addtype('$vtblarray',vmtarraytype);
{ Add a type for methodpointers } { Add a type for methodpointers }
hrecst:=trecordsymtable.create(1); hrecst:=trecordsymtable.create('',1);
addfield(hrecst,tfieldvarsym.create('$proc',vs_value,voidpointertype,[])); addfield(hrecst,tfieldvarsym.create('$proc',vs_value,voidpointertype,[]));
addfield(hrecst,tfieldvarsym.create('$self',vs_value,voidpointertype,[])); addfield(hrecst,tfieldvarsym.create('$self',vs_value,voidpointertype,[]));
methodpointertype:=trecorddef.create(hrecst); methodpointertype:=trecorddef.create('',hrecst);
addtype('$methodpointer',methodpointertype); addtype('$methodpointer',methodpointertype);
symtablestack.pop(systemunit); symtablestack.pop(systemunit);
end; end;

View File

@ -871,15 +871,15 @@ implementation
end; end;
{ reads a record declaration } { reads a record declaration }
function record_dec : tdef; function record_dec(const n:tidstring):tdef;
var var
old_current_structdef : tabstractrecorddef; old_current_structdef : tabstractrecorddef;
recst : trecordsymtable; recst : trecordsymtable;
begin begin
old_current_structdef:=current_structdef; old_current_structdef:=current_structdef;
{ create recdef } { create recdef }
recst:=trecordsymtable.create(current_settings.packrecords); recst:=trecordsymtable.create(n,current_settings.packrecords);
current_structdef:=trecorddef.create(recst); current_structdef:=trecorddef.create(n,recst);
result:=current_structdef; result:=current_structdef;
{ insert in symtablestack } { insert in symtablestack }
symtablestack.push(recst); symtablestack.push(recst);
@ -890,8 +890,7 @@ implementation
recst.addalignmentpadding; recst.addalignmentpadding;
{ restore symtable stack } { restore symtable stack }
symtablestack.pop(recst); symtablestack.pop(recst);
if trecorddef(record_dec).is_packed and if trecorddef(current_structdef).is_packed and is_managed_type(current_structdef) then
is_managed_type(record_dec) then
Message(type_e_no_packed_inittable); Message(type_e_no_packed_inittable);
current_structdef:=old_current_structdef; current_structdef:=old_current_structdef;
end; end;
@ -1314,7 +1313,7 @@ implementation
end; end;
_RECORD: _RECORD:
begin begin
def:=record_dec; def:=record_dec(name);
end; end;
_PACKED, _PACKED,
_BITPACKED: _BITPACKED:
@ -1349,7 +1348,7 @@ implementation
def:=object_dec(odt_object,name,genericdef,genericlist,nil); def:=object_dec(odt_object,name,genericdef,genericlist,nil);
end; end;
else else
def:=record_dec; def:=record_dec(name);
end; end;
current_settings.packrecords:=oldpackrecords; current_settings.packrecords:=oldpackrecords;
end; end;

View File

@ -171,9 +171,15 @@ interface
{ tabstractrecorddef } { tabstractrecorddef }
tabstractrecorddef= class(tstoreddef) tabstractrecorddef= class(tstoreddef)
objname,
objrealname: PShortString;
symtable : TSymtable; symtable : TSymtable;
cloneddef : tabstractrecorddef; cloneddef : tabstractrecorddef;
cloneddefderef : tderef; cloneddefderef : tderef;
constructor create(const n:string; dt:tdeftyp);
constructor ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
procedure ppuwrite(ppufile:tcompilerppufile);override;
destructor destroy; override;
function GetSymtable(t:tGetSymtable):TSymtable;override; function GetSymtable(t:tGetSymtable):TSymtable;override;
function is_packed:boolean; function is_packed:boolean;
function RttiName: string; function RttiName: string;
@ -182,7 +188,7 @@ interface
trecorddef = class(tabstractrecorddef) trecorddef = class(tabstractrecorddef)
public public
isunion : boolean; isunion : boolean;
constructor create(p : TSymtable); constructor create(const n:string; p:TSymtable);
constructor ppuload(ppufile:tcompilerppufile); constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override; destructor destroy;override;
function getcopy : tstoreddef;override; function getcopy : tstoreddef;override;
@ -246,8 +252,6 @@ interface
{ for C++ classes: name of the library this class is imported from } { for C++ classes: name of the library this class is imported from }
import_lib, import_lib,
objname,
objrealname,
{ for Objective-C: protocols and classes can have the same name there } { for Objective-C: protocols and classes can have the same name there }
objextname : pshortstring; objextname : pshortstring;
objectoptions : tobjectoptions; objectoptions : tobjectoptions;
@ -274,7 +278,7 @@ interface
classref_created_in_current_module : boolean; classref_created_in_current_module : boolean;
{ store implemented interfaces defs and name mappings } { store implemented interfaces defs and name mappings }
ImplementedInterfaces : TFPObjectList; ImplementedInterfaces : TFPObjectList;
constructor create(ot : tobjecttyp;const n : string;c : tobjectdef); constructor create(ot:tobjecttyp;const n:string;c:tobjectdef);
constructor ppuload(ppufile:tcompilerppufile); constructor ppuload(ppufile:tcompilerppufile);
destructor destroy;override; destructor destroy;override;
function getcopy : tstoreddef;override; function getcopy : tstoreddef;override;
@ -869,11 +873,11 @@ implementation
st:=st.defowner.owner; st:=st.defowner.owner;
end; end;
{ object/classes symtable, nested type definitions in classes require the while loop } { object/classes symtable, nested type definitions in classes require the while loop }
while st.symtabletype=ObjectSymtable do while st.symtabletype in [ObjectSymtable,recordsymtable] do
begin begin
if st.defowner.typ<>objectdef then if not (st.defowner.typ in [objectdef,recorddef]) then
internalerror(200204174); internalerror(200204174);
prefix:=tobjectdef(st.defowner).objname^+'_$_'+prefix; prefix:=tabstractrecorddef(st.defowner).objname^+'_$_'+prefix;
st:=st.defowner.owner; st:=st.defowner.owner;
end; end;
{ symtable must now be static or global } { symtable must now be static or global }
@ -2554,6 +2558,33 @@ implementation
tabstractrecorddef tabstractrecorddef
***************************************************************************} ***************************************************************************}
constructor tabstractrecorddef.create(const n:string; dt:tdeftyp);
begin
inherited create(dt);
objname:=stringdup(upper(n));
objrealname:=stringdup(n);
end;
constructor tabstractrecorddef.ppuload(dt:tdeftyp;ppufile:tcompilerppufile);
begin
inherited ppuload(dt,ppufile);
objrealname:=stringdup(ppufile.getstring);
objname:=stringdup(upper(objrealname^));
end;
procedure tabstractrecorddef.ppuwrite(ppufile: tcompilerppufile);
begin
inherited ppuwrite(ppufile);
ppufile.putstring(objrealname^);
end;
destructor tabstractrecorddef.destroy;
begin
stringdispose(objname);
stringdispose(objrealname);
inherited destroy;
end;
function tabstractrecorddef.GetSymtable(t:tGetSymtable):TSymtable; function tabstractrecorddef.GetSymtable(t:tGetSymtable):TSymtable;
begin begin
if t=gs_record then if t=gs_record then
@ -2572,14 +2603,14 @@ implementation
var var
tmp: tabstractrecorddef; tmp: tabstractrecorddef;
begin begin
Result:=typename; Result:=objrealname^;
tmp:=self; tmp:=self;
repeat repeat
if tmp.owner.symtabletype in [ObjectSymtable,recordsymtable] then if tmp.owner.symtabletype in [ObjectSymtable,recordsymtable] then
tmp:=tabstractrecorddef(tmp.owner.defowner) tmp:=tabstractrecorddef(tmp.owner.defowner)
else else
break; break;
Result:=tmp.typename+'.'+Result; Result:=tmp.objrealname^+'.'+Result;
until tmp=nil; until tmp=nil;
end; end;
@ -2588,9 +2619,9 @@ implementation
trecorddef trecorddef
***************************************************************************} ***************************************************************************}
constructor trecorddef.create(p : TSymtable); constructor trecorddef.create(const n:string; p:TSymtable);
begin begin
inherited create(recorddef); inherited create(n,recorddef);
symtable:=p; symtable:=p;
{ we can own the symtable only if nobody else owns a copy so far } { we can own the symtable only if nobody else owns a copy so far }
if symtable.refcount=1 then if symtable.refcount=1 then
@ -2606,7 +2637,7 @@ implementation
ppufile.getderef(cloneddefderef) ppufile.getderef(cloneddefderef)
else else
begin begin
symtable:=trecordsymtable.create(0); symtable:=trecordsymtable.create(objrealname^,0);
trecordsymtable(symtable).fieldalignment:=shortint(ppufile.getbyte); trecordsymtable(symtable).fieldalignment:=shortint(ppufile.getbyte);
trecordsymtable(symtable).recordalignment:=shortint(ppufile.getbyte); trecordsymtable(symtable).recordalignment:=shortint(ppufile.getbyte);
trecordsymtable(symtable).padalignment:=shortint(ppufile.getbyte); trecordsymtable(symtable).padalignment:=shortint(ppufile.getbyte);
@ -2633,7 +2664,7 @@ implementation
function trecorddef.getcopy : tstoreddef; function trecorddef.getcopy : tstoreddef;
begin begin
result:=trecorddef.create(symtable.getcopy); result:=trecorddef.create(objrealname^,symtable.getcopy);
trecorddef(result).isunion:=isunion; trecorddef(result).isunion:=isunion;
include(trecorddef(result).defoptions,df_copied_def); include(trecorddef(result).defoptions,df_copied_def);
end; end;
@ -3933,9 +3964,9 @@ implementation
TOBJECTDEF TOBJECTDEF
***************************************************************************} ***************************************************************************}
constructor tobjectdef.create(ot : tobjecttyp;const n : string;c : tobjectdef); constructor tobjectdef.create(ot:tobjecttyp;const n:string;c:tobjectdef);
begin begin
inherited create(objectdef); inherited create(n,objectdef);
fcurrent_dispid:=0; fcurrent_dispid:=0;
objecttype:=ot; objecttype:=ot;
objectoptions:=[]; objectoptions:=[];
@ -3945,8 +3976,6 @@ implementation
vmtentries:=TFPList.Create; vmtentries:=TFPList.Create;
vmt_offset:=0; vmt_offset:=0;
set_parent(c); set_parent(c);
objname:=stringdup(upper(n));
objrealname:=stringdup(n);
if objecttype in [odt_interfacecorba,odt_interfacecom,odt_dispinterface] then if objecttype in [odt_interfacecorba,odt_interfacecom,odt_dispinterface] then
prepareguid; prepareguid;
{ setup implemented interfaces } { setup implemented interfaces }
@ -3968,8 +3997,6 @@ implementation
begin begin
inherited ppuload(objectdef,ppufile); inherited ppuload(objectdef,ppufile);
objecttype:=tobjecttyp(ppufile.getbyte); objecttype:=tobjecttyp(ppufile.getbyte);
objrealname:=stringdup(ppufile.getstring);
objname:=stringdup(upper(objrealname^));
objextname:=stringdup(ppufile.getstring); objextname:=stringdup(ppufile.getstring);
{ only used for external Objective-C classes/protocols } { only used for external Objective-C classes/protocols }
if (objextname^='') then if (objextname^='') then
@ -4054,8 +4081,6 @@ implementation
symtable.free; symtable.free;
symtable:=nil; symtable:=nil;
end; end;
stringdispose(objname);
stringdispose(objrealname);
stringdispose(objextname); stringdispose(objextname);
stringdispose(import_lib); stringdispose(import_lib);
stringdispose(iidstr); stringdispose(iidstr);
@ -4088,14 +4113,10 @@ implementation
var var
i : longint; i : longint;
begin begin
result:=tobjectdef.create(objecttype,objname^,childof); result:=tobjectdef.create(objecttype,objrealname^,childof);
{ the constructor allocates a symtable which we release to avoid memory leaks } { the constructor allocates a symtable which we release to avoid memory leaks }
tobjectdef(result).symtable.free; tobjectdef(result).symtable.free;
tobjectdef(result).symtable:=symtable.getcopy; tobjectdef(result).symtable:=symtable.getcopy;
if assigned(objname) then
tobjectdef(result).objname:=stringdup(objname^);
if assigned(objrealname) then
tobjectdef(result).objrealname:=stringdup(objrealname^);
if assigned(objextname) then if assigned(objextname) then
tobjectdef(result).objextname:=stringdup(objextname^); tobjectdef(result).objextname:=stringdup(objextname^);
if assigned(import_lib) then if assigned(import_lib) then
@ -4141,7 +4162,6 @@ implementation
ppufile.do_indirect_crc:=true; ppufile.do_indirect_crc:=true;
inherited ppuwrite(ppufile); inherited ppuwrite(ppufile);
ppufile.putbyte(byte(objecttype)); ppufile.putbyte(byte(objecttype));
ppufile.putstring(objrealname^);
if assigned(objextname) then if assigned(objextname) then
ppufile.putstring(objextname^) ppufile.putstring(objextname^)
else else

View File

@ -104,7 +104,7 @@ interface
trecordsymtable = class(tabstractrecordsymtable) trecordsymtable = class(tabstractrecordsymtable)
public public
constructor create(usealign:shortint); constructor create(const n:string;usealign:shortint);
procedure insertunionst(unionst : trecordsymtable;offset : longint); procedure insertunionst(unionst : trecordsymtable;offset : longint);
end; end;
@ -1047,9 +1047,9 @@ implementation
TRecordSymtable TRecordSymtable
****************************************************************************} ****************************************************************************}
constructor trecordsymtable.create(usealign:shortint); constructor trecordsymtable.create(const n:string;usealign:shortint);
begin begin
inherited create('',usealign); inherited create(n,usealign);
symtabletype:=recordsymtable; symtabletype:=recordsymtable;
end; end;
@ -1622,7 +1622,7 @@ implementation
function generate_nested_name(symtable:tsymtable;delimiter:string):string; function generate_nested_name(symtable:tsymtable;delimiter:string):string;
begin begin
result:=''; result:='';
while assigned(symtable) and (symtable.symtabletype=ObjectSymtable) do while assigned(symtable) and (symtable.symtabletype in [ObjectSymtable,recordsymtable]) do
begin begin
if (result='') then if (result='') then
result:=symtable.name^ result:=symtable.name^

View File

@ -2091,6 +2091,7 @@ begin
ibrecorddef : ibrecorddef :
begin begin
readcommondef('Record definition',defoptions); readcommondef('Record definition',defoptions);
writeln(space,' Name of Record : ',getstring);
writeln(space,' FieldAlign : ',getbyte); writeln(space,' FieldAlign : ',getbyte);
writeln(space,' RecordAlign : ',getbyte); writeln(space,' RecordAlign : ',getbyte);
writeln(space,' PadAlign : ',getbyte); writeln(space,' PadAlign : ',getbyte);
@ -2108,6 +2109,7 @@ begin
ibobjectdef : ibobjectdef :
begin begin
readcommondef('Object/Class definition',defoptions); readcommondef('Object/Class definition',defoptions);
writeln(space,' Name of Class : ',getstring);
b:=getbyte; b:=getbyte;
write (space,' Type : '); write (space,' Type : ');
case tobjecttyp(b) of case tobjecttyp(b) of
@ -2121,7 +2123,6 @@ begin
odt_objcprotocol : writeln('objcprotocol'); odt_objcprotocol : writeln('objcprotocol');
else writeln('!! Warning: Invalid object type ',b); else writeln('!! Warning: Invalid object type ',b);
end; end;
writeln(space,' Name of Class : ',getstring);
writeln(space,' External name : ',getstring); writeln(space,' External name : ',getstring);
writeln(space,' Import lib : ',getstring); writeln(space,' Import lib : ',getstring);
writeln(space,' DataSize : ',getaint); writeln(space,' DataSize : ',getaint);