Browse Source

+ support for bitsizeof() function
+ some small tests for it

git-svn-id: trunk@4590 -

Jonas Maebe 19 years ago
parent
commit
cd5b9245f9
5 changed files with 34 additions and 3 deletions
  1. 1 0
      compiler/compinnr.inc
  2. 20 3
      compiler/pexpr.pas
  3. 1 0
      rtl/inc/innr.inc
  4. 6 0
      tests/test/tparray10.pp
  5. 6 0
      tests/test/tparray4.pp

+ 1 - 0
compiler/compinnr.inc

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

+ 20 - 3
compiler/pexpr.pas

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

+ 1 - 0
rtl/inc/innr.inc

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

+ 6 - 0
tests/test/tparray10.pp

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

+ 6 - 0
tests/test/tparray4.pp

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