mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 05:09:19 +02:00
* fixed loading of procvar of object when the object is initialized
with 0
This commit is contained in:
parent
8b2fb4187e
commit
e0bcfca509
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user