From 60bc30275decbb00aa26af8dc14ad6cb167eaa82 Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Mon, 5 Oct 2009 12:00:35 +0100 Subject: [PATCH] Small code reformat in TranspositionTable::extract_pv() In particular don't use an array of StateInfo, this avoids a possible overflow and is in any case redundant. Also pass as argument the pv[] array size to avoid a second possible overflow on this one. Fix suggested by Joona. No functional change. Signed-off-by: Marco Costalba --- src/search.cpp | 2 +- src/tt.cpp | 33 ++++++++++++++++----------------- src/tt.h | 2 +- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/search.cpp b/src/search.cpp index 08b2c006..32934393 100644 --- a/src/search.cpp +++ b/src/search.cpp @@ -947,7 +947,7 @@ namespace { // Update PV rml.set_move_score(i, value); update_pv(ss, 0); - TT.extract_pv(pos, ss[0].pv); + TT.extract_pv(pos, ss[0].pv, PLY_MAX); rml.set_move_pv(i, ss[0].pv); if (MultiPV == 1) diff --git a/src/tt.cpp b/src/tt.cpp index 9f0e21fd..5e1dfe17 100644 --- a/src/tt.cpp +++ b/src/tt.cpp @@ -220,27 +220,26 @@ void TranspositionTable::insert_pv(const Position& pos, Move pv[]) { /// will often get single-move PVs when the search stops while failing high, /// and a single-move PV means that we don't have a ponder move. -void TranspositionTable::extract_pv(const Position& pos, Move pv[]) { +void TranspositionTable::extract_pv(const Position& pos, Move pv[], int pvSize) { - int ply; - Position p(pos); - StateInfo st[100]; - - for (ply = 0; pv[ply] != MOVE_NONE; ply++) - p.do_move(pv[ply], st[ply]); - - bool stop; const TTEntry* tte; - for (stop = false, tte = retrieve(p.get_key()); - tte && tte->move() != MOVE_NONE && !stop; - tte = retrieve(p.get_key()), ply++) + StateInfo st; + Position p(pos); + int ply = 0; + + // Update position to the end of current PV + while (pv[ply] != MOVE_NONE) + p.do_move(pv[ply++], st); + + // Try to add moves from TT until possible + while ( (tte = retrieve(p.get_key())) != NULL + && tte->move() != MOVE_NONE + && move_is_legal(p, tte->move()) + && (!p.is_draw() || ply < 2) + && ply < pvSize) { - if (!move_is_legal(p, tte->move())) - break; pv[ply] = tte->move(); - p.do_move(pv[ply], st[ply]); - for (int j = 0; j < ply; j++) - if (st[j].key == p.get_key()) stop = true; + p.do_move(pv[ply++], st); } pv[ply] = MOVE_NONE; } diff --git a/src/tt.h b/src/tt.h index 2c989dac..bff17498 100644 --- a/src/tt.h +++ b/src/tt.h @@ -102,7 +102,7 @@ public: void prefetch(const Key posKey) const; void new_search(); void insert_pv(const Position& pos, Move pv[]); - void extract_pv(const Position& pos, Move pv[]); + void extract_pv(const Position& pos, Move pv[], int pvSize); int full() const; private: -- 2.39.2