From 040009ace80e7897dda8ffbcfb9ba697f772a7e5 Mon Sep 17 00:00:00 2001 From: Iurii Chernyi Date: Tue, 11 Aug 2009 20:17:49 +0000 Subject: [PATCH] added additional debug info to some formula functions, as a test of concept --- src/ai/formula/function_table.cpp | 8 ++-- src/formula.cpp | 10 ++--- src/formula_debugger.cpp | 67 ++++++++++++++++++++++++++----- src/formula_debugger.hpp | 33 +++++++++++++++ src/formula_function.cpp | 4 +- 5 files changed, 103 insertions(+), 19 deletions(-) diff --git a/src/ai/formula/function_table.cpp b/src/ai/formula/function_table.cpp index 93eeb38e828..72c7c5e9bb0 100644 --- a/src/ai/formula/function_table.cpp +++ b/src/ai/formula/function_table.cpp @@ -94,8 +94,8 @@ public: private: variant execute(const formula_callable& variables, formula_debugger *fdb) const { - const map_location loc = convert_variant(args()[0]->evaluate(variables,fdb))->loc(); - variant items = args()[1]->evaluate(variables,fdb); + const map_location loc = convert_variant(args()[0]->evaluate(variables,formula_debugger::add_debug_info(fdb,0,"nearest_loc:location")))->loc(); + variant items = args()[1]->evaluate(variables,formula_debugger::add_debug_info(fdb,1,"nearest_loc:locations")); int best = 1000000; int best_i = -1; @@ -322,7 +322,7 @@ public: private: variant execute(const formula_callable& variables, formula_debugger *fdb) const { - const map_location loc = convert_variant(args()[0]->evaluate(variables,fdb))->loc(); + const map_location loc = convert_variant(args()[0]->evaluate(variables,formula_debugger::add_debug_info(fdb,0,"nearest_keep:location")))->loc(); int best = 1000000; int best_i = -1; @@ -940,7 +940,7 @@ public: {} private: variant execute(const formula_callable& variables, formula_debugger *fdb) const { - variant res = args()[0]->evaluate(variables,fdb); + variant res = args()[0]->evaluate(variables,formula_debugger::add_debug_info(fdb,0,"unit_moves:unit_location")); std::vector vars; if(res.is_null()) { return variant(&vars); diff --git a/src/formula.cpp b/src/formula.cpp index 75e5c309f2d..8f4bea6622b 100644 --- a/src/formula.cpp +++ b/src/formula.cpp @@ -73,7 +73,7 @@ public: {} private: - variant execute(const formula_callable& /*variables*/, formula_debugger */*fdb*/) const { + variant execute(const formula_callable& /*variables*/, formula_debugger * /*fdb*/) const { std::vector res; std::vector function_names = builtin_function_names(); std::vector more_function_names = symbols_->get_function_names(); @@ -223,7 +223,7 @@ public: {} private: variant execute(const formula_callable& variables, formula_debugger *fdb) const { - const variant left = left_->evaluate(variables,fdb); + const variant left = left_->evaluate(variables,formula_debugger::add_debug_info(fdb,0,"left.")); if(!left.is_callable()) { if(left.is_list()) { list_callable list_call(left); @@ -235,7 +235,7 @@ private: } dot_callable callable(variables, *left.as_callable()); - return right_->evaluate(callable,fdb); + return right_->evaluate(callable,formula_debugger::add_debug_info(fdb,1,".right")); } expression_ptr left_, right_; @@ -289,8 +289,8 @@ public: private: variant execute(const formula_callable& variables, formula_debugger *fdb) const { - const variant left = left_->evaluate(variables,fdb); - const variant right = right_->evaluate(variables,fdb); + const variant left = left_->evaluate(variables,formula_debugger::add_debug_info(fdb,0,"left_OP")); + const variant right = right_->evaluate(variables,formula_debugger::add_debug_info(fdb,1,"OP_right")); switch(op_) { case AND: return left.as_bool() == false ? left : right; diff --git a/src/formula_debugger.cpp b/src/formula_debugger.cpp index f1d939491e8..b5418abd6ab 100644 --- a/src/formula_debugger.cpp +++ b/src/formula_debugger.cpp @@ -33,8 +33,41 @@ static lg::log_domain log_formula_debugger("ai/debug/formula"); namespace game_logic { +debug_info::debug_info() + : arg_number_(-1),f_name_(""),valid_(false) +{ +} + + +debug_info::debug_info(int arg_number, const char *f_name, bool valid) + : arg_number_(arg_number), f_name_(f_name), valid_(valid) +{ +} + + +debug_info::~debug_info() +{ +} + + +const char* debug_info::name() +{ + if (valid_ && (f_name_!=NULL) ) { + return f_name_; + } else { + return ""; + } +} + + +void debug_info::invalidate() +{ + valid_ = false; +} + + formula_debugger::formula_debugger() - : counter_(0) + : counter_(0), info_() { } @@ -44,12 +77,26 @@ formula_debugger::~formula_debugger() } +void msg(int counter, const char *act, const char *name, const char *formula_str, const char *to="", const char *result = "") +{ + DBG_FDB << "#" << counter << act << std::endl <<" \""<< name << "\"='" << formula_str << "' " << to << result << std::endl; +} + + +void formula_debugger::add_debug_info(int arg_number, const char *f_name) +{ + info_ = debug_info(arg_number,f_name, true); +} + + variant formula_debugger::evaluate_arg_callback(const formula_expression &expression, const formula_callable &variables) { int counter = counter_++; - DBG_FDB << "#" << counter <<": evaluating expression: " << std::endl << " \"" << expression.get_name() << "\"" << std::endl; + debug_info i = info_; + info_.invalidate(); + msg(counter," evaluating expression: ",i.name(),""); variant v = expression.execute(variables,this); //work-in-progress - DBG_FDB << "#" << counter <<": evaluated expression: " << std::endl << " \"" << expression.get_name() << "\" to " << v.to_debug_string(NULL,true) << std::endl; + msg(counter," evaluated expression: ",i.name(),""," to ",v.to_debug_string(NULL,true).c_str()); return v; } @@ -57,22 +104,24 @@ variant formula_debugger::evaluate_arg_callback(const formula_expression &expres variant formula_debugger::evaluate_formula_callback(const formula &f, const formula_callable &variables) { int counter = counter_++; - DBG_FDB << "#" << counter <<": evaluating formula "<< std::endl << " \"" << f.str() << "\"" << std::endl; + debug_info i = info_; + info_.invalidate(); + msg(counter," evaluating formula: ",i.name(),f.str().c_str()); variant v = f.execute(variables,this); //work-in-progress - DBG_FDB << "#" << counter <<": evaluated formula "<< std::endl << " \"" << f.str() << "\" to " << v.to_debug_string(NULL,true) << std::endl; + msg(counter," evaluated formula: ",i.name(),f.str().c_str()," to ",v.to_debug_string(NULL,true).c_str()); return v; - } variant formula_debugger::evaluate_formula_callback(const formula &f) { int counter = counter_++; - DBG_FDB << "#" << counter <<": evaluating formula without variables: "<add_debug_info(arg_number,f_name); + return fdb; + } + private: int counter_; + debug_info info_; }; + + } // end of namespace game_logic #endif diff --git a/src/formula_function.cpp b/src/formula_function.cpp index 137f8f0d406..022f1e19617 100644 --- a/src/formula_function.cpp +++ b/src/formula_function.cpp @@ -715,7 +715,9 @@ public: {} private: variant execute(const formula_callable& variables, formula_debugger *fdb) const { - return variant(new location_callable(map_location(args()[0]->evaluate(variables,fdb).as_int()-1, args()[1]->evaluate(variables,fdb).as_int()-1))); + return variant(new location_callable(map_location( + args()[0]->evaluate(variables,formula_debugger::add_debug_info(fdb,0,"loc:x")).as_int()-1, + args()[1]->evaluate(variables,formula_debugger::add_debug_info(fdb,1,"loc:y")).as_int()-1))); } };