Explorar el Código

* TBits.ORBits and TBits.XORBits: properly handle case when other TBits object has smaller Size. Mantis #25289.

git-svn-id: trunk@26121 -
sergei hace 11 años
padre
commit
43c96cd898
Se han modificado 3 ficheros con 115 adiciones y 6 borrados
  1. 1 0
      .gitattributes
  2. 4 6
      rtl/objpas/classes/bits.inc
  3. 110 0
      tests/webtbs/tw25289.pp

+ 1 - 0
.gitattributes

@@ -13712,6 +13712,7 @@ tests/webtbs/tw25198.pp svneol=native#text/plain
 tests/webtbs/tw25210.pp svneol=native#text/pascal
 tests/webtbs/tw2525.pp svneol=native#text/plain
 tests/webtbs/tw25269.pp svneol=native#text/pascal
+tests/webtbs/tw25289.pp svneol=native#text/plain
 tests/webtbs/tw25318.pp svneol=native#text/pascal
 tests/webtbs/tw25349.pp svneol=native#text/plain
 tests/webtbs/tw2536.pp svneol=native#text/plain

+ 4 - 6
rtl/objpas/classes/bits.inc

@@ -212,10 +212,9 @@ procedure TBits.orbits(bitset : TBits);
 var
    loop : longint;
 begin
-   if FBSize < bitset.Size then
-     grow(bitset.Size);
+   grow(bitset.Size);
 
-   for loop := 0 to FSize-1 do
+   for loop := 0 to bitset.getFSize-1 do
       FBits^[loop] := FBits^[loop] or bitset.FBits^[loop];
 end;
 
@@ -223,10 +222,9 @@ procedure TBits.xorbits(bitset : TBits);
 var
    loop : longint;
 begin
-   if FBSize < bitset.Size then
-     grow(bitset.Size);
+   grow(bitset.Size);
 
-   for loop := 0 to FSize-1 do
+   for loop := 0 to bitset.getFSize-1 do
       FBits^[loop] := FBits^[loop] xor bitset.FBits^[loop];
 end;
 

+ 110 - 0
tests/webtbs/tw25289.pp

@@ -0,0 +1,110 @@
+{$mode objfpc}{$H+}
+
+uses
+  Classes, SysUtils;
+
+var
+  code: integer;
+
+function bitstostring(b: TBits): string;
+var
+  i: integer;
+  bs: string;
+begin
+  bs:= '';
+  for i:= 0 to b.Size - 1 do
+    if b[i] then
+      bs:= bs + '1'
+    else
+      bs:= bs + '0';
+  Result:= bs;
+end;
+
+procedure Test;
+var
+  i, bsize1, bsize2: integer;
+  b1, b2, b3: TBits;
+begin
+  code := 0;
+  // OR
+  bsize1:= 16;
+  bsize2:= 164;
+  b1:= TBits.Create;
+  b2:= TBits.Create(bsize2);
+  b3:= TBits.Create(bsize2);
+  for i:= 0 to bsize1 - 1 do
+    b1[i]:= True;
+
+  b2.OrBits(b1);
+  b3.OrBits(b1);
+  for i:= b1.Size to bsize2 - 1 do
+    b3[i]:= False;
+  if not b2.Equals(b3) then
+  begin
+    WriteLn('OR');
+    writeln(bitstostring(b1));
+    writeln(bitstostring(b2));
+    writeln(bitstostring(b3));
+    code := code or 1;
+  end;
+  b1.Free;
+  b2.Free;
+  b3.Free;
+
+  // XOR
+  bsize1:= 16;
+  bsize2:= 164;
+  b1:= TBits.Create;
+  b2:= TBits.Create(bsize2);
+  b3:= TBits.Create(bsize2);
+  for i:= 0 to bsize1 - 1 do
+    b1[i]:= True;
+
+  b2.XOrBits(b1);
+  b3.XOrBits(b1);
+  for i:= b1.Size to bsize2 - 1 do
+    b3[i]:= False;
+  if not b2.Equals(b3) then
+  begin
+    WriteLn('XOR');
+    writeln(bitstostring(b1));
+    writeln(bitstostring(b2));
+    writeln(bitstostring(b3));
+    code := code or 2;
+  end;
+  b1.Free;
+  b2.Free;
+  b3.Free;
+
+  // AND
+  bsize1:= 16;
+  bsize2:= 164;
+  b1:= TBits.Create;
+  b2:= TBits.Create(bsize2);
+  b3:= TBits.Create(bsize2);
+  for i:= 0 to bsize1 - 1 do
+    b1[i]:= True;
+
+  b2.AndBits(b1);
+  b3.AndBits(b1);
+  for i:= b1.Size to bsize2 - 1 do
+    b3[i]:= False;
+  if not b2.Equals(b3) then
+  begin
+    WriteLn('AND');
+    writeln(bitstostring(b1));
+    writeln(bitstostring(b2));
+    writeln(bitstostring(b3));
+    code := code or 4;
+  end;
+  b1.Free;
+  b2.Free;
+  b3.Free;
+end;
+
+begin
+  test;
+  halt(code);
+end.
+
+