* 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_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

View File

@ -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