+ support for bitsizeof() function

+ some small tests for it

git-svn-id: trunk@4590 -
This commit is contained in:
Jonas Maebe 2006-09-09 18:57:49 +00:00
parent 056eb5b012
commit cd5b9245f9
5 changed files with 34 additions and 3 deletions

View File

@ -68,6 +68,7 @@ const
in_get_caller_frame = 58;
in_pack_x_y_z = 59;
in_unpack_x_y_z = 60;
in_bitsizeof_x = 61;
{ Internal constant functions }
in_const_sqr = 100;

View File

@ -470,7 +470,8 @@ implementation
end;
end;
in_sizeof_x :
in_sizeof_x,
in_bitsizeof_x :
begin
consume(_LKLAMMER);
in_args:=true;
@ -484,10 +485,26 @@ implementation
is_array_of_const(p1.resulttype.def) or
is_open_string(p1.resulttype.def)
) then
statement_syssym:=geninlinenode(in_sizeof_x,false,p1)
begin
statement_syssym:=geninlinenode(in_sizeof_x,false,p1);
{ no packed bit support for these things }
if (l = in_bitsizeof_x) then
statement_syssym:=caddnode.create(muln,statement_syssym,cordconstnode.create(8,sinttype,true));
end
else
begin
statement_syssym:=cordconstnode.create(p1.resulttype.def.size,sinttype,true);
if (l = in_sizeof_x) or
(not((p1.nodetype = vecn) and
is_packed_array(tvecnode(p1).left.resulttype.def)) and
not((p1.nodetype = subscriptn) and
is_packed_record_or_object(tsubscriptnode(p1).left.resulttype.def))) then
begin
statement_syssym:=cordconstnode.create(p1.resulttype.def.size,sinttype,true);
if (l = in_bitsizeof_x) then
statement_syssym:=caddnode.create(muln,statement_syssym,cordconstnode.create(8,sinttype,true));
end
else
statement_syssym:=cordconstnode.create(p1.resulttype.def.packedbitsize,sinttype,true);
{ p1 not needed !}
p1.destroy;
end;

View File

@ -69,6 +69,7 @@ const
fpc_in_get_caller_frame = 58;
fpc_in_pack_x_y_z = 59;
fpc_in_unpack_x_y_z = 60;
fpc_in_bitsizeof_x = 61;
{ Internal constant functions }
fpc_in_const_sqr = 100;

View File

@ -17,12 +17,18 @@ type
var
unone : array[3..24] of char;
pacone : packed array[1..4] of char;
pacy : array[1..4] of char;
untwo : array[4..8] of colourtype;
pactwo : packed array[6..7] of colourtype;
i : integer;
colour : colourtype;
s: string;
begin
pacone:='ABCD';
pacy:=pacone;
if pacy <> 'ABCD' then
halt(1);
s := pacone;
unpack(pacone,unone,5);
if (unone[3] <> #0) or
(unone[4] <> #0) or

View File

@ -16,6 +16,10 @@ type
var
km: GPCKeymap;
begin
if bitsizeof(km[1]) <> 1 then
halt(1);
if bitsizeof(FPCKeyMap(km)[0]) <> 8 then
halt(2);
fillchar(km,sizeof(km),0);
km[56] := true;
if (FPCKeyMap(km)[0] <> 0) or
@ -42,5 +46,7 @@ begin
writeln('error');
halt(1);
end;
writeln('ok');
end.