mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-14 02:59:33 +02:00
* fixed @methodpointer
This commit is contained in:
parent
458a7f58dc
commit
624e5bd699
@ -200,7 +200,7 @@ unit cgobj;
|
|||||||
procedure a_load_const_loc(list : taasmoutput;a : aword;const loc : tlocation);
|
procedure a_load_const_loc(list : taasmoutput;a : aword;const loc : tlocation);
|
||||||
procedure a_load_reg_ref(list : taasmoutput;size : tcgsize;register : tregister;const ref : treference);virtual; abstract;
|
procedure a_load_reg_ref(list : taasmoutput;size : tcgsize;register : tregister;const ref : treference);virtual; abstract;
|
||||||
procedure a_load_reg_reg(list : taasmoutput;size : tcgsize;reg1,reg2 : tregister);virtual; abstract;
|
procedure a_load_reg_reg(list : taasmoutput;size : tcgsize;reg1,reg2 : tregister);virtual; abstract;
|
||||||
procedure a_load_reg_loc(list : taasmoutput;reg : tregister;const loc: tlocation);
|
procedure a_load_reg_loc(list : taasmoutput;size : tcgsize;reg : tregister;const loc: tlocation);
|
||||||
procedure a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref : treference;register : tregister);virtual; abstract;
|
procedure a_load_ref_reg(list : taasmoutput;size : tcgsize;const ref : treference;register : tregister);virtual; abstract;
|
||||||
procedure a_load_loc_reg(list : taasmoutput;const loc: tlocation; reg : tregister);
|
procedure a_load_loc_reg(list : taasmoutput;const loc: tlocation; reg : tregister);
|
||||||
procedure a_load_loc_ref(list : taasmoutput;const loc: tlocation; const ref : treference);
|
procedure a_load_loc_ref(list : taasmoutput;const loc: tlocation; const ref : treference);
|
||||||
@ -1226,13 +1226,13 @@ unit cgobj;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
procedure tcg.a_load_reg_loc(list : taasmoutput;reg : tregister;const loc: tlocation);
|
procedure tcg.a_load_reg_loc(list : taasmoutput;size : tcgsize;reg : tregister;const loc: tlocation);
|
||||||
begin
|
begin
|
||||||
case loc.loc of
|
case loc.loc of
|
||||||
LOC_REFERENCE,LOC_CREFERENCE:
|
LOC_REFERENCE,LOC_CREFERENCE:
|
||||||
a_load_reg_ref(list,loc.size,reg,loc.reference);
|
a_load_reg_ref(list,size,reg,loc.reference);
|
||||||
LOC_REGISTER,LOC_CREGISTER:
|
LOC_REGISTER,LOC_CREGISTER:
|
||||||
a_load_reg_reg(list,loc.size,reg,loc.register);
|
a_load_reg_reg(list,size,reg,loc.register);
|
||||||
else
|
else
|
||||||
internalerror(200203271);
|
internalerror(200203271);
|
||||||
end;
|
end;
|
||||||
@ -1645,7 +1645,10 @@ finalization
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.16 2002-04-21 15:25:30 carl
|
Revision 1.17 2002-04-22 16:30:05 peter
|
||||||
|
* fixed @methodpointer
|
||||||
|
|
||||||
|
Revision 1.16 2002/04/21 15:25:30 carl
|
||||||
+ a_jmp_cond -> a_jmp_always (a_jmp_cond is NOT portable)
|
+ a_jmp_cond -> a_jmp_always (a_jmp_cond is NOT portable)
|
||||||
+ changeregsize -> rg.makeregsize
|
+ changeregsize -> rg.makeregsize
|
||||||
|
|
||||||
|
@ -291,13 +291,13 @@ implementation
|
|||||||
begin
|
begin
|
||||||
location_reset(location,LOC_CREFERENCE,OS_64);
|
location_reset(location,LOC_CREFERENCE,OS_64);
|
||||||
tg.gettempofsizereference(exprasmlist,8,location.reference);
|
tg.gettempofsizereference(exprasmlist,8,location.reference);
|
||||||
|
|
||||||
|
{ called as type.method, then we only need to return
|
||||||
|
the address of the function, not the self pointer }
|
||||||
if left.nodetype=typen then
|
if left.nodetype=typen then
|
||||||
begin
|
begin
|
||||||
if left.resulttype.def.deftype<>objectdef then
|
{ there is no instance, we return 0 }
|
||||||
internalerror(200103261);
|
cg.a_load_const_ref(exprasmlist,OS_ADDR,0,location.reference);
|
||||||
hregister:=rg.getexplicitregisterint(exprasmlist,R_EDI);
|
|
||||||
emit_sym_ofs_reg(A_MOV,S_L,
|
|
||||||
newasmsymbol(tobjectdef(left.resulttype.def).vmt_mangledname),0,R_EDI);
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
@ -325,15 +325,16 @@ implementation
|
|||||||
emit_ref_reg(A_LEA,S_L,left.location.reference,R_EDI);
|
emit_ref_reg(A_LEA,S_L,left.location.reference,R_EDI);
|
||||||
end;
|
end;
|
||||||
else internalerror(26019);
|
else internalerror(26019);
|
||||||
|
|
||||||
end;
|
end;
|
||||||
location_release(exprasmlist,left.location);
|
location_release(exprasmlist,left.location);
|
||||||
location_freetemp(exprasmlist,left.location);
|
location_freetemp(exprasmlist,left.location);
|
||||||
end;
|
|
||||||
|
|
||||||
{ store the class instance address }
|
{ store the class instance address }
|
||||||
href:=location.reference;
|
href:=location.reference;
|
||||||
inc(href.offset,4);
|
inc(href.offset,4);
|
||||||
emit_reg_ref(A_MOV,S_L,hregister,href);
|
emit_reg_ref(A_MOV,S_L,hregister,href);
|
||||||
|
end;
|
||||||
|
|
||||||
{ virtual method ? }
|
{ virtual method ? }
|
||||||
if (po_virtualmethod in tprocdef(resulttype.def).procoptions) then
|
if (po_virtualmethod in tprocdef(resulttype.def).procoptions) then
|
||||||
@ -349,14 +350,15 @@ implementation
|
|||||||
tprocdef(resulttype.def).extnumber));
|
tprocdef(resulttype.def).extnumber));
|
||||||
emit_ref_reg(A_MOV,S_L,href,R_EDI);
|
emit_ref_reg(A_MOV,S_L,href,R_EDI);
|
||||||
{ ... and store it }
|
{ ... and store it }
|
||||||
emit_reg_ref(A_MOV,S_L,R_EDI,location.reference);
|
cg.a_load_reg_loc(exprasmlist,OS_ADDR,R_EDI,location);
|
||||||
rg.ungetregisterint(exprasmlist,R_EDI);
|
rg.ungetregisterint(exprasmlist,R_EDI);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
|
reference_reset_symbol(href,newasmsymbol(tprocdef(resulttype.def).mangledname),0);
|
||||||
|
cg.a_loadaddr_ref_reg(exprasmlist,href,R_EDI);
|
||||||
|
cg.a_load_reg_loc(exprasmlist,OS_ADDR,R_EDI,location);
|
||||||
rg.ungetregisterint(exprasmlist,R_EDI);
|
rg.ungetregisterint(exprasmlist,R_EDI);
|
||||||
s:=newasmsymbol(tprocdef(resulttype.def).mangledname);
|
|
||||||
emit_sym_ofs_ref(A_MOV,S_L,s,0,location.reference);
|
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
@ -645,7 +647,7 @@ implementation
|
|||||||
tcg64f32(cg).a_load64_reg_loc(exprasmlist,
|
tcg64f32(cg).a_load64_reg_loc(exprasmlist,
|
||||||
right.location.registerlow,right.location.registerhigh,left.location)
|
right.location.registerlow,right.location.registerhigh,left.location)
|
||||||
else
|
else
|
||||||
cg.a_load_reg_loc(exprasmlist,right.location.register,left.location);
|
cg.a_load_reg_loc(exprasmlist,right.location.size,right.location.register,left.location);
|
||||||
end;
|
end;
|
||||||
LOC_FPUREGISTER,LOC_CFPUREGISTER :
|
LOC_FPUREGISTER,LOC_CFPUREGISTER :
|
||||||
begin
|
begin
|
||||||
@ -777,7 +779,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.37 2002-04-21 15:36:13 carl
|
Revision 1.38 2002-04-22 16:30:06 peter
|
||||||
|
* fixed @methodpointer
|
||||||
|
|
||||||
|
Revision 1.37 2002/04/21 15:36:13 carl
|
||||||
* changeregsize -> rg.makeregsize
|
* changeregsize -> rg.makeregsize
|
||||||
|
|
||||||
Revision 1.36 2002/04/19 15:39:35 peter
|
Revision 1.36 2002/04/19 15:39:35 peter
|
||||||
|
@ -261,15 +261,27 @@ implementation
|
|||||||
end
|
end
|
||||||
else
|
else
|
||||||
resulttype.setdef(procdeflist);
|
resulttype.setdef(procdeflist);
|
||||||
{ if the owner of the procsym is a object, }
|
|
||||||
{ left must be set, if left isn't set }
|
if (m_tp_procvar in aktmodeswitches) then
|
||||||
{ it can be only self }
|
|
||||||
{ this code is only used in TP procvar mode }
|
|
||||||
if (m_tp_procvar in aktmodeswitches) and
|
|
||||||
not(assigned(left)) and
|
|
||||||
(tprocsym(symtableentry).owner.symtabletype=objectsymtable) then
|
|
||||||
begin
|
begin
|
||||||
left:=cselfnode.create(tobjectdef(symtableentry.owner.defowner));
|
if assigned(left) then
|
||||||
|
begin
|
||||||
|
if left.nodetype=typen then
|
||||||
|
begin
|
||||||
|
{ we need to return only a voidpointer,
|
||||||
|
so no need to keep the typen }
|
||||||
|
left.free;
|
||||||
|
left:=nil;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
{ if the owner of the procsym is a object, }
|
||||||
|
{ left must be set, if left isn't set }
|
||||||
|
{ it can be only self }
|
||||||
|
if (tprocsym(symtableentry).owner.symtabletype=objectsymtable) then
|
||||||
|
left:=cselfnode.create(tobjectdef(symtableentry.owner.defowner));
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ process methodpointer }
|
{ process methodpointer }
|
||||||
@ -913,7 +925,10 @@ begin
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.35 2002-04-21 19:02:04 peter
|
Revision 1.36 2002-04-22 16:30:06 peter
|
||||||
|
* fixed @methodpointer
|
||||||
|
|
||||||
|
Revision 1.35 2002/04/21 19:02:04 peter
|
||||||
* removed newn and disposen nodes, the code is now directly
|
* removed newn and disposen nodes, the code is now directly
|
||||||
inlined from pexpr
|
inlined from pexpr
|
||||||
* -an option that will write the secondpass nodes to the .s file, this
|
* -an option that will write the secondpass nodes to the .s file, this
|
||||||
|
Loading…
Reference in New Issue
Block a user