added additional debug info to some formula functions, as a test of concept

This commit is contained in:
Iurii Chernyi 2009-08-11 20:17:49 +00:00
parent 423667731a
commit 040009ace8
5 changed files with 103 additions and 19 deletions

View File

@ -94,8 +94,8 @@ public:
private:
variant execute(const formula_callable& variables, formula_debugger *fdb) const {
const map_location loc = convert_variant<location_callable>(args()[0]->evaluate(variables,fdb))->loc();
variant items = args()[1]->evaluate(variables,fdb);
const map_location loc = convert_variant<location_callable>(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<location_callable>(args()[0]->evaluate(variables,fdb))->loc();
const map_location loc = convert_variant<location_callable>(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<variant> vars;
if(res.is_null()) {
return variant(&vars);

View File

@ -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<variant> res;
std::vector<std::string> function_names = builtin_function_names();
std::vector<std::string> 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;

View File

@ -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: "<<std::endl<<" \"" << f.str() << "\"" << std::endl;
debug_info i = info_;
info_.invalidate();
msg(counter," evaluating formula without variables: ",i.name(),f.str().c_str());
variant v = f.execute(this); //work-in-progress
DBG_FDB << "#" << counter <<": evaluated formula without variables: "<<std::endl<<" \"" << f.str() << "\" to " << v.to_debug_string(NULL,true) << std::endl;
msg(counter," evaluating formula without variables: ",i.name(),f.str().c_str(),v.to_debug_string(NULL,true).c_str());
return v;
}

View File

@ -32,21 +32,54 @@ class formula_expression;
class formula_callable;
class formula;
class debug_info {
public:
debug_info();
debug_info(int arg_number, const char *f_name, bool valid);
virtual ~debug_info();
const char* name();
void invalidate();
private:
int arg_number_;
const char *f_name_;
bool valid_;
};
class formula_debugger {
public:
formula_debugger();
virtual ~formula_debugger();
virtual void add_debug_info(int arg_number, const char *f_name);
virtual variant evaluate_arg_callback(const formula_expression &expression, const formula_callable &variables);
virtual variant evaluate_formula_callback(const formula &f, const formula_callable &variables);
virtual variant evaluate_formula_callback(const formula &f);
static formula_debugger* add_debug_info(formula_debugger *fdb, int arg_number, const char *f_name)
{
if (fdb==NULL) {
return NULL;
}
fdb->add_debug_info(arg_number,f_name);
return fdb;
}
private:
int counter_;
debug_info info_;
};
} // end of namespace game_logic
#endif

View File

@ -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)));
}
};