Skip to content

Commit

Permalink
Merge branch 'wfl_memleak_fix'
Browse files Browse the repository at this point in the history
  • Loading branch information
CelticMinstrel committed Apr 9, 2017
2 parents ac6a620 + 0b02ba0 commit 795592f
Show file tree
Hide file tree
Showing 23 changed files with 237 additions and 190 deletions.
2 changes: 1 addition & 1 deletion src/ai/composite/value_translator.hpp
Expand Up @@ -342,7 +342,7 @@ class variant_value_translator<attacks_vector> {
{
std::vector<wfl::variant> vars;
for(attacks_vector::const_iterator i = value.begin(); i != value.end(); ++i) {
vars.emplace_back(new attack_analysis(*i));
vars.emplace_back(std::make_shared<attack_analysis>(*i));
}
var = wfl::variant(vars);
}
Expand Down
20 changes: 10 additions & 10 deletions src/ai/default/attack.cpp
Expand Up @@ -40,7 +40,7 @@ static lg::log_domain log_ai("ai/attack");

namespace ai {

extern ai_context& get_ai_context(const wfl::formula_callable* for_fai);
extern ai_context& get_ai_context(wfl::const_formula_callable_ptr for_fai);

void attack_analysis::analyze(const gamemap& map, unit_map& units,
const readonly_context& ai_obj,
Expand Down Expand Up @@ -335,21 +335,21 @@ wfl::variant attack_analysis::get_value(const std::string& key) const
{
using namespace wfl;
if(key == "target") {
return variant(new location_callable(target));
return variant(std::make_shared<location_callable>(target));
} else if(key == "movements") {
std::vector<variant> res;
for(size_t n = 0; n != movements.size(); ++n) {
map_formula_callable* item = new map_formula_callable(nullptr);
item->add("src", variant(new location_callable(movements[n].first)));
item->add("dst", variant(new location_callable(movements[n].second)));
auto item = std::make_shared<map_formula_callable>(nullptr);
item->add("src", variant(std::make_shared<location_callable>(movements[n].first)));
item->add("dst", variant(std::make_shared<location_callable>(movements[n].second)));
res.emplace_back(item);
}

return variant(res);
} else if(key == "units") {
std::vector<variant> res;
for(size_t n = 0; n != movements.size(); ++n) {
res.emplace_back(new location_callable(movements[n].first));
res.emplace_back(std::make_shared<location_callable>(movements[n].first));
}

return variant(res);
Expand Down Expand Up @@ -429,22 +429,22 @@ wfl::variant attack_analysis::execute_self(wfl::variant ctxt) {
//check if target is still valid
unit = units.find(att_dst);
if(unit == units.end()) {
return wfl::variant(new wfl::safe_call_result(this, attack_result::E_EMPTY_DEFENDER, move_from));
return wfl::variant(std::make_shared<wfl::safe_call_result>(fake_ptr(), attack_result::E_EMPTY_DEFENDER, move_from));
}

//check if we need to move
if(move_from != att_src) {
//now check if location to which we want to move is still unoccupied
unit = units.find(att_src);
if(unit != units.end()) {
return wfl::variant(new wfl::safe_call_result(this, move_result::E_NO_UNIT, move_from));
return wfl::variant(std::make_shared<wfl::safe_call_result>(fake_ptr(), move_result::E_NO_UNIT, move_from));
}

ai::move_result_ptr result = get_ai_context(ctxt.as_callable()).execute_move_action(move_from, att_src);
if(!result->is_ok()) {
//move part failed
LOG_AI << "ERROR #" << result->get_status() << " while executing 'attack' formula function\n" << std::endl;
return wfl::variant(new wfl::safe_call_result(this, result->get_status(), result->get_unit_location()));
return wfl::variant(std::make_shared<wfl::safe_call_result>(fake_ptr(), result->get_status(), result->get_unit_location()));
}
}

Expand All @@ -453,7 +453,7 @@ wfl::variant attack_analysis::execute_self(wfl::variant ctxt) {
if(!result->is_ok()) {
//attack failed
LOG_AI << "ERROR #" << result->get_status() << " while executing 'attack' formula function\n" << std::endl;
return wfl::variant(new wfl::safe_call_result(this, result->get_status()));
return wfl::variant(std::make_shared<wfl::safe_call_result>(fake_ptr(), result->get_status()));
}
}
return wfl::variant(true);
Expand Down
43 changes: 22 additions & 21 deletions src/ai/formula/ai.cpp
Expand Up @@ -105,6 +105,7 @@ formula_ai::formula_ai(readonly_context &context, const config &cfg)
cfg_(cfg),
recursion_counter_(context.get_recursion_count()),
keeps_cache_(),
attacks_callable(*this, resources::gameboard->units()),
// infinite_loop_guardian_(),
vars_(),
function_table_(*this)
Expand Down Expand Up @@ -162,13 +163,13 @@ std::string formula_ai::evaluate(const std::string& formula_str)

formula f(formula_str, &function_table_);

map_formula_callable callable(this);
map_formula_callable callable(fake_ptr());

//formula_debugger fdb;
const variant v = f.evaluate(callable,nullptr);

if (ai_ptr_) {
variant var = variant(this).execute_variant(v);
variant var = variant(this->fake_ptr()).execute_variant(v);

if ( !var.is_empty() ) {
return "Made move: " + var.to_debug_string();
Expand All @@ -194,7 +195,7 @@ wfl::variant formula_ai::make_action(wfl::const_formula_ptr formula_, const wfl:
variant res;

if (ai_ptr_) {
res = variant(this).execute_variant(var);
res = variant(this->fake_ptr()).execute_variant(var);
} else {
ERR_AI << "skipped execution of action because ai context is not set correctly" << std::endl;
}
Expand Down Expand Up @@ -276,7 +277,7 @@ variant villages_from_set(const Container& villages,
if(exclude && exclude->count(loc)) {
continue;
}
vars.emplace_back(new location_callable(loc));
vars.emplace_back(std::make_shared<location_callable>(loc));
}

return variant(vars);
Expand Down Expand Up @@ -368,7 +369,7 @@ variant formula_ai::get_value(const std::string& key) const

} else if(key == "my_side")
{
return variant(new team_callable(resources::gameboard->teams()[get_side()-1]));
return variant(std::make_shared<team_callable>(resources::gameboard->teams()[get_side()-1]));

} else if(key == "my_side_number")
{
Expand All @@ -378,7 +379,7 @@ variant formula_ai::get_value(const std::string& key) const
{
std::vector<variant> vars;
for(std::vector<team>::const_iterator i = resources::gameboard->teams().begin(); i != resources::gameboard->teams().end(); ++i) {
vars.emplace_back(new team_callable(*i));
vars.emplace_back(std::make_shared<team_callable>(*i));
}
return variant(vars);

Expand Down Expand Up @@ -415,7 +416,7 @@ variant formula_ai::get_value(const std::string& key) const
const unit_type *ut = unit_types.find(*i);
if (ut)
{
vars.emplace_back(new unit_type_callable(*ut));
vars.emplace_back(std::make_shared<unit_type_callable>(*ut));
}
}
return variant(vars);
Expand All @@ -441,7 +442,7 @@ variant formula_ai::get_value(const std::string& key) const
const unit_type *ut = unit_types.find(*str_it);
if (ut)
{
tmp[i].emplace_back(new unit_type_callable(*ut));
tmp[i].emplace_back(std::make_shared<unit_type_callable>(*ut));
}
}
}
Expand All @@ -454,7 +455,7 @@ variant formula_ai::get_value(const std::string& key) const
{
std::vector<variant> vars;
for(unit_map::const_iterator i = units.begin(); i != units.end(); ++i) {
vars.emplace_back(new unit_callable(*i));
vars.emplace_back(std::make_shared<unit_callable>(*i));
}
return variant(vars);

Expand All @@ -468,7 +469,7 @@ variant formula_ai::get_value(const std::string& key) const
tmp.push_back( v );
}
for(const unit &u : units) {
tmp[u.side() - 1].emplace_back(new unit_callable(u));
tmp[u.side() - 1].emplace_back(std::make_shared<unit_callable>(u));
}
for( size_t i = 0; i<tmp.size(); ++i)
vars.emplace_back(tmp[i]);
Expand All @@ -479,7 +480,7 @@ variant formula_ai::get_value(const std::string& key) const
std::vector<variant> vars;
for(unit_map::const_iterator i = units.begin(); i != units.end(); ++i) {
if (i->side() == get_side()) {
vars.emplace_back(new unit_callable(*i));
vars.emplace_back(std::make_shared<unit_callable>(*i));
}
}
return variant(vars);
Expand All @@ -490,50 +491,50 @@ variant formula_ai::get_value(const std::string& key) const
for(unit_map::const_iterator i = units.begin(); i != units.end(); ++i) {
if (current_team().is_enemy(i->side())) {
if (!i->incapacitated()) {
vars.emplace_back(new unit_callable(*i));
vars.emplace_back(std::make_shared<unit_callable>(*i));
}
}
}
return variant(vars);

} else if(key == "my_moves")
{
return variant(new move_map_callable(get_srcdst(), get_dstsrc(), units));
return variant(std::make_shared<move_map_callable>(get_srcdst(), get_dstsrc(), units));

} else if(key == "my_attacks")
{
return variant(new attack_map_callable(*this, units));
return variant(attacks_callable.fake_ptr());
} else if(key == "enemy_moves")
{
return variant(new move_map_callable(get_enemy_srcdst(), get_enemy_dstsrc(), units));
return variant(std::make_shared<move_map_callable>(get_enemy_srcdst(), get_enemy_dstsrc(), units));

} else if(key == "my_leader")
{
unit_map::const_iterator i = units.find_leader(get_side());
if(i == units.end()) {
return variant();
}
return variant(new unit_callable(*i));
return variant(std::make_shared<unit_callable>(*i));

} else if(key == "recall_list")
{
std::vector<variant> tmp;

for(std::vector<unit_ptr >::const_iterator i = current_team().recall_list().begin(); i != current_team().recall_list().end(); ++i) {
tmp.push_back( variant( new unit_callable(**i) ) );
tmp.push_back( variant(std::make_shared<unit_callable>(**i) ) );
}

return variant(tmp);

} else if(key == "vars")
{
return variant(&vars_);
return variant(vars_.fake_ptr());
} else if(key == "keeps")
{
return get_keeps();
} else if(key == "map")
{
return variant(new gamemap_callable(resources::gameboard->map()));
return variant(std::make_shared<gamemap_callable>(resources::gameboard->map()));
} else if(key == "villages")
{
return villages_from_set(resources::gameboard->map().villages());
Expand Down Expand Up @@ -609,7 +610,7 @@ variant formula_ai::get_keeps() const
get_adjacent_tiles(loc,adj);
for(size_t n = 0; n != 6; ++n) {
if(resources::gameboard->map().is_castle(adj[n])) {
vars.emplace_back(new location_callable(loc));
vars.emplace_back(std::make_shared<location_callable>(loc));
break;
}
}
Expand Down Expand Up @@ -683,7 +684,7 @@ void formula_ai::evaluate_candidate_action(ca_ptr fai_ca)

bool formula_ai::execute_candidate_action(ca_ptr fai_ca)
{
map_formula_callable callable(this);
map_formula_callable callable(fake_ptr());
fai_ca->update_callable_map( callable );
const_formula_ptr move_formula(fai_ca->get_action());
return !make_action(move_formula, callable).is_empty();
Expand Down
3 changes: 2 additions & 1 deletion src/ai/formula/ai.hpp
Expand Up @@ -166,13 +166,14 @@ class formula_ai : public readonly_context_proxy, public wfl::formula_callable {
virtual void get_inputs(wfl::formula_input_vector& inputs) const override;

mutable wfl::variant keeps_cache_;
wfl::attack_map_callable attacks_callable;

// gamestate_change_observer infinite_loop_guardian_;
wfl::map_formula_callable vars_;
wfl::ai_function_symbol_table function_table_;

friend class ai_default;
friend ai_context& get_ai_context(const formula_callable* for_fai);
friend ai_context& get_ai_context(wfl::const_formula_callable_ptr for_fai);
};

} //end of namespace ai
Expand Down

0 comments on commit 795592f

Please sign in to comment.