* fixed loading of procvar of object when the object is initialized

with 0
This commit is contained in:
peter 2002-09-01 12:15:40 +00:00
parent 8b2fb4187e
commit e0bcfca509

View File

@ -143,7 +143,6 @@ implementation
{ normal variable } { normal variable }
else else
begin begin
symtabletype:=symtable.symtabletype;
{ in case it is a register variable: } { in case it is a register variable: }
if tvarsym(symtableentry).reg<>R_NO then if tvarsym(symtableentry).reg<>R_NO then
begin begin
@ -165,109 +164,111 @@ implementation
end end
else else
begin begin
{ first handle local and temporary variables } symtabletype:=symtable.symtabletype;
if (symtabletype in [parasymtable,inlinelocalsymtable, case symtabletype of
inlineparasymtable,localsymtable]) then localsymtable,
begin parasymtable,
location.reference.base:=procinfo.framepointer; inlinelocalsymtable,
if (symtabletype in [inlinelocalsymtable, inlineparasymtable :
localsymtable]) begin
location.reference.base:=procinfo.framepointer;
if (symtabletype in [inlinelocalsymtable,
localsymtable])
{$ifdef powerpc} {$ifdef powerpc}
{ the ifdef is only for speed reasons } { the ifdef is only for speed reasons }
and not(target_info.system in [system_powerpc_linux,system_powerpc_macos]) and not(target_info.system in [system_powerpc_linux,system_powerpc_macos])
{$endif powerpc} {$endif powerpc}
then then
location.reference.offset:= location.reference.offset:=
tvarsym(symtableentry).address-symtable.address_fixup tvarsym(symtableentry).address-symtable.address_fixup
else else
location.reference.offset:= location.reference.offset:=
tvarsym(symtableentry).address+symtable.address_fixup; tvarsym(symtableentry).address+symtable.address_fixup;
{$ifndef powerpc} {$ifndef powerpc}
if (symtabletype in [localsymtable,inlinelocalsymtable]) then if (symtabletype in [localsymtable,inlinelocalsymtable]) then
begin begin
if use_esp_stackframe then if use_esp_stackframe then
dec(location.reference.offset, dec(location.reference.offset,
tvarsym(symtableentry).getvaluesize) tvarsym(symtableentry).getvaluesize)
else else
location.reference.offset:=-location.reference.offset; location.reference.offset:=-location.reference.offset;
end; end;
{$endif powerpc} {$endif powerpc}
if (lexlevel>symtable.symtablelevel) then if (lexlevel>symtable.symtablelevel) then
begin begin
hregister:=rg.getaddressregister(exprasmlist); hregister:=rg.getaddressregister(exprasmlist);
{ make a reference } { make a reference }
reference_reset_base(href,procinfo.framepointer,procinfo.framepointer_offset); reference_reset_base(href,procinfo.framepointer,procinfo.framepointer_offset);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister); cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
{ walk parents } { walk parents }
i:=lexlevel-1; i:=lexlevel-1;
while (i>symtable.symtablelevel) do while (i>symtable.symtablelevel) do
begin
{ make a reference }
reference_reset_base(href,hregister,target_info.first_parm_offset);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister);
dec(i);
end;
location.reference.base:=hregister;
end;
if (symtabletype in [parasymtable,inlineparasymtable]) then
begin
{ in case call by reference, then calculate. Open array
is always an reference! }
if (tvarsym(symtableentry).varspez in [vs_var,vs_out]) or
is_open_array(tvarsym(symtableentry).vartype.def) or
is_array_of_const(tvarsym(symtableentry).vartype.def) or
paramanager.push_addr_param(tvarsym(symtableentry).vartype.def,
(tprocdef(symtable.defowner).proccalloption in [pocall_cdecl,pocall_cppdecl])) then
begin begin
{ make a reference } if hregister=R_NO then
reference_reset_base(href,hregister,target_info.first_parm_offset); hregister:=rg.getaddressregister(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_ADDR,href,hregister); { we need to load only an address }
dec(i); location.size:=OS_ADDR;
end; cg.a_load_loc_reg(exprasmlist,location,hregister);
location.reference.base:=hregister; location_reset(location,LOC_REFERENCE,newsize);
end; location.reference.base:=hregister;
end end;
else end;
case symtabletype of end;
globalsymtable, globalsymtable,
staticsymtable : staticsymtable :
begin begin
location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname); location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname);
end; end;
stt_exceptsymtable: stt_exceptsymtable:
begin begin
location.reference.base:=procinfo.framepointer; location.reference.base:=procinfo.framepointer;
location.reference.offset:=tvarsym(symtableentry).address; location.reference.offset:=tvarsym(symtableentry).address;
end; end;
objectsymtable: objectsymtable:
begin begin
if (sp_static in tvarsym(symtableentry).symoptions) then if (sp_static in tvarsym(symtableentry).symoptions) then
location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname) location.reference.symbol:=objectlibrary.newasmsymbol(tvarsym(symtableentry).mangledname)
else else
begin begin
rg.getexplicitregisterint(exprasmlist,SELF_POINTER_REG); rg.getexplicitregisterint(exprasmlist,SELF_POINTER_REG);
location.reference.base:=SELF_POINTER_REG; location.reference.base:=SELF_POINTER_REG;
location.reference.offset:=tvarsym(symtableentry).address; location.reference.offset:=tvarsym(symtableentry).address;
end; end;
end; end;
withsymtable: withsymtable:
begin begin
if nf_islocal in tnode(twithsymtable(symtable).withnode).flags then if nf_islocal in tnode(twithsymtable(symtable).withnode).flags then
location.reference:=twithnode(twithsymtable(symtable).withnode).withreference location.reference:=twithnode(twithsymtable(symtable).withnode).withreference
else else
begin begin
location.reference.base:=rg.getaddressregister(exprasmlist); location.reference.base:=rg.getaddressregister(exprasmlist);
cg.a_load_ref_reg(exprasmlist,OS_ADDR, cg.a_load_ref_reg(exprasmlist,OS_ADDR,
twithnode(twithsymtable(symtable).withnode).withreference, twithnode(twithsymtable(symtable).withnode).withreference,
location.reference.base); location.reference.base);
end; end;
inc(location.reference.offset,tvarsym(symtableentry).address); inc(location.reference.offset,tvarsym(symtableentry).address);
end; end;
end; end;
end; end;
{ cdecl procedure }
is_cdecl:=(symtabletype=parasymtable) and
(tprocdef(symtable.defowner).proccalloption in [pocall_cdecl,pocall_cppdecl]);
{ in case call by reference, then calculate. Open array
is always an reference! }
if (tvarsym(symtableentry).varspez in [vs_var,vs_out]) or
is_open_array(tvarsym(symtableentry).vartype.def) or
is_array_of_const(tvarsym(symtableentry).vartype.def) or
((tvarsym(symtableentry).varspez=vs_const) and
paramanager.push_addr_param(tvarsym(symtableentry).vartype.def,is_cdecl)) then
begin
if hregister=R_NO then
hregister:=rg.getaddressregister(exprasmlist);
{ we need to load only an address }
location.size:=OS_ADDR;
cg.a_load_loc_reg(exprasmlist,location,hregister);
location_reset(location,LOC_REFERENCE,newsize);
location.reference.base:=hregister;
end;
end; end;
end; end;
procsym: procsym:
@ -292,7 +293,9 @@ implementation
if left.nodetype=typen then if left.nodetype=typen then
begin begin
{ there is no instance, we return 0 } { there is no instance, we return 0 }
cg.a_load_const_ref(exprasmlist,OS_ADDR,0,location.reference); href:=location.reference;
inc(href.offset,POINTER_SIZE);
cg.a_load_const_ref(exprasmlist,OS_ADDR,0,href);
end end
else else
begin begin
@ -944,7 +947,11 @@ begin
end. end.
{ {
$Log$ $Log$
Revision 1.26 2002-08-25 19:25:18 peter Revision 1.27 2002-09-01 12:15:40 peter
* fixed loading of procvar of object when the object is initialized
with 0
Revision 1.26 2002/08/25 19:25:18 peter
* sym.insert_in_data removed * sym.insert_in_data removed
* symtable.insertvardata/insertconstdata added * symtable.insertvardata/insertconstdata added
* removed insert_in_data call from symtable.insert, it needs to be * removed insert_in_data call from symtable.insert, it needs to be