mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-22 09:59:32 +01:00
* fixed sizeof(array of char)
This commit is contained in:
parent
1af9338130
commit
d5e1886c8c
@ -1873,34 +1873,54 @@ implementation
|
|||||||
in_sizeof_x,
|
in_sizeof_x,
|
||||||
in_typeof_x :
|
in_typeof_x :
|
||||||
begin
|
begin
|
||||||
{ for both cases load vmt }
|
{ sizeof(openarray) handling }
|
||||||
if p^.left^.treetype=typen then
|
if (p^.inlinenumber=in_sizeof_x) and
|
||||||
begin
|
is_open_array(p^.left^.resulttype) then
|
||||||
p^.location.register:=getregister32;
|
begin
|
||||||
exprasmlist^.concat(new(pai386,op_csymbol_reg(A_MOV,
|
{ sizeof(openarray)=high(openarray)+1 }
|
||||||
S_L,newcsymbol(pobjectdef(p^.left^.resulttype)^.vmt_mangledname,0),
|
secondpass(p^.left);
|
||||||
p^.location.register)));
|
del_reference(p^.left^.location.reference);
|
||||||
end
|
p^.location.register:=getregister32;
|
||||||
|
new(r);
|
||||||
|
reset_reference(r^);
|
||||||
|
r^.base:=highframepointer;
|
||||||
|
r^.offset:=highoffset+4;
|
||||||
|
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
||||||
|
r,p^.location.register)));
|
||||||
|
exprasmlist^.concat(new(pai386,op_reg(A_INC,S_L,
|
||||||
|
p^.location.register)));
|
||||||
|
end
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
secondpass(p^.left);
|
{ for both cases load vmt }
|
||||||
del_reference(p^.left^.location.reference);
|
if p^.left^.treetype=typen then
|
||||||
p^.location.loc:=LOC_REGISTER;
|
begin
|
||||||
p^.location.register:=getregister32;
|
p^.location.register:=getregister32;
|
||||||
{ load VMT pointer }
|
exprasmlist^.concat(new(pai386,op_csymbol_reg(A_MOV,
|
||||||
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
S_L,newcsymbol(pobjectdef(p^.left^.resulttype)^.vmt_mangledname,0),
|
||||||
newreference(p^.left^.location.reference),
|
p^.location.register)));
|
||||||
p^.location.register)));
|
end
|
||||||
end;
|
else
|
||||||
{ in sizeof load size }
|
begin
|
||||||
if p^.inlinenumber=in_sizeof_x then
|
secondpass(p^.left);
|
||||||
begin
|
del_reference(p^.left^.location.reference);
|
||||||
new(r);
|
p^.location.loc:=LOC_REGISTER;
|
||||||
reset_reference(r^);
|
p^.location.register:=getregister32;
|
||||||
r^.base:=p^.location.register;
|
{ load VMT pointer }
|
||||||
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,
|
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
|
||||||
p^.location.register)));
|
newreference(p^.left^.location.reference),
|
||||||
end;
|
p^.location.register)));
|
||||||
|
end;
|
||||||
|
{ in sizeof load size }
|
||||||
|
if p^.inlinenumber=in_sizeof_x then
|
||||||
|
begin
|
||||||
|
new(r);
|
||||||
|
reset_reference(r^);
|
||||||
|
r^.base:=p^.location.register;
|
||||||
|
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,r,
|
||||||
|
p^.location.register)));
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
in_lo_long,
|
in_lo_long,
|
||||||
in_hi_long :
|
in_hi_long :
|
||||||
@ -2291,7 +2311,10 @@ implementation
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.13 1998-08-10 14:49:45 peter
|
Revision 1.14 1998-08-11 14:05:33 peter
|
||||||
|
* fixed sizeof(array of char)
|
||||||
|
|
||||||
|
Revision 1.13 1998/08/10 14:49:45 peter
|
||||||
+ localswitches, moduleswitches, globalswitches splitting
|
+ localswitches, moduleswitches, globalswitches splitting
|
||||||
|
|
||||||
Revision 1.12 1998/07/30 13:30:31 florian
|
Revision 1.12 1998/07/30 13:30:31 florian
|
||||||
|
|||||||
@ -201,16 +201,14 @@ unit pexpr;
|
|||||||
begin
|
begin
|
||||||
Must_be_valid:=false;
|
Must_be_valid:=false;
|
||||||
do_firstpass(p1);
|
do_firstpass(p1);
|
||||||
if p1^.resulttype^.deftype<>objectdef then
|
if (p1^.resulttype^.deftype=objectdef) or
|
||||||
begin
|
is_open_array(p1^.resulttype) then
|
||||||
statement_syssym:=genordinalconstnode(
|
statement_syssym:=geninlinenode(in_sizeof_x,p1)
|
||||||
p1^.resulttype^.size,pd);
|
|
||||||
{ p1 not needed !}
|
|
||||||
disposetree(p1);
|
|
||||||
end
|
|
||||||
else
|
else
|
||||||
begin
|
begin
|
||||||
statement_syssym:=geninlinenode(in_sizeof_x,p1);
|
statement_syssym:=genordinalconstnode(p1^.resulttype^.size,pd);
|
||||||
|
{ p1 not needed !}
|
||||||
|
disposetree(p1);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -1788,7 +1786,10 @@ unit pexpr;
|
|||||||
end.
|
end.
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.31 1998-08-10 14:50:11 peter
|
Revision 1.32 1998-08-11 14:05:32 peter
|
||||||
|
* fixed sizeof(array of char)
|
||||||
|
|
||||||
|
Revision 1.31 1998/08/10 14:50:11 peter
|
||||||
+ localswitches, moduleswitches, globalswitches splitting
|
+ localswitches, moduleswitches, globalswitches splitting
|
||||||
|
|
||||||
Revision 1.30 1998/07/28 21:52:54 florian
|
Revision 1.30 1998/07/28 21:52:54 florian
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user