* fixed sizeof(array of char)

This commit is contained in:
peter 1998-08-11 14:05:32 +00:00
parent 1af9338130
commit d5e1886c8c
2 changed files with 61 additions and 37 deletions

View File

@ -1873,34 +1873,54 @@ implementation
in_sizeof_x,
in_typeof_x :
begin
{ for both cases load vmt }
if p^.left^.treetype=typen then
begin
p^.location.register:=getregister32;
exprasmlist^.concat(new(pai386,op_csymbol_reg(A_MOV,
S_L,newcsymbol(pobjectdef(p^.left^.resulttype)^.vmt_mangledname,0),
p^.location.register)));
end
{ sizeof(openarray) handling }
if (p^.inlinenumber=in_sizeof_x) and
is_open_array(p^.left^.resulttype) then
begin
{ sizeof(openarray)=high(openarray)+1 }
secondpass(p^.left);
del_reference(p^.left^.location.reference);
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
begin
secondpass(p^.left);
del_reference(p^.left^.location.reference);
p^.location.loc:=LOC_REGISTER;
p^.location.register:=getregister32;
{ load VMT pointer }
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
newreference(p^.left^.location.reference),
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;
begin
{ for both cases load vmt }
if p^.left^.treetype=typen then
begin
p^.location.register:=getregister32;
exprasmlist^.concat(new(pai386,op_csymbol_reg(A_MOV,
S_L,newcsymbol(pobjectdef(p^.left^.resulttype)^.vmt_mangledname,0),
p^.location.register)));
end
else
begin
secondpass(p^.left);
del_reference(p^.left^.location.reference);
p^.location.loc:=LOC_REGISTER;
p^.location.register:=getregister32;
{ load VMT pointer }
exprasmlist^.concat(new(pai386,op_ref_reg(A_MOV,S_L,
newreference(p^.left^.location.reference),
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;
in_lo_long,
in_hi_long :
@ -2291,7 +2311,10 @@ implementation
end.
{
$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
Revision 1.12 1998/07/30 13:30:31 florian

View File

@ -201,16 +201,14 @@ unit pexpr;
begin
Must_be_valid:=false;
do_firstpass(p1);
if p1^.resulttype^.deftype<>objectdef then
begin
statement_syssym:=genordinalconstnode(
p1^.resulttype^.size,pd);
{ p1 not needed !}
disposetree(p1);
end
if (p1^.resulttype^.deftype=objectdef) or
is_open_array(p1^.resulttype) then
statement_syssym:=geninlinenode(in_sizeof_x,p1)
else
begin
statement_syssym:=geninlinenode(in_sizeof_x,p1);
statement_syssym:=genordinalconstnode(p1^.resulttype^.size,pd);
{ p1 not needed !}
disposetree(p1);
end;
end;
end;
@ -1788,7 +1786,10 @@ unit pexpr;
end.
{
$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
Revision 1.30 1998/07/28 21:52:54 florian