#include <string>
#include <iomanip>
-std::ostringstream &Evaluator::printLocationAndIndent(std::ostringstream &os, const TokenLocation &loc, unsigned int depth) const
+DebugEvaluator::DebugEvaluator()
+{
+ using namespace std::chrono;
+ static auto start = high_resolution_clock::now();
+
+ auto now = high_resolution_clock::now();
+ auto df = now - start;
+ auto s = duration_cast<seconds>(df);
+ df -= s;
+ auto ms = duration_cast<milliseconds>(df);
+ (*tmp) << std::setw(2) << s.count() << "s " << std::setw(3) << ms.count() << "ms ";
+}
+
+DebugEvaluator::~DebugEvaluator()
+{
+ if (tmp) {
+ auto q = tmp->str();
+ DEBUG("%s", q.c_str());
+ auto v = DebugEvaluatorInterface::getCurrentInterface();
+ if (v) v->write_impl(q.c_str());
+ }
+}
+
+DebugEvaluator Evaluator::printLocationAndIndent(const TokenLocation &loc, unsigned int depth) const
{
std::string indent(static_cast<size_t>(depth), ' ');
- os << std::setw(4) << loc.lineNum() << ":" << std::setw(4) << loc.offsetNum() <<
- " debugId " << std::setw(4) << getDebugId() << " " << indent;
- return os;
+ DebugEvaluator d{};
+ d << std::setw(4) << loc.lineNum() << ":" << std::setw(4) << loc.offsetNum() <<
+ " debugId " << std::setw(4) << getDebugId() << " " << indent;
+ return std::move(d);
}
Evaluator::Evaluator(TokenLocation tokenLocation) : tokenLocation(std::move(tokenLocation))
}
};
EvaluationDepthCountManager countManager;
- if (!debugInterface) {
- try {
- return f();
- } catch (EvaluationFailure &ev) {
- ev.setLocationIfMissing(loc);
- throw;
- }
- }
std::string indent(static_cast<size_t>(evaluationDepth * 2), ' ');
try {
CallOnExit call{ [&]()
{
- debugInterface->write(indent + "leaving " + debugId);
+ DebugEvaluator{} << indent << "leaving " << debugId;
} };
- debugInterface->write(indent + "entering " + debugId);
+ DebugEvaluator{} << indent << "entering " << debugId;
return f();
} catch (EvaluationFailure &ev) {
ev.setLocationIfMissing(loc);
- debugInterface->write(indent + "exception " + debugId + " (" + ev.what() + "), leaving");
+ DebugEvaluator{} << indent << "exception " << debugId << " (" << ev.what() << "), leaving";
throw;
} catch (std::exception &ex) {
- debugInterface->write(indent + "exception " + debugId + " (" + ex.what() + "), leaving");
+ DebugEvaluator{} << indent << "exception " << debugId << " (" << ex.what() << "), leaving";
throw;
} catch (...) {
- debugInterface->write(indent + "exception " + debugId + ", leaving");
+ DebugEvaluator{} << indent << "exception " << debugId << ", leaving";
throw;
}
}
return EvaluationContext::getCurrentEvaluationContext().getVariable(location(), identifier);
}
-void IdentifierEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void IdentifierEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "identifier " << identifier << "\n";
+ printLocationAndIndent(location(), depth) << "identifier " << identifier << "\n";
}
AttributeEvaluator::AttributeEvaluator(TokenLocation tokenLocation, ExprPtr self, std::string identifier) :
return self->evaluate().attr_get(identifier);
}
-void AttributeEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void AttributeEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "attribute " << identifier << "\n";
- printLocationAndIndent(os, location(), depth) << "self is\n";
- self->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "attribute " << identifier << "\n";
+ printLocationAndIndent(location(), depth) << "self is\n";
+ self->printSelfInfo(depth + 1);
}
AttributeSetterEvaluator::AttributeSetterEvaluator(TokenLocation tokenLocation, ExprPtr self, std::string identifier, ExprPtr value) :
return self->evaluate().attr_set(identifier, std::move(val));
}
-void AttributeSetterEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void AttributeSetterEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "attribute setter " << identifier << "\n";
- printLocationAndIndent(os, location(), depth) << "self is\n";
- self->printSelfInfo(os, depth + 1);
- printLocationAndIndent(os, location(), depth) << "value to set is\n";
- value->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "attribute setter " << identifier << "\n";
+ printLocationAndIndent(location(), depth) << "self is\n";
+ self->printSelfInfo(depth + 1);
+ printLocationAndIndent(location(), depth) << "value to set is\n";
+ value->printSelfInfo(depth + 1);
}
return v;
}
-void SetterEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void SetterEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "setter " << identifier << "\n";
- printLocationAndIndent(os, location(), depth) << "value to set is\n";
- value->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "setter " << identifier << "\n";
+ printLocationAndIndent(location(), depth) << "value to set is\n";
+ value->printSelfInfo(depth + 1);
}
return EvaluationValuePoint{ static_cast<int>(xInt), static_cast<int>(yInt) };
}
-void PointEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void PointEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "point\n";
- printLocationAndIndent(os, location(), depth) << "x is\n";
- x->printSelfInfo(os, depth + 1);
- printLocationAndIndent(os, location(), depth) << "y is\n";
- y->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "point\n";
+ printLocationAndIndent(location(), depth) << "x is\n";
+ x->printSelfInfo(depth + 1);
+ printLocationAndIndent(location(), depth) << "y is\n";
+ y->printSelfInfo(depth + 1);
}
return value;
}
-void IntegerEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void IntegerEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "integer " << value << "\n";
+ printLocationAndIndent(location(), depth) << "integer " << value << "\n";
}
return value;
}
-void DoubleEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void DoubleEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "double " << value << "\n";
+ printLocationAndIndent(location(), depth) << "double " << value << "\n";
}
return value;
}
-void StringEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void StringEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "string '" << value << "'\n";
+ printLocationAndIndent(location(), depth) << "string '" << value << "'\n";
}
return std::move(tmp);
}
-void ArraySetDictEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void ArraySetDictEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth);
- switch (kind) {
- case Kind::SET:
- os << "set\n";
- break;
- case Kind::VECTOR:
- os << "vector\n";
- break;
- case Kind::DICT:
- os << "dict\n";
- break;
+ {
+ auto os = printLocationAndIndent(location(), depth);
+ switch (kind) {
+ case Kind::SET:
+ os << "set\n";
+ break;
+ case Kind::VECTOR:
+ os << "vector\n";
+ break;
+ case Kind::DICT:
+ os << "dict\n";
+ break;
+ }
}
if (kind == Kind::SET || kind == Kind::VECTOR) {
for (auto i = 0u; i < values.size(); ++i) {
- printLocationAndIndent(os, location(), depth) << "element " << (i + 1) << "\n";
- values[i]->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "element " << (i + 1) << "\n";
+ values[i]->printSelfInfo(depth + 1);
}
} else {
for (auto i = 0u; i < values.size(); i += 2) {
- printLocationAndIndent(os, location(), depth) << "element " << (i / 2 + 1) << " key\n";
- values[i]->printSelfInfo(os, depth + 1);
- printLocationAndIndent(os, location(), depth) << "element " << (i / 2 + 1) << " value\n";
- values[i + 1]->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "element " << (i / 2 + 1) << " key\n";
+ values[i]->printSelfInfo(depth + 1);
+ printLocationAndIndent(location(), depth) << "element " << (i / 2 + 1) << " value\n";
+ values[i + 1]->printSelfInfo(depth + 1);
}
}
}
throw EvaluationFailure{} << "unknown operator";
}
-void OperatorEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void OperatorEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "operator ";
- const char *desc = nullptr;
- switch (kind) {
- case Kind::IN:
- desc = "in";
- break;
- case Kind::NOT:
- desc = "not";
- break;
- case Kind::MINUS:
- desc = "-";
- break;
- case Kind::GET:
- desc = "[]";
- break;
- case Kind::SET:
- desc = "[]=";
- break;
- }
+ {
+ auto os = printLocationAndIndent(location(), depth);
+ os << "operator ";
+ const char *desc = nullptr;
+ switch (kind) {
+ case Kind::IN:
+ desc = "in";
+ break;
+ case Kind::NOT:
+ desc = "not";
+ break;
+ case Kind::MINUS:
+ desc = "-";
+ break;
+ case Kind::GET:
+ desc = "[]";
+ break;
+ case Kind::SET:
+ desc = "[]=";
+ break;
+ }
- os << desc << "\n";
+ os << desc << "\n";
+ }
for (auto i = 0u; i < args.size(); ++i) {
- printLocationAndIndent(os, location(), depth) << "element " << (i + 1) << " key\n";
- args[i]->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "element " << (i + 1) << " key\n";
+ args[i]->printSelfInfo(depth + 1);
}
}
return true;
}
-void CompOperatorEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void CompOperatorEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "operators";
- for (auto k : kinds) {
- const char *desc = nullptr;
- switch (k) {
- case Kind::EQ:
- desc = "==";
- break;
- case Kind::NE:
- desc = "!=";
- break;
- case Kind::GT:
- desc = ">";
- break;
- case Kind::LT:
- desc = "<";
- break;
- case Kind::GE:
- desc = ">=";
- break;
- case Kind::LE:
- desc = "<=";
- break;
+ {
+ auto os = printLocationAndIndent(location(), depth);
+ os << "operators";
+ for (auto k : kinds) {
+ const char *desc = nullptr;
+ switch (k) {
+ case Kind::EQ:
+ desc = "==";
+ break;
+ case Kind::NE:
+ desc = "!=";
+ break;
+ case Kind::GT:
+ desc = ">";
+ break;
+ case Kind::LT:
+ desc = "<";
+ break;
+ case Kind::GE:
+ desc = ">=";
+ break;
+ case Kind::LE:
+ desc = "<=";
+ break;
+ }
+ os << " " << desc;
}
- os << " " << desc;
}
- os << "\n";
for (auto i = 0u; i < args.size(); ++i) {
- printLocationAndIndent(os, location(), depth) << "argument " << (i + 1) << " key\n";
- args[i]->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "argument " << (i + 1) << " key\n";
+ args[i]->printSelfInfo(depth + 1);
}
}
return value;
}
-void BooleanEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void BooleanEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "boolean " << (value ? "true" : "false") << "\n";
+ printLocationAndIndent(location(), depth) << "boolean " << (value ? "true" : "false") << "\n";
}
return std::move(result);
}
-void CallEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void CallEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "function call\n";
- function->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "function call\n";
+ function->printSelfInfo(depth + 1);
for (auto i = 0u; i < args.size(); ++i) {
- printLocationAndIndent(os, location(), depth) << "arg " << i << " is\n";
- args[i]->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "arg " << i << " is\n";
+ args[i]->printSelfInfo(depth + 1);
}
}
}
try
{
+ DebugEvaluator{} << getDebugId() << ": function is called, evaluating";
codeBlock->evaluate();
} catch (ReturnValue &r)
{
+ DebugEvaluator{} << getDebugId() << ": got return value " << r.getResult();
return r.getResult();
}
return {};
}});
}
-void FunctionEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void FunctionEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "function definition " << functionName << "\n";
+ printLocationAndIndent(location(), depth) << "function definition " << functionName << "\n";
for (auto i = 0u; i < argNames.size(); ++i) {
- printLocationAndIndent(os, location(), depth) << "arg " << i << " is " << argNames[i] << "\n";
+ printLocationAndIndent(location(), depth) << "arg " << i << " is " << argNames[i] << "\n";
}
- printLocationAndIndent(os, location(), depth) << "body\n";
- codeBlock->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "body\n";
+ codeBlock->printSelfInfo(depth + 1);
}
ReturnEvaluator::ReturnEvaluator(TokenLocation location_, ExprPtr result):
void ReturnEvaluator::evaluateImpl() const
{
auto v = result ? result->evaluate() : EvaluationValue{};
+ DebugEvaluator{} << getDebugId() << ": returninng " << v;
throw ReturnValue{v};
}
-void ReturnEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void ReturnEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "return ";
- result->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "return ";
+ result->printSelfInfo(depth + 1);
}
throw EvaluationFailure{} << "unsatisfied wait object is going out of scope, didn't you forget to apply -> to it";
}
-void ExpressionAsStatementEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void ExpressionAsStatementEvaluator::printSelfInfo(unsigned int depth) const
{
- expr->printSelfInfo(os, depth);
+ expr->printSelfInfo(depth);
}
b->evaluate();
}
-void BlockEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void BlockEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "block\n";
+ printLocationAndIndent(location(), depth) << "block\n";
for (auto &e : evals)
- e->printSelfInfo(os, depth + 1);
+ e->printSelfInfo(depth + 1);
}
auto r = w->evaluate();
waitsValues.push_back(r.convertToWait());
}
- if (debugInterface) debugInterface->write("evaluating main block of wait clause");
+ DebugEvaluator{} << getDebugId() << ": executing main block of wait clause";
exec->evaluate();
- if (debugInterface) debugInterface->write("joining waiters");
- for (auto &w : waitsValues) {
+ DebugEvaluator{} << getDebugId() << ": joining waiters (" << waits.size() << ")";
+ for (auto i = 0u; i < waits.size(); ++i) {
+ DebugEvaluator{} << getDebugId() << ": joining waiter " << i << " from " << waits[i]->getDebugId();
+ auto &w = waitsValues[i];
w.asWait()->join();
}
+ DebugEvaluator{} << getDebugId() << ": done";
}
-void WaitEvaluator::printSelfInfo(std::ostringstream &os, unsigned int depth) const
+void WaitEvaluator::printSelfInfo(unsigned int depth) const
{
- printLocationAndIndent(os, location(), depth) << "wait\n";
- exec->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "wait\n";
+ exec->printSelfInfo(depth + 1);
for (auto &w : waits) {
- printLocationAndIndent(os, location(), depth) << "for\n";
- w->printSelfInfo(os, depth + 1);
+ printLocationAndIndent(location(), depth) << "for\n";
+ w->printSelfInfo(depth + 1);
}
}
#include <vector>
#include <unordered_map>
#include <sstream>
+#include <chrono>
+#include <iomanip>
class EvaluationValue;
+class DebugEvaluator;
/**
* @brief Class for printing debug information, when evaluation batch
*/
struct DebugEvaluatorInterface {
- /**
- * @brief Single line of debug text, without end of line character
- */
- virtual void write(const std::string &txt) = 0;
+ friend class DebugEvaluator;
/**
* @brief Sets current debug interface.
*/
static void setCurrentInterface(std::unique_ptr<DebugEvaluatorInterface> inf = {});
static DebugEvaluatorInterface *getCurrentInterface();
+private:
+ /**
+ * @brief Single line of debug text, without end of line character
+ */
+ virtual void write_impl(const std::string &txt) = 0;
};
class DebugEvaluator
{
- std::ostringstream tmp;
+ std::unique_ptr<std::ostringstream> tmp{ new std::ostringstream{} };
public:
- DebugEvaluator() = default;
- ~DebugEvaluator()
- {
- auto v = DebugEvaluatorInterface::getCurrentInterface();
- if (v) v->write(tmp.str());
- }
+ DebugEvaluator();
+ DebugEvaluator(DebugEvaluator &&) = default;
+ DebugEvaluator &operator = (DebugEvaluator &&) = default;
+ ~DebugEvaluator();
template <typename T> DebugEvaluator &operator << (T &&t)
{
- tmp << std::forward<T>(t);
+ (*tmp) << std::forward<T>(t);
return *this;
}
};
/**
* @brief Implementation of DebugEvaluatorInterface streaming in/out messages to stream
*/
-template <typename T> struct StreamDebugEvaluatorInterface : public DebugEvaluatorInterface {
+struct StreamDebugEvaluatorInterface : public DebugEvaluatorInterface {
public:
- StreamDebugEvaluatorInterface(T &stream) : stream(stream) { }
+ StreamDebugEvaluatorInterface(std::ostream &stream) : stream(stream) { }
- void write(const std::string &txt) override
+ void write_impl(const std::string &txt) override
{
stream << txt << "\n";
}
private:
- T &stream;
+ std::ostream &stream;
};
/**
/**
* @brief Virtual debug function, which will print contents of this element and all it's children
*/
- virtual void printSelfInfo(std::ostringstream &os, unsigned int depth) const = 0;
+ virtual void printSelfInfo(unsigned int depth) const = 0;
/**
* @brief Returns unique identifier for this object, for debug purposes
*
* End of line (\n) isn't appended. Debug id is added.
*/
- std::ostringstream &printLocationAndIndent(std::ostringstream &os, const TokenLocation &loc, unsigned int depth) const;
+ DebugEvaluator printLocationAndIndent(const TokenLocation &loc, unsigned int depth) const;
};
/**
public:
IdentifierEvaluator(TokenLocation location_, std::string identifier);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
public:
AttributeEvaluator(TokenLocation location_, ExprPtr self, std::string identifier);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
public:
AttributeSetterEvaluator(TokenLocation location_, ExprPtr self, std::string identifier, ExprPtr value);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
public:
SetterEvaluator(TokenLocation location_, std::string identifier, ExprPtr value);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
public:
PointEvaluator(TokenLocation location_, ExprPtr x, ExprPtr y);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
public:
IntegerEvaluator(TokenLocation location_, int64_t value);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
public:
DoubleEvaluator(TokenLocation location_, double value);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
public:
BooleanEvaluator(TokenLocation location_, bool value);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
public:
StringEvaluator(TokenLocation location_, std::string value);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
};
ArraySetDictEvaluator(TokenLocation location_, ExprPtrs values, Kind kind);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
private:
ExprPtrs values;
Kind kind;
public:
CallEvaluator(TokenLocation location_, ExprPtr function, ExprPtrs args, ExprMapPtrs keywordArgs);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
};
OperatorEvaluator(TokenLocation location_, ExprPtrs args, Kind kind);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
private:
ExprPtrs args;
Kind kind;
};
CompOperatorEvaluator(TokenLocation location_, ExprPtrs args, std::vector<Kind> kinds, std::vector<TokenLocation> locations);
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
private:
ExprPtrs args;
std::vector<Kind> kinds;
ExpressionAsStatementEvaluator(TokenLocation location_, ExprPtr expr);
void evaluateImpl() const override;
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
BlockEvaluator(TokenLocation location_, StatPtrs evals);
void evaluateImpl() const override;
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
WaitEvaluator(TokenLocation location_, StatPtr exec, ExprPtrs waits);
void evaluateImpl() const override;
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
FunctionEvaluator(TokenLocation location_, std::string functionName, std::vector<std::string> argNames, StatPtr codeBlock);
protected:
void evaluateImpl() const override;
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
/**
ReturnEvaluator(TokenLocation location_, ExprPtr result);
protected:
void evaluateImpl() const override;
- void printSelfInfo(std::ostringstream &os, unsigned int depth) const override;
+ void printSelfInfo(unsigned int depth) const override;
};
#endif