]> git.sesse.net Git - stockfish/blobdiff - src/position.cpp
Don't copy Position in pretty_pv()
[stockfish] / src / position.cpp
index aac03eb24a328150f71443bdd03ef8f3797e353f..80dcdd5724afab805dea2e90fe374baa08f90c71 100644 (file)
@@ -36,7 +36,6 @@
 #include "position.h"
 #include "psqtab.h"
 #include "rkiss.h"
-#include "san.h"
 #include "tt.h"
 #include "ucioption.h"
 
@@ -777,7 +776,9 @@ bool Position::move_is_check(Move m, const CheckInfo& ci) const {
 /// It should be used when setting up a position on board.
 /// You can't undo the move.
 
-void Position::do_setup_move(Move m, StateInfo& newSt) {
+void Position::do_setup_move(Move m) {
+
+  StateInfo newSt;
 
   do_move(m, newSt);
 
@@ -788,6 +789,10 @@ void Position::do_setup_move(Move m, StateInfo& newSt) {
 
   // Update the number of plies played from the starting position
   startPosPlyCounter++;
+
+  // Our StateInfo newSt is about going out of scope so copy
+  // its content inside pos before it disappears.
+  detach();
 }
 
 /// Position::do_move() makes a move, and saves all information necessary
@@ -804,6 +809,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
 
   assert(is_ok());
   assert(move_is_ok(m));
+  assert(&newSt != st);
 
   nodes++;
   Key key = st->key;
@@ -819,8 +825,7 @@ void Position::do_move(Move m, StateInfo& newSt, const CheckInfo& ci, bool moveI
     Value npMaterial[2];
   };
 
-  if (&newSt != st)
-      memcpy(&newSt, st, sizeof(ReducedStateInfo));
+  memcpy(&newSt, st, sizeof(ReducedStateInfo));
 
   newSt.previous = st;
   st = &newSt;
@@ -1709,7 +1714,7 @@ bool Position::is_draw() const {
 bool Position::is_mate() const {
 
   MoveStack moves[MOVES_MAX];
-  return is_check() && generate_moves(*this, moves) == moves;
+  return is_check() && generate<MV_LEGAL>(*this, moves) == moves;
 }
 
 
@@ -1730,8 +1735,8 @@ bool Position::has_mate_threat() {
   do_null_move(st1);
 
   // Then generate pseudo-legal moves that could give check
-  last = generate_non_capture_checks(*this, mlist);
-  last = generate_captures(*this, last);
+  last = generate<MV_NON_CAPTURE_CHECK>(*this, mlist);
+  last = generate<MV_CAPTURE>(*this, last);
 
   // Loop through the moves, and see if one of them gives mate
   Bitboard pinned = pinned_pieces(sideToMove);