]> git.sesse.net Git - stockfish/commitdiff
Document index[] and pieceList[] are not invariants
authorMarco Costalba <mcostalba@gmail.com>
Mon, 31 Aug 2009 08:59:33 +0000 (10:59 +0200)
committerMarco Costalba <mcostalba@gmail.com>
Mon, 31 Aug 2009 09:02:28 +0000 (11:02 +0200)
Array index[] and pieceList[] are not guaranteed to be
invariant to a do_move() + undo_move() sequence when a
capture move is involved.

The reason is that the captured piece is removed form
the list and substituted with the last one in do_move()
while in undo_move() is added again but at the end of
the list.

Because index[] and pieceList[] are used in move generation
to scan the pieces it means that moves will be generated
in a different order before and after a do_move() + undo_move()
sequence as, for instance, the one in Position::has_mate_threat()

After latest patches, move generation could now be invoked
also by MovePicker c'tor and this explains why order of
picked moves is different if MovePicker object is istantiated
before or after a Position::has_mate_threat() call.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/position.cpp

index 2b50ff2ae258df7a49eb0d892b79511d41e31908..c673225737b2906d428743b8a6f034d60d75d1c9 100644 (file)
@@ -939,6 +939,12 @@ void Position::do_capture_move(Bitboard& key, PieceType capture, Color them, Squ
     pieceCount[them][capture]--;
 
     // Update piece list, move the last piece at index[capsq] position
+    //
+    // WARNING: this is a not perfectly revresible operation. When we
+    // will reinsert the captured piece in undo_move() we will put it
+    // at the end of the list and not in its original place, it means
+    // index[] and pieceList[] are not guaranteed to be invariant to a
+    // do_move() + undo_move() sequence.
     Square lastPieceSquare = pieceList[them][capture][pieceCount[them][capture]];
     index[lastPieceSquare] = index[capsq];
     pieceList[them][capture][index[lastPieceSquare]] = lastPieceSquare;