diff --git a/src/position.cpp b/src/position.cpp index 67680b1f..fc9e23c9 100644 --- a/src/position.cpp +++ b/src/position.cpp @@ -707,10 +707,17 @@ void Position::do_move(Move m, StateInfo& newSt, Bitboard dcCandidates) { assert(is_ok()); assert(move_is_ok(m)); - // Copy some fields of old state to our new StateInfo object (except the - // captured piece, which is taken care of later) and switch state pointer - // to point to the new, ready to be updated, state. - newSt = *st; + // Copy some fields of old state to our new StateInfo object except the + // ones which are recalculated from scratch anyway, then switch our state + // pointer to point to the new, ready to be updated, state. + struct ReducedStateInfo { + Key key, pawnKey, materialKey; + int castleRights, rule50; + Square epSquare; + Value mgValue, egValue; + }; + + memcpy(&newSt, st, sizeof(ReducedStateInfo)); newSt.capture = NO_PIECE_TYPE; newSt.previous = st; st = &newSt; diff --git a/src/position.h b/src/position.h index bd59b5c9..8e29eb13 100644 --- a/src/position.h +++ b/src/position.h @@ -79,14 +79,15 @@ enum CastleRights { /// must be passed as a parameter. struct StateInfo { - Bitboard checkersBB; Key key, pawnKey, materialKey; int castleRights, rule50; Square epSquare; Value mgValue, egValue; + PieceType capture; - StateInfo* previous; + Bitboard checkersBB; Move lastMove; + StateInfo* previous; };